diff --git a/Cargo.lock b/Cargo.lock
index 12090c7da99d5678e43c2ec00fc5e762622deffc..a6f92205fdf177f0e03db4e00307c38defb56ada 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -7560,9 +7560,6 @@ name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-dependencies = [
- "unicode-segmentation",
-]
[[package]]
name = "heck"
@@ -15051,13 +15048,6 @@ version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
-[[package]]
-name = "slash_commands_example"
-version = "0.1.0"
-dependencies = [
- "zed_extension_api 0.1.0",
-]
-
[[package]]
name = "slotmap"
version = "1.0.7"
@@ -18382,15 +18372,6 @@ dependencies = [
"unicode-ident",
]
-[[package]]
-name = "wasm-encoder"
-version = "0.201.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9c7d2731df60006819b013f64ccc2019691deccf6e11a1804bc850cd6748f1a"
-dependencies = [
- "leb128",
-]
-
[[package]]
name = "wasm-encoder"
version = "0.221.3"
@@ -18411,22 +18392,6 @@ dependencies = [
"wasmparser 0.227.1",
]
-[[package]]
-name = "wasm-metadata"
-version = "0.201.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fd83062c17b9f4985d438603cde0a5e8c5c8198201a6937f778b607924c7da2"
-dependencies = [
- "anyhow",
- "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
- "wasm-encoder 0.201.0",
- "wasmparser 0.201.0",
-]
-
[[package]]
name = "wasm-metadata"
version = "0.227.1"
@@ -18459,17 +18424,6 @@ dependencies = [
"web-sys",
]
-[[package]]
-name = "wasmparser"
-version = "0.201.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84e5df6dba6c0d7fafc63a450f1738451ed7a0b52295d83e868218fa286bf708"
-dependencies = [
- "bitflags 2.9.4",
- "indexmap",
- "semver",
-]
-
[[package]]
name = "wasmparser"
version = "0.221.3"
@@ -19864,25 +19818,14 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "wit-bindgen"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "288f992ea30e6b5c531b52cdd5f3be81c148554b09ea416f058d16556ba92c27"
-dependencies = [
- "bitflags 2.9.4",
- "wit-bindgen-rt 0.22.0",
- "wit-bindgen-rust-macro 0.22.0",
-]
-
[[package]]
name = "wit-bindgen"
version = "0.41.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de"
dependencies = [
- "wit-bindgen-rt 0.41.0",
- "wit-bindgen-rust-macro 0.41.0",
+ "wit-bindgen-rt",
+ "wit-bindgen-rust-macro",
]
[[package]]
@@ -19891,16 +19834,6 @@ version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
-[[package]]
-name = "wit-bindgen-core"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e85e72719ffbccf279359ad071497e47eb0675fe22106dea4ed2d8a7fcb60ba4"
-dependencies = [
- "anyhow",
- "wit-parser 0.201.0",
-]
-
[[package]]
name = "wit-bindgen-core"
version = "0.41.0"
@@ -19912,12 +19845,6 @@ dependencies = [
"wit-parser 0.227.1",
]
-[[package]]
-name = "wit-bindgen-rt"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb8738270f32a2d6739973cbbb7c1b6dd8959ce515578a6e19165853272ee64"
-
[[package]]
name = "wit-bindgen-rt"
version = "0.41.0"
@@ -19929,20 +19856,6 @@ dependencies = [
"once_cell",
]
-[[package]]
-name = "wit-bindgen-rust"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8a39a15d1ae2077688213611209849cad40e9e5cccf6e61951a425850677ff3"
-dependencies = [
- "anyhow",
- "heck 0.4.1",
- "indexmap",
- "wasm-metadata 0.201.0",
- "wit-bindgen-core 0.22.0",
- "wit-component 0.201.0",
-]
-
[[package]]
name = "wit-bindgen-rust"
version = "0.41.0"
@@ -19954,23 +19867,9 @@ dependencies = [
"indexmap",
"prettyplease",
"syn 2.0.106",
- "wasm-metadata 0.227.1",
- "wit-bindgen-core 0.41.0",
- "wit-component 0.227.1",
-]
-
-[[package]]
-name = "wit-bindgen-rust-macro"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d376d3ae5850526dfd00d937faea0d81a06fa18f7ac1e26f386d760f241a8f4b"
-dependencies = [
- "anyhow",
- "proc-macro2",
- "quote",
- "syn 2.0.106",
- "wit-bindgen-core 0.22.0",
- "wit-bindgen-rust 0.22.0",
+ "wasm-metadata",
+ "wit-bindgen-core",
+ "wit-component",
]
[[package]]
@@ -19984,27 +19883,8 @@ dependencies = [
"proc-macro2",
"quote",
"syn 2.0.106",
- "wit-bindgen-core 0.41.0",
- "wit-bindgen-rust 0.41.0",
-]
-
-[[package]]
-name = "wit-component"
-version = "0.201.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "421c0c848a0660a8c22e2fd217929a0191f14476b68962afd2af89fd22e39825"
-dependencies = [
- "anyhow",
- "bitflags 2.9.4",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "wasm-encoder 0.201.0",
- "wasm-metadata 0.201.0",
- "wasmparser 0.201.0",
- "wit-parser 0.201.0",
+ "wit-bindgen-core",
+ "wit-bindgen-rust",
]
[[package]]
@@ -20021,29 +19901,11 @@ dependencies = [
"serde_derive",
"serde_json",
"wasm-encoder 0.227.1",
- "wasm-metadata 0.227.1",
+ "wasm-metadata",
"wasmparser 0.227.1",
"wit-parser 0.227.1",
]
-[[package]]
-name = "wit-parser"
-version = "0.201.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "196d3ecfc4b759a8573bf86a9b3f8996b304b3732e4c7de81655f875f6efdca6"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser 0.201.0",
-]
-
[[package]]
name = "wit-parser"
version = "0.221.3"
@@ -20797,28 +20659,6 @@ dependencies = [
"gpui",
]
-[[package]]
-name = "zed_extension_api"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "594fd10dd0f2f853eb243e2425e7c95938cef49adb81d9602921d002c5e6d9d9"
-dependencies = [
- "serde",
- "serde_json",
- "wit-bindgen 0.22.0",
-]
-
-[[package]]
-name = "zed_extension_api"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0"
-dependencies = [
- "serde",
- "serde_json",
- "wit-bindgen 0.41.0",
-]
-
[[package]]
name = "zed_extension_api"
version = "0.8.0"
@@ -20828,34 +20668,6 @@ dependencies = [
"wit-bindgen 0.41.0",
]
-[[package]]
-name = "zed_glsl"
-version = "0.1.0"
-dependencies = [
- "zed_extension_api 0.1.0",
-]
-
-[[package]]
-name = "zed_html"
-version = "0.3.0"
-dependencies = [
- "zed_extension_api 0.7.0",
-]
-
-[[package]]
-name = "zed_proto"
-version = "0.3.0"
-dependencies = [
- "zed_extension_api 0.7.0",
-]
-
-[[package]]
-name = "zed_test_extension"
-version = "0.1.0"
-dependencies = [
- "zed_extension_api 0.8.0",
-]
-
[[package]]
name = "zeno"
version = "0.3.3"
diff --git a/Cargo.toml b/Cargo.toml
index 903d17fc3378519d3e632f63c1a1a0e08e6513cb..76f52fa6b63047d0a490c15679195dab9c2736fd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -208,16 +208,6 @@ members = [
"crates/ztracing",
"crates/ztracing_macro",
- #
- # Extensions
- #
-
- "extensions/glsl",
- "extensions/html",
- "extensions/proto",
- "extensions/slash-commands-example",
- "extensions/test-extension",
-
#
# Tooling
#
diff --git a/assets/settings/default.json b/assets/settings/default.json
index 39a5f26b6201ad4a0b765c2f19b387fd4fc9c855..2912d4ce4aa5c2ac11660b71d542572c7f03f3a7 100644
--- a/assets/settings/default.json
+++ b/assets/settings/default.json
@@ -1728,12 +1728,7 @@
// If you don't want any of these extensions, add this field to your settings
// and change the value to `false`.
"auto_install_extensions": {
- "html": true,
- "copilot-chat": true,
- "anthropic": true,
"google-ai": true,
- "openai": true,
- "openrouter": true,
},
// The capabilities granted to extensions.
//
diff --git a/extensions/anthropic/Cargo.lock b/extensions/anthropic/Cargo.lock
deleted file mode 100644
index 8bd00ffdbe329273c2731d58f6f6b56f9a6d529a..0000000000000000000000000000000000000000
--- a/extensions/anthropic/Cargo.lock
+++ /dev/null
@@ -1,823 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "adler2"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
-
-[[package]]
-name = "anthropic"
-version = "0.1.0"
-dependencies = [
- "serde",
- "serde_json",
- "zed_extension_api",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.100"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
-
-[[package]]
-name = "auditable-serde"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5"
-dependencies = [
- "semver",
- "serde",
- "serde_json",
- "topological-sort",
-]
-
-[[package]]
-name = "bitflags"
-version = "2.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
-
-[[package]]
-name = "crc32fast"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "displaydoc"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "equivalent"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
-
-[[package]]
-name = "flate2"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
-]
-
-[[package]]
-name = "foldhash"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
-
-[[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 = "futures"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
-
-[[package]]
-name = "futures-task"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
-
-[[package]]
-name = "futures-util"
-version = "0.3.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.15.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
-dependencies = [
- "foldhash",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "icu_collections"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
-dependencies = [
- "displaydoc",
- "potential_utf",
- "yoke",
- "zerofrom",
- "zerovec",
-]
-
-[[package]]
-name = "icu_locale_core"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
-dependencies = [
- "displaydoc",
- "litemap",
- "tinystr",
- "writeable",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
-dependencies = [
- "icu_collections",
- "icu_normalizer_data",
- "icu_properties",
- "icu_provider",
- "smallvec",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer_data"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
-
-[[package]]
-name = "icu_properties"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
-dependencies = [
- "icu_collections",
- "icu_locale_core",
- "icu_properties_data",
- "icu_provider",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "icu_properties_data"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
-
-[[package]]
-name = "icu_provider"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
-dependencies = [
- "displaydoc",
- "icu_locale_core",
- "writeable",
- "yoke",
- "zerofrom",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "id-arena"
-version = "2.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
-
-[[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.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
-dependencies = [
- "icu_normalizer",
- "icu_properties",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
-dependencies = [
- "equivalent",
- "hashbrown 0.16.1",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
-
-[[package]]
-name = "leb128fmt"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
-
-[[package]]
-name = "litemap"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
-
-[[package]]
-name = "log"
-version = "0.4.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
-
-[[package]]
-name = "memchr"
-version = "2.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
-dependencies = [
- "adler2",
- "simd-adler32",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.21.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-
-[[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.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "potential_utf"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
-dependencies = [
- "zerovec",
-]
-
-[[package]]
-name = "prettyplease"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
-dependencies = [
- "proc-macro2",
- "syn",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.103"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
-
-[[package]]
-name = "semver"
-version = "1.0.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
-dependencies = [
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.145"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
-dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
- "serde_core",
-]
-
-[[package]]
-name = "simd-adler32"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
-
-[[package]]
-name = "slab"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[package]]
-name = "spdx"
-version = "0.10.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3"
-dependencies = [
- "smallvec",
-]
-
-[[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.111"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tinystr"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
-[[package]]
-name = "topological-sort"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
-name = "url"
-version = "2.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
-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 = "wasm-encoder"
-version = "0.227.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822"
-dependencies = [
- "leb128fmt",
- "wasmparser",
-]
-
-[[package]]
-name = "wasm-metadata"
-version = "0.227.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d"
-dependencies = [
- "anyhow",
- "auditable-serde",
- "flate2",
- "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
- "url",
- "wasm-encoder",
- "wasmparser",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.227.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2"
-dependencies = [
- "bitflags",
- "hashbrown 0.15.5",
- "indexmap",
- "semver",
-]
-
-[[package]]
-name = "wit-bindgen"
-version = "0.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de"
-dependencies = [
- "wit-bindgen-rt",
- "wit-bindgen-rust-macro",
-]
-
-[[package]]
-name = "wit-bindgen-core"
-version = "0.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b"
-dependencies = [
- "anyhow",
- "heck",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-bindgen-rt"
-version = "0.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621"
-dependencies = [
- "bitflags",
- "futures",
- "once_cell",
-]
-
-[[package]]
-name = "wit-bindgen-rust"
-version = "0.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce"
-dependencies = [
- "anyhow",
- "heck",
- "indexmap",
- "prettyplease",
- "syn",
- "wasm-metadata",
- "wit-bindgen-core",
- "wit-component",
-]
-
-[[package]]
-name = "wit-bindgen-rust-macro"
-version = "0.41.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799"
-dependencies = [
- "anyhow",
- "prettyplease",
- "proc-macro2",
- "quote",
- "syn",
- "wit-bindgen-core",
- "wit-bindgen-rust",
-]
-
-[[package]]
-name = "wit-component"
-version = "0.227.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676"
-dependencies = [
- "anyhow",
- "bitflags",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "wasm-encoder",
- "wasm-metadata",
- "wasmparser",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-parser"
-version = "0.227.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser",
-]
-
-[[package]]
-name = "writeable"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
-
-[[package]]
-name = "yoke"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
-dependencies = [
- "stable_deref_trait",
- "yoke-derive",
- "zerofrom",
-]
-
-[[package]]
-name = "yoke-derive"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
-
-[[package]]
-name = "zed_extension_api"
-version = "0.8.0"
-dependencies = [
- "serde",
- "serde_json",
- "wit-bindgen",
-]
-
-[[package]]
-name = "zerofrom"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
-dependencies = [
- "zerofrom-derive",
-]
-
-[[package]]
-name = "zerofrom-derive"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
-
-[[package]]
-name = "zerotrie"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
-dependencies = [
- "displaydoc",
- "yoke",
- "zerofrom",
-]
-
-[[package]]
-name = "zerovec"
-version = "0.11.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
-dependencies = [
- "yoke",
- "zerofrom",
- "zerovec-derive",
-]
-
-[[package]]
-name = "zerovec-derive"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
diff --git a/extensions/anthropic/Cargo.toml b/extensions/anthropic/Cargo.toml
deleted file mode 100644
index 25dfe72b0e92ca10a2537be2d5f94173a2921acf..0000000000000000000000000000000000000000
--- a/extensions/anthropic/Cargo.toml
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]
-name = "anthropic"
-version = "0.1.0"
-edition = "2021"
-publish = false
-license = "Apache-2.0"
-
-[workspace]
-
-[lib]
-path = "src/anthropic.rs"
-crate-type = ["cdylib"]
-
-[dependencies]
-zed_extension_api = { path = "../../crates/extension_api" }
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
diff --git a/extensions/anthropic/LICENSE-APACHE b/extensions/anthropic/LICENSE-APACHE
deleted file mode 120000
index 1cd601d0a3affae83854be02a0afdec3b7a9ec4d..0000000000000000000000000000000000000000
--- a/extensions/anthropic/LICENSE-APACHE
+++ /dev/null
@@ -1 +0,0 @@
-../../LICENSE-APACHE
\ No newline at end of file
diff --git a/extensions/anthropic/extension.toml b/extensions/anthropic/extension.toml
deleted file mode 100644
index 3e8b2b32e3f0c38ba7eafded3f9aa756288df693..0000000000000000000000000000000000000000
--- a/extensions/anthropic/extension.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-id = "anthropic"
-name = "Anthropic"
-description = "Anthropic Claude LLM provider for Zed."
-version = "0.1.0"
-schema_version = 1
-authors = ["Zed Team"]
-repository = "https://github.com/zed-industries/zed"
-
-[language_model_providers.anthropic]
-name = "Anthropic"
-
-[language_model_providers.anthropic.auth]
-env_vars = ["ANTHROPIC_API_KEY"]
diff --git a/extensions/anthropic/icons/anthropic.svg b/extensions/anthropic/icons/anthropic.svg
deleted file mode 100644
index 75c1a7e0014e7dd7bbd573d44fe6854e0c0760a3..0000000000000000000000000000000000000000
--- a/extensions/anthropic/icons/anthropic.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/extensions/anthropic/src/anthropic.rs b/extensions/anthropic/src/anthropic.rs
deleted file mode 100644
index 385f4ae44999bec785d50b23495186c71cd78e7b..0000000000000000000000000000000000000000
--- a/extensions/anthropic/src/anthropic.rs
+++ /dev/null
@@ -1,1129 +0,0 @@
-use std::collections::HashMap;
-use std::sync::Mutex;
-
-use serde::{Deserialize, Serialize};
-use zed_extension_api::http_client::{HttpMethod, HttpRequest, HttpResponseStream, RedirectPolicy};
-use zed_extension_api::{self as zed, *};
-
-struct AnthropicProvider {
- streams: Mutex>,
- next_stream_id: Mutex,
-}
-
-struct StreamState {
- response_stream: Option,
- buffer: String,
- started: bool,
- current_tool_use: Option,
- stop_reason: Option,
- pending_signature: Option,
-}
-
-struct ToolUseState {
- id: String,
- name: String,
- input_json: String,
-}
-
-struct ModelDefinition {
- real_id: &'static str,
- display_name: &'static str,
- max_tokens: u64,
- max_output_tokens: u64,
- supports_images: bool,
- supports_thinking: bool,
- is_default: bool,
- is_default_fast: bool,
- beta_headers: Option<&'static str>,
- supports_caching: bool,
-}
-
-const MODELS: &[ModelDefinition] = &[
- // Claude Opus 4.5
- ModelDefinition {
- real_id: "claude-opus-4-5-20251101",
- display_name: "Claude Opus 4.5",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-opus-4-5-20251101",
- display_name: "Claude Opus 4.5 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- // Claude Opus 4.1
- ModelDefinition {
- real_id: "claude-opus-4-1-20250805",
- display_name: "Claude Opus 4.1",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-opus-4-1-20250805",
- display_name: "Claude Opus 4.1 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- // Claude Opus 4
- ModelDefinition {
- real_id: "claude-opus-4-20250514",
- display_name: "Claude Opus 4",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-opus-4-20250514",
- display_name: "Claude Opus 4 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- // Claude Sonnet 4.5
- ModelDefinition {
- real_id: "claude-sonnet-4-5-20250929",
- display_name: "Claude Sonnet 4.5",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: true,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-sonnet-4-5-20250929",
- display_name: "Claude Sonnet 4.5 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- // Claude Sonnet 4
- ModelDefinition {
- real_id: "claude-sonnet-4-20250514",
- display_name: "Claude Sonnet 4",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-sonnet-4-20250514",
- display_name: "Claude Sonnet 4 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some("fine-grained-tool-streaming-2025-05-14"),
- supports_caching: true,
- },
- // Claude 3.7 Sonnet
- ModelDefinition {
- real_id: "claude-3-7-sonnet-latest",
- display_name: "Claude 3.7 Sonnet",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some(
- "token-efficient-tools-2025-02-19,fine-grained-tool-streaming-2025-05-14",
- ),
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-3-7-sonnet-latest",
- display_name: "Claude 3.7 Sonnet Thinking",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: Some(
- "token-efficient-tools-2025-02-19,fine-grained-tool-streaming-2025-05-14",
- ),
- supports_caching: true,
- },
- // Claude 3.5 Sonnet
- ModelDefinition {
- real_id: "claude-3-5-sonnet-latest",
- display_name: "Claude 3.5 Sonnet",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: true,
- },
- // Claude Haiku 4.5
- ModelDefinition {
- real_id: "claude-haiku-4-5-20251001",
- display_name: "Claude Haiku 4.5",
- max_tokens: 200_000,
- max_output_tokens: 64_000,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: true,
- beta_headers: None,
- supports_caching: true,
- },
- ModelDefinition {
- real_id: "claude-haiku-4-5-20251001",
- display_name: "Claude Haiku 4.5 Thinking",
- max_tokens: 200_000,
- max_output_tokens: 64_000,
- supports_images: true,
- supports_thinking: true,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: true,
- },
- // Claude 3.5 Haiku
- ModelDefinition {
- real_id: "claude-3-5-haiku-latest",
- display_name: "Claude 3.5 Haiku",
- max_tokens: 200_000,
- max_output_tokens: 8_192,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: true,
- },
- // Claude 3 Opus
- ModelDefinition {
- real_id: "claude-3-opus-latest",
- display_name: "Claude 3 Opus",
- max_tokens: 200_000,
- max_output_tokens: 4_096,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: false,
- },
- // Claude 3 Sonnet
- ModelDefinition {
- real_id: "claude-3-sonnet-20240229",
- display_name: "Claude 3 Sonnet",
- max_tokens: 200_000,
- max_output_tokens: 4_096,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: false,
- },
- // Claude 3 Haiku
- ModelDefinition {
- real_id: "claude-3-haiku-20240307",
- display_name: "Claude 3 Haiku",
- max_tokens: 200_000,
- max_output_tokens: 4_096,
- supports_images: true,
- supports_thinking: false,
- is_default: false,
- is_default_fast: false,
- beta_headers: None,
- supports_caching: true,
- },
-];
-
-fn get_model_definition(display_name: &str) -> Option<&'static ModelDefinition> {
- MODELS.iter().find(|m| m.display_name == display_name)
-}
-
-// Anthropic API Request Types
-
-#[derive(Serialize, Clone)]
-struct CacheControl {
- #[serde(rename = "type")]
- cache_type: &'static str,
-}
-
-const EPHEMERAL_CACHE: CacheControl = CacheControl {
- cache_type: "ephemeral",
-};
-
-#[derive(Serialize)]
-struct AnthropicRequest {
- model: String,
- max_tokens: u64,
- messages: Vec,
- #[serde(skip_serializing_if = "Option::is_none")]
- system: Option,
- #[serde(skip_serializing_if = "Option::is_none")]
- thinking: Option,
- #[serde(skip_serializing_if = "Vec::is_empty")]
- tools: Vec,
- #[serde(skip_serializing_if = "Option::is_none")]
- tool_choice: Option,
- #[serde(skip_serializing_if = "Vec::is_empty")]
- stop_sequences: Vec,
- #[serde(skip_serializing_if = "Option::is_none")]
- temperature: Option,
- stream: bool,
-}
-
-#[derive(Serialize)]
-#[serde(untagged)]
-enum AnthropicSystemContent {
- String(String),
- Blocks(Vec),
-}
-
-#[derive(Serialize)]
-struct AnthropicSystemBlock {
- #[serde(rename = "type")]
- block_type: &'static str,
- text: String,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
-}
-
-#[derive(Serialize)]
-struct AnthropicThinking {
- #[serde(rename = "type")]
- thinking_type: String,
- #[serde(skip_serializing_if = "Option::is_none")]
- budget_tokens: Option,
-}
-
-#[derive(Serialize)]
-struct AnthropicMessage {
- role: String,
- content: Vec,
-}
-
-#[derive(Serialize, Clone)]
-#[serde(tag = "type")]
-enum AnthropicContent {
- #[serde(rename = "text")]
- Text {
- text: String,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
- },
- #[serde(rename = "thinking")]
- Thinking {
- thinking: String,
- signature: String,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
- },
- #[serde(rename = "redacted_thinking")]
- RedactedThinking { data: String },
- #[serde(rename = "image")]
- Image {
- source: AnthropicImageSource,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
- },
- #[serde(rename = "tool_use")]
- ToolUse {
- id: String,
- name: String,
- input: serde_json::Value,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
- },
- #[serde(rename = "tool_result")]
- ToolResult {
- tool_use_id: String,
- is_error: bool,
- content: AnthropicToolResultContent,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
- },
-}
-
-#[derive(Serialize, Clone)]
-#[serde(untagged)]
-enum AnthropicToolResultContent {
- Plain(String),
- Multipart(Vec),
-}
-
-#[derive(Serialize, Clone)]
-#[serde(tag = "type", rename_all = "lowercase")]
-enum AnthropicToolResultPart {
- Text { text: String },
- Image { source: AnthropicImageSource },
-}
-
-#[derive(Serialize, Clone)]
-struct AnthropicImageSource {
- #[serde(rename = "type")]
- source_type: String,
- media_type: String,
- data: String,
-}
-
-#[derive(Serialize)]
-struct AnthropicTool {
- name: String,
- description: String,
- input_schema: serde_json::Value,
- #[serde(skip_serializing_if = "Option::is_none")]
- cache_control: Option,
-}
-
-#[derive(Serialize)]
-#[serde(tag = "type", rename_all = "lowercase")]
-enum AnthropicToolChoice {
- Auto,
- Any,
- None,
-}
-
-// Anthropic API Response Types
-
-#[derive(Deserialize, Debug)]
-#[serde(tag = "type")]
-#[allow(dead_code)]
-enum AnthropicEvent {
- #[serde(rename = "message_start")]
- MessageStart { message: AnthropicMessageResponse },
- #[serde(rename = "content_block_start")]
- ContentBlockStart {
- index: usize,
- content_block: AnthropicContentBlock,
- },
- #[serde(rename = "content_block_delta")]
- ContentBlockDelta { index: usize, delta: AnthropicDelta },
- #[serde(rename = "content_block_stop")]
- ContentBlockStop { index: usize },
- #[serde(rename = "message_delta")]
- MessageDelta {
- delta: AnthropicMessageDelta,
- usage: AnthropicUsage,
- },
- #[serde(rename = "message_stop")]
- MessageStop,
- #[serde(rename = "ping")]
- Ping,
- #[serde(rename = "error")]
- Error { error: AnthropicApiError },
-}
-
-#[derive(Deserialize, Debug)]
-struct AnthropicMessageResponse {
- #[allow(dead_code)]
- id: String,
- #[allow(dead_code)]
- role: String,
- #[serde(default)]
- usage: AnthropicUsage,
-}
-
-#[derive(Deserialize, Debug)]
-#[serde(tag = "type")]
-enum AnthropicContentBlock {
- #[serde(rename = "text")]
- Text { text: String },
- #[serde(rename = "thinking")]
- Thinking { thinking: String },
- #[serde(rename = "redacted_thinking")]
- RedactedThinking { data: String },
- #[serde(rename = "tool_use")]
- ToolUse { id: String, name: String },
-}
-
-#[derive(Deserialize, Debug)]
-#[serde(tag = "type")]
-enum AnthropicDelta {
- #[serde(rename = "text_delta")]
- TextDelta { text: String },
- #[serde(rename = "thinking_delta")]
- ThinkingDelta { thinking: String },
- #[serde(rename = "signature_delta")]
- SignatureDelta { signature: String },
- #[serde(rename = "input_json_delta")]
- InputJsonDelta { partial_json: String },
-}
-
-#[derive(Deserialize, Debug)]
-struct AnthropicMessageDelta {
- stop_reason: Option,
-}
-
-#[derive(Deserialize, Debug, Default)]
-struct AnthropicUsage {
- #[serde(default)]
- input_tokens: Option,
- #[serde(default)]
- output_tokens: Option,
- #[serde(default)]
- cache_creation_input_tokens: Option,
- #[serde(default)]
- cache_read_input_tokens: Option,
-}
-
-#[derive(Deserialize, Debug)]
-struct AnthropicApiError {
- #[serde(rename = "type")]
- #[allow(dead_code)]
- error_type: String,
- message: String,
-}
-
-fn detect_media_type(data: &str) -> String {
- if let Some(decoded) = base64_decode_first_bytes(data, 12) {
- if decoded.starts_with(&[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) {
- return "image/png".to_string();
- }
- if decoded.starts_with(&[0xFF, 0xD8, 0xFF]) {
- return "image/jpeg".to_string();
- }
- if decoded.starts_with(&[0x47, 0x49, 0x46, 0x38]) {
- return "image/gif".to_string();
- }
- if decoded.len() >= 12 && &decoded[0..4] == b"RIFF" && &decoded[8..12] == b"WEBP" {
- return "image/webp".to_string();
- }
- }
- "image/png".to_string()
-}
-
-fn base64_decode_first_bytes(data: &str, num_bytes: usize) -> Option> {
- let chars_needed = ((num_bytes + 2) / 3) * 4;
- let prefix: String = data.chars().take(chars_needed).collect();
-
- const BASE64_TABLE: &[u8; 64] =
- b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
- fn decode_char(c: char) -> Option {
- if c == '=' {
- return Some(0);
- }
- BASE64_TABLE
- .iter()
- .position(|&b| b == c as u8)
- .map(|p| p as u8)
- }
-
- let chars: Vec = prefix.chars().filter(|c| !c.is_whitespace()).collect();
- if chars.len() < 4 {
- return None;
- }
-
- let mut result = Vec::new();
- for chunk in chars.chunks(4) {
- if chunk.len() < 4 {
- break;
- }
- let a = decode_char(chunk[0])?;
- let b = decode_char(chunk[1])?;
- let c = decode_char(chunk[2])?;
- let d = decode_char(chunk[3])?;
-
- result.push((a << 2) | (b >> 4));
- if chunk[2] != '=' {
- result.push((b << 4) | (c >> 2));
- }
- if chunk[3] != '=' {
- result.push((c << 6) | d);
- }
-
- if result.len() >= num_bytes {
- break;
- }
- }
-
- Some(result)
-}
-
-fn convert_request(
- model_id: &str,
- request: &LlmCompletionRequest,
- enable_caching: bool,
-) -> Result {
- let model_def =
- get_model_definition(model_id).ok_or_else(|| format!("Unknown model: {}", model_id))?;
-
- let mut messages: Vec = Vec::new();
- let mut system_message = String::new();
- let mut system_should_cache = false;
-
- for msg in &request.messages {
- match msg.role {
- LlmMessageRole::System => {
- for content in &msg.content {
- if let LlmMessageContent::Text(text) = content {
- if !system_message.is_empty() {
- system_message.push('\n');
- }
- system_message.push_str(text);
- }
- }
- if msg.cache {
- system_should_cache = true;
- }
- }
- LlmMessageRole::User => {
- let mut contents: Vec = Vec::new();
-
- for content in &msg.content {
- match content {
- LlmMessageContent::Text(text) => {
- if !text.is_empty() {
- contents.push(AnthropicContent::Text {
- text: text.clone(),
- cache_control: None,
- });
- }
- }
- LlmMessageContent::Image(img) => {
- let media_type = detect_media_type(&img.source);
- contents.push(AnthropicContent::Image {
- source: AnthropicImageSource {
- source_type: "base64".to_string(),
- media_type,
- data: img.source.clone(),
- },
- cache_control: None,
- });
- }
- LlmMessageContent::ToolResult(result) => {
- let content = match &result.content {
- LlmToolResultContent::Text(t) => {
- AnthropicToolResultContent::Plain(t.clone())
- }
- LlmToolResultContent::Image(img) => {
- let media_type = detect_media_type(&img.source);
- AnthropicToolResultContent::Multipart(vec![
- AnthropicToolResultPart::Image {
- source: AnthropicImageSource {
- source_type: "base64".to_string(),
- media_type,
- data: img.source.clone(),
- },
- },
- ])
- }
- };
- contents.push(AnthropicContent::ToolResult {
- tool_use_id: result.tool_use_id.clone(),
- is_error: result.is_error,
- content,
- cache_control: None,
- });
- }
- _ => {}
- }
- }
-
- if !contents.is_empty() {
- if enable_caching && msg.cache {
- if let Some(last) = contents.last_mut() {
- set_cache_control(last);
- }
- }
- messages.push(AnthropicMessage {
- role: "user".to_string(),
- content: contents,
- });
- }
- }
- LlmMessageRole::Assistant => {
- let mut contents: Vec = Vec::new();
-
- for content in &msg.content {
- match content {
- LlmMessageContent::Text(text) => {
- if !text.is_empty() {
- contents.push(AnthropicContent::Text {
- text: text.clone(),
- cache_control: None,
- });
- }
- }
- LlmMessageContent::ToolUse(tool_use) => {
- let input: serde_json::Value =
- serde_json::from_str(&tool_use.input).unwrap_or_default();
- contents.push(AnthropicContent::ToolUse {
- id: tool_use.id.clone(),
- name: tool_use.name.clone(),
- input,
- cache_control: None,
- });
- }
- LlmMessageContent::Thinking(thinking) => {
- if !thinking.text.is_empty() {
- contents.push(AnthropicContent::Thinking {
- thinking: thinking.text.clone(),
- signature: thinking.signature.clone().unwrap_or_default(),
- cache_control: None,
- });
- }
- }
- LlmMessageContent::RedactedThinking(data) => {
- if !data.is_empty() {
- contents.push(AnthropicContent::RedactedThinking {
- data: data.clone(),
- });
- }
- }
- _ => {}
- }
- }
-
- if !contents.is_empty() {
- if enable_caching && msg.cache {
- if let Some(last) = contents.last_mut() {
- set_cache_control(last);
- }
- }
- messages.push(AnthropicMessage {
- role: "assistant".to_string(),
- content: contents,
- });
- }
- }
- }
- }
-
- let mut tools: Vec = request
- .tools
- .iter()
- .map(|t| AnthropicTool {
- name: t.name.clone(),
- description: t.description.clone(),
- input_schema: serde_json::from_str(&t.input_schema)
- .unwrap_or(serde_json::Value::Object(Default::default())),
- cache_control: None,
- })
- .collect();
-
- if enable_caching && !tools.is_empty() {
- if let Some(last_tool) = tools.last_mut() {
- last_tool.cache_control = Some(EPHEMERAL_CACHE);
- }
- }
-
- let tool_choice = request.tool_choice.as_ref().map(|tc| match tc {
- LlmToolChoice::Auto => AnthropicToolChoice::Auto,
- LlmToolChoice::Any => AnthropicToolChoice::Any,
- LlmToolChoice::None => AnthropicToolChoice::None,
- });
-
- let thinking = if model_def.supports_thinking && request.thinking_allowed {
- Some(AnthropicThinking {
- thinking_type: "enabled".to_string(),
- budget_tokens: Some(4096),
- })
- } else {
- None
- };
-
- let system = if system_message.is_empty() {
- None
- } else if enable_caching && system_should_cache {
- Some(AnthropicSystemContent::Blocks(vec![AnthropicSystemBlock {
- block_type: "text",
- text: system_message,
- cache_control: Some(EPHEMERAL_CACHE),
- }]))
- } else {
- Some(AnthropicSystemContent::String(system_message))
- };
-
- Ok(AnthropicRequest {
- model: model_def.real_id.to_string(),
- max_tokens: model_def.max_output_tokens,
- messages,
- system,
- thinking,
- tools,
- tool_choice,
- stop_sequences: request.stop_sequences.clone(),
- temperature: request.temperature,
- stream: true,
- })
-}
-
-fn set_cache_control(content: &mut AnthropicContent) {
- match content {
- AnthropicContent::Text { cache_control, .. } => {
- *cache_control = Some(EPHEMERAL_CACHE);
- }
- AnthropicContent::Thinking { cache_control, .. } => {
- *cache_control = Some(EPHEMERAL_CACHE);
- }
- AnthropicContent::Image { cache_control, .. } => {
- *cache_control = Some(EPHEMERAL_CACHE);
- }
- AnthropicContent::ToolUse { cache_control, .. } => {
- *cache_control = Some(EPHEMERAL_CACHE);
- }
- AnthropicContent::ToolResult { cache_control, .. } => {
- *cache_control = Some(EPHEMERAL_CACHE);
- }
- AnthropicContent::RedactedThinking { .. } => {}
- }
-}
-
-fn parse_sse_line(line: &str) -> Option {
- let data = line.strip_prefix("data: ")?;
- serde_json::from_str(data).ok()
-}
-
-impl zed::Extension for AnthropicProvider {
- fn new() -> Self {
- Self {
- streams: Mutex::new(HashMap::new()),
- next_stream_id: Mutex::new(0),
- }
- }
-
- fn llm_providers(&self) -> Vec {
- vec![LlmProviderInfo {
- id: "anthropic".into(),
- name: "Anthropic".into(),
- icon: Some("icons/anthropic.svg".into()),
- }]
- }
-
- fn llm_provider_models(&self, _provider_id: &str) -> Result, String> {
- Ok(MODELS
- .iter()
- .map(|m| LlmModelInfo {
- id: m.display_name.to_string(),
- name: m.display_name.to_string(),
- max_token_count: m.max_tokens,
- max_output_tokens: Some(m.max_output_tokens),
- capabilities: LlmModelCapabilities {
- supports_images: m.supports_images,
- supports_tools: true,
- supports_tool_choice_auto: true,
- supports_tool_choice_any: true,
- supports_tool_choice_none: true,
- supports_thinking: m.supports_thinking,
- tool_input_format: LlmToolInputFormat::JsonSchema,
- },
- is_default: m.is_default,
- is_default_fast: m.is_default_fast,
- })
- .collect())
- }
-
- fn llm_provider_is_authenticated(&self, _provider_id: &str) -> bool {
- llm_get_credential("anthropic").is_some()
- }
-
- fn llm_provider_settings_markdown(&self, _provider_id: &str) -> Option {
- Some(
- "[Create an API key](https://console.anthropic.com/settings/keys) to use Anthropic as your LLM provider.".to_string(),
- )
- }
-
- fn llm_provider_reset_credentials(&mut self, _provider_id: &str) -> Result<(), String> {
- llm_delete_credential("anthropic")
- }
-
- fn llm_cache_configuration(
- &self,
- _provider_id: &str,
- model_id: &str,
- ) -> Option {
- let model_def = get_model_definition(model_id)?;
- if model_def.supports_caching {
- Some(LlmCacheConfiguration {
- max_cache_anchors: 4,
- should_cache_tool_definitions: true,
- min_total_token_count: 2048,
- })
- } else {
- None
- }
- }
-
- fn llm_stream_completion_start(
- &mut self,
- _provider_id: &str,
- model_id: &str,
- request: &LlmCompletionRequest,
- ) -> Result {
- let api_key = llm_get_credential("anthropic").ok_or_else(|| {
- "No API key configured. Please add your Anthropic API key in settings.".to_string()
- })?;
-
- let model_def =
- get_model_definition(model_id).ok_or_else(|| format!("Unknown model: {}", model_id))?;
-
- let enable_caching = model_def.supports_caching;
- let anthropic_request = convert_request(model_id, request, enable_caching)?;
-
- let body = serde_json::to_vec(&anthropic_request)
- .map_err(|e| format!("Failed to serialize request: {}", e))?;
-
- let mut headers = vec![
- ("Content-Type".to_string(), "application/json".to_string()),
- ("x-api-key".to_string(), api_key),
- ("anthropic-version".to_string(), "2023-06-01".to_string()),
- ];
-
- if let Some(beta) = model_def.beta_headers {
- headers.push(("anthropic-beta".to_string(), beta.to_string()));
- }
-
- let http_request = HttpRequest {
- method: HttpMethod::Post,
- url: "https://api.anthropic.com/v1/messages".to_string(),
- headers,
- body: Some(body),
- redirect_policy: RedirectPolicy::FollowAll,
- };
-
- let response_stream = http_request
- .fetch_stream()
- .map_err(|e| format!("HTTP request failed: {}", e))?;
-
- let stream_id = {
- let mut id_counter = self.next_stream_id.lock().unwrap();
- let id = format!("anthropic-stream-{}", *id_counter);
- *id_counter += 1;
- id
- };
-
- self.streams.lock().unwrap().insert(
- stream_id.clone(),
- StreamState {
- response_stream: Some(response_stream),
- buffer: String::new(),
- started: false,
- current_tool_use: None,
- stop_reason: None,
- pending_signature: None,
- },
- );
-
- Ok(stream_id)
- }
-
- fn llm_stream_completion_next(
- &mut self,
- stream_id: &str,
- ) -> Result