diff --git a/content/.metadata.json b/content/.metadata.json index e17ca0cdd0..5d360c3a6c 100644 --- a/content/.metadata.json +++ b/content/.metadata.json @@ -1,7 +1,7 @@ { "metadata": { "version": "2.0", - "fetch_date": "2026-10-21T15:43:14.757552Z", + "fetch_date": "2026-10-21T19:44:41.294430Z", "section": "all" }, "items": [ @@ -9,911 +9,911 @@ "url": "https://platform.claude.com/docs/en/home", "status": "success", "path": "en/home.md", - "sha256": "e0ef3575e424543602681374833e4c36f0aa7711c7e3e0ef87a2987c5da5d99b", - "size": 15689 + "sha256": "c808832f76ace8ff354a54b54d0dee1ab551eb6d8e86bc62816bc3b404bcedcb", + "size": 15676 }, { "url": "https://platform.claude.com/docs/en/intro", "status": "success", "path": "en/intro.md", - "sha256": "ff14b06a01796928805b914e41832942d64e2b9b215661d27374907d4664983d", - "size": 5841 + "sha256": "6f4fbc37596ac994c82333b1121a7590d4fcee7a09969ded7116293bfb99aa69", + "size": 5829 }, { "url": "https://platform.claude.com/docs/en/get-api-key", "status": "success", "path": "en/get-api-key.md", - "sha256": "7b304d899b305871a2b5af261a48d75d7f743114151fbe71826cc7ecd83a9bc6", - "size": 4631 + "sha256": "0469e0432857f7a6b766d1d1db40ea6c28779c2aef130108def88410f5cf9db9", + "size": 4633 }, { "url": "https://platform.claude.com/docs/en/get-started", "status": "success", "path": "en/get-started.md", - "sha256": "090703e794a85d428414f6361a3e0df919b8cf90fea6bc14a26c1c90c999e8ce", - "size": 19387 + "sha256": "e3279d6216627132916fe9e09b4d7da98fedf03727d2a3fb7397c59150062c57", + "size": 19378 }, { "url": "https://platform.claude.com/docs/en/manage-claude/authentication", "status": "success", "path": "en/manage-claude/authentication.md", - "sha256": "d862a5399b0c32135364e5ba3f197be7df0e2bd7a9b2573c8e691495ce2ff091", - "size": 25305 + "sha256": "cfd792d818930f5900608f520e8bd6f533b2f827dbec58ca09b6d70d8763d4bc", + "size": 25709 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/overview", "status": "success", "path": "en/build-with-claude/overview.md", - "sha256": "11727a0ac83806ceb94e324af2136d7f0943e9cf34146f440be91ee1ba6c7958", - "size": 29490 + "sha256": "329931ec023539cd23ada2f1b00d7c389fdd4f63d817bb1ff1635ec00cb2237c", + "size": 29474 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/working-with-messages", "status": "success", "path": "en/build-with-claude/working-with-messages.md", - "sha256": "5967c72af243cb2391add4512ca326e3f388c63020be19ef1f48bfad7dea7f5c", - "size": 32998 + "sha256": "f7c10e851b149c9395225b5f522bad8e4f42c95e1f90aad16ffdf8f58d389f25", + "size": 33168 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons", "status": "success", "path": "en/build-with-claude/handling-stop-reasons.md", - "sha256": "95da95a02bcc760dc61a435322aba06ed6d268d55d4cd4d2905b75411088e170", - "size": 121018 + "sha256": "580efbfda0c818fa4ae41a47ae24c17d2a199c10294cac8c552588ee9ca656e3", + "size": 120092 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback", "status": "success", "path": "en/build-with-claude/refusals-and-fallback.md", - "sha256": "bdae8a846507671613d52dd556d34613873b42071e95941da8d7f020dbd1f534", - "size": 65218 + "sha256": "d096d5c0ef526cccac1aad63ffa2cc95eb0e4d46b11c2cf97594ed42b0121785", + "size": 65292 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/fallback-credit", "status": "success", "path": "en/build-with-claude/fallback-credit.md", - "sha256": "d0aa49a059f0a3c6dc303b5fe6b7921941331370fe44cf1a81c335be44e20b47", + "sha256": "ad8babd9398adb3ea3e6d7ff4afc18091b1f965f8c2456fb7b8e5a91bab92842", "size": 31370 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/effort", "status": "success", "path": "en/build-with-claude/effort.md", - "sha256": "38cf202f17d28efe5a42f1df1de7f7af5924f76ce05abb7b5989db919ae892e5", - "size": 42898 + "sha256": "691ce48204935d370ba81415af38febc643f53a657496f4512851e6f86b0dff5", + "size": 42859 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/task-budgets", "status": "success", "path": "en/build-with-claude/task-budgets.md", - "sha256": "a6cc500f0473e6f7c49e9f43edda9f1c890e09ce359cb8ecbc7ed85c4192eb6a", - "size": 28798 + "sha256": "0fa3d532dec0cf139bfa0ea2f9de0e9b14c095a446ba9a5c53b0986d2db8426c", + "size": 28840 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/fast-mode", "status": "success", "path": "en/build-with-claude/fast-mode.md", - "sha256": "31838d471e1993bb14049d5b5f5c314b04b6eb323b87282d9c81d69e38371756", - "size": 24880 + "sha256": "2b85745d2899ea80d6bba9e3f89016ecd3974c8fba65828b2fdf97a614106e3c", + "size": 24899 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/structured-outputs", "status": "success", "path": "en/build-with-claude/structured-outputs.md", - "sha256": "a0c6b69eb353e2d68f41e0d5af3737ac26bd3b1f8281c54ed19e0ab0963f4111", - "size": 102126 + "sha256": "280b21fac15740b5c8e2f48ca2044509851da79d97e449cc46f3355cbe8ce5a7", + "size": 102219 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/citations", "status": "success", "path": "en/build-with-claude/citations.md", - "sha256": "d109b64127d1993b36fa0195fa3063e8c7bb61d3e4b99edd9e3e3b3a8ecbbe6a", - "size": 74932 + "sha256": "dd6b6e30d4a229515130796ec6d6d173cba54429f693a429c2530ce87707492b", + "size": 74678 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/streaming", "status": "success", "path": "en/build-with-claude/streaming.md", - "sha256": "7f0db59ae87284701744cf7296337365e760ca70dac3a923cf5392c09378e8be", - "size": 51139 + "sha256": "19486990bb6fccfffb9d257ec95ee239f69a0ca0c95c4c5a213451b12e3d15fe", + "size": 51066 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/batch-processing", "status": "success", "path": "en/build-with-claude/batch-processing.md", - "sha256": "becf39440b06098a7b112ba9c3704877d27f5814759454b33af8a7dd6e9dc7f4", - "size": 74970 + "sha256": "6a3cf0af263502f67312da2efe67cb8c2643f56f0c21c3780a19d90d974e3128", + "size": 75563 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/search-results", "status": "success", "path": "en/build-with-claude/search-results.md", - "sha256": "588a25274af98e6119e1671f9cf9e5df617b1595ca8b6393983216ad105ac113", - "size": 84281 + "sha256": "274e23696e0f0f111fe0023b75a8485aff023e59deb093452edebd816a15be95", + "size": 83867 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals.md", - "sha256": "07e3f4454c7b4626f3ef1f491b5b48db0aabca5b0637fea122a6319e2e954346", - "size": 13894 + "sha256": "20404743c9ed10d6bca4b21f559b27c97d7e51d04f5f0961d7959a567a5568f9", + "size": 13905 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/multilingual-support", "status": "success", "path": "en/build-with-claude/multilingual-support.md", - "sha256": "22c7a306b1f60e7d72b0b8df8612e5b3cde9622e5968344fe7df3465d07d311c", - "size": 9445 + "sha256": "e8f2426f0d2044cc6187e42bdb09ce4c7aa67aec2cb4d0b78ef20701e59521b7", + "size": 9419 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/embeddings", "status": "success", "path": "en/build-with-claude/embeddings.md", - "sha256": "25ba132d1d37a359cfd06199274ecc49d4fb8aa2e2a8a9367afce4b90c94087a", - "size": 25424 + "sha256": "1ce7cd8deaea7a1dc2c11a349deb3e0862cc22f6eb316dc10851c0276cd61e53", + "size": 25426 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/thinking", "status": "success", "path": "en/build-with-claude/thinking.md", - "sha256": "8bbc8ed20cffa039e5c2c371c64610c7e4019d2dabf1a01392a87dc0018d9375", - "size": 84830 + "sha256": "df5e8df6f1e9df1a2a79a1ee95957ec23bfec7ec001d38820dcfb6606dfb9fba", + "size": 84859 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost", "status": "success", "path": "en/build-with-claude/thinking-steering-and-cost.md", - "sha256": "249dbb140ab8cdcf0d47a74a6a9fb4faba044240d9f5b16212fd060335d18a2f", - "size": 43275 + "sha256": "5b3bcd4eea8bba2d714b738c676f5c2416f4374cf30e12c1a98ad253fbfa4bae", + "size": 42729 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/thinking-tool-workflows", "status": "success", "path": "en/build-with-claude/thinking-tool-workflows.md", - "sha256": "09755dbfdf5eab4a3b54c15521b5f0f9697288cf26dddd9ab0890f40a54cac52", - "size": 31399 + "sha256": "f600942017b6c10a7eaee7c7b1bf62b49d5e9b4f984713a96a9871e501aa7cd3", + "size": 31351 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/preserved-thinking", "status": "success", "path": "en/build-with-claude/preserved-thinking.md", - "sha256": "f41748e05a1a34e48bf9a0c6d1db9fcfc8d5188751f05b6f196f15e7247433ad", - "size": 115731 + "sha256": "50e27d5f0a3d6e348c8fef3442e366dcf8529c705a45ea73f7801a6350e9eae9", + "size": 115674 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting", "status": "success", "path": "en/build-with-claude/thinking-troubleshooting.md", - "sha256": "488a2dc85b55ce36890ca22031aade5bf61c8ffeb71ba5936a2b43c2f02502ff", - "size": 23105 + "sha256": "07abe1c4f4af8afa678fb2801bdfffaa1298dff98bc7b5ba8e388d07ea151fe5", + "size": 23111 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/extended-thinking", "status": "success", "path": "en/build-with-claude/extended-thinking.md", - "sha256": "bb32ce9a4c39d2c66b62d4ee1d51b425c803ced54c7e612e9d77d51816dacd30", - "size": 22426 + "sha256": "6e3bd7b43347e9dc31df09d951bb899ae590c94136f0b678da5d058f42adf141", + "size": 22431 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview", "status": "success", "path": "en/agents-and-tools/tool-use/overview.md", - "sha256": "d2dd7b4d6d51c60d6bfc9f58d36a6180f6ebdd8f5388aabf1d017f141a909e0d", - "size": 35945 + "sha256": "ce72d3165a1536eb6f5c90c57b9e71aff16d41ddf7350d4b6e8649555720e0b4", + "size": 35872 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works", "status": "success", "path": "en/agents-and-tools/tool-use/how-tool-use-works.md", - "sha256": "e30dd4b1ca07f0dad0a4bb3ced56a31fb673cbfdb5d3fc68d4d7fcc8ad234193", - "size": 11363 + "sha256": "6170b3f5922a4eb408f0c9eaa2f592ec018ec21e75f3a03f897b8e66f89e78f5", + "size": 11336 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/build-a-tool-using-agent", "status": "success", "path": "en/agents-and-tools/tool-use/build-a-tool-using-agent.md", - "sha256": "296e83ed789b7c80da917e844e62c1fe825c1c5cde4341d314c9c8b315645b16", - "size": 139227 + "sha256": "31272d59f6a5880615e219b42435ac2b1e14cfcd2f69a84263dd04503d00c916", + "size": 138641 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools", "status": "success", "path": "en/agents-and-tools/tool-use/define-tools.md", - "sha256": "f1db4ebbe6aee0ef13941fa46e3ca9e07fb76c32e16e95dfbbda955576383d18", - "size": 38615 + "sha256": "90906d84a2046d57da36d0cf1737ba52bed8fcc57370da9cbabdde5ced38c8e8", + "size": 38522 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls", "status": "success", "path": "en/agents-and-tools/tool-use/handle-tool-calls.md", - "sha256": "7d66a22a28ed3ff4a032aa7d32d7a908bb38cfef6b647120a8330a8ee67f6db0", - "size": 13436 + "sha256": "b739788e7022c083ea121ffad9ccf7011ef10522f736811cf104a1d91ffe0ff7", + "size": 13433 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use", "status": "success", "path": "en/agents-and-tools/tool-use/parallel-tool-use.md", - "sha256": "38af9163f8effd2919382921b35c9d7cd75ec339e8a1172bfd22072e1f2951a4", - "size": 55215 + "sha256": "68267606eb7eed4cefa36c17308b70dfcac15aed9fe110e5224b645487f572dd", + "size": 55250 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner", "status": "success", "path": "en/agents-and-tools/tool-use/tool-runner.md", - "sha256": "ab8b4f3fca2a4c24c4d9c6b360597a3bf71ac26dc409378945d823ac653fa6da", - "size": 66947 + "sha256": "131312ea9a8a8970ccceeedb93a551886d6827e807143285170d772d71f89c25", + "size": 66605 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use", "status": "success", "path": "en/agents-and-tools/tool-use/strict-tool-use.md", - "sha256": "8de5599c4e88b417aa409251a2761d6952665464766902689c58c4c0ab77818d", - "size": 40236 + "sha256": "2ef0566b43f7a5cca61745c3815e9a8db4798ec11ed598a26bafdf750287f1bf", + "size": 40227 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools", "status": "success", "path": "en/agents-and-tools/tool-use/server-tools.md", - "sha256": "6e7ec988e91b8ab3c2d73ee3416621728b1032c2d8043dcdaae550fa08a542d8", - "size": 44899 + "sha256": "70b00e72c0202a1c3cb0dd6bfa5ab63c9cded7337d02097e2d190079429d049b", + "size": 44776 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool", "status": "success", "path": "en/agents-and-tools/tool-use/web-search-tool.md", - "sha256": "5c633c963fcb0f252adede20cc348bbd3e07e3e24ae8b4057c9540a78aa069c1", - "size": 29039 + "sha256": "1e95a1ab6d6021ab301d06c93a05191756689a58fb2b977bcaadc25af39d1b7e", + "size": 29085 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool", "status": "success", "path": "en/agents-and-tools/tool-use/web-fetch-tool.md", - "sha256": "8ee070ed26f7ab17f64fa97b20f5ef61cd0bb08a9d9030b041e9d87ab088cf2a", - "size": 38722 + "sha256": "97346582785f5b448e1f37b644426a7073e2493485f5c407aee974b9d8e0fb12", + "size": 38715 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool", "status": "success", "path": "en/agents-and-tools/tool-use/code-execution-tool.md", - "sha256": "aeaf204e35eddbe5cd1dacf8d6f624034589c9eebee2c0162598f629a0256e2a", - "size": 61236 + "sha256": "7c4cd551df553dd371d767142efc517426d2b630eedbaea470bab85bac5e1fe5", + "size": 61136 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool", "status": "success", "path": "en/agents-and-tools/tool-use/advisor-tool.md", - "sha256": "113496b2e464a2d0b34d902ec4ee2ca0b55e298ef9dcbb483127bc183d977548", - "size": 102090 + "sha256": "62cef5409573561fb1cbdbf60d2273b991a3689038c7c6c115a8e5a42bc3d260", + "size": 101077 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool", "status": "success", "path": "en/agents-and-tools/tool-use/tool-search-tool.md", - "sha256": "d710d5118c5b18989aae449c27338993a38ca2ac3d04f7983efad3c5558e6e64", - "size": 37799 + "sha256": "acebeeeb142f0b706df911ef5fbf769f29b4eabe91798805c39a97851b83b6dc", + "size": 37753 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool", "status": "success", "path": "en/agents-and-tools/tool-use/memory-tool.md", - "sha256": "115bd3a4601eb2f8c1243e8ff4ee0c4fac8624416fe5e7ac4cce78aac7297ec0", - "size": 39723 + "sha256": "bc1d6b92ba48028f9f0376d3c874607b1cd150879bef8fccc63e9e9d90adc219", + "size": 39598 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool", "status": "success", "path": "en/agents-and-tools/tool-use/bash-tool.md", - "sha256": "fa2702be33c1cdd86dab5ed7a5eeab0a36100439f87e5e7be72a12faa867013f", - "size": 71321 + "sha256": "78ed2d15b2f1723d31f13a6cb6ca3ebdd5f16a8dee8d581d9b4a19a0986e40c4", + "size": 71094 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/text-editor-tool", "status": "success", "path": "en/agents-and-tools/tool-use/text-editor-tool.md", - "sha256": "1a7bd4a0ed59030ae120288e066ac83401181c4f8fb4c8354fdf643354f10257", - "size": 81461 + "sha256": "4c9024dac9db7659cfdd00fe7a973bccadf8329d6d891829525b0dd3b8e79ab2", + "size": 81231 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk", "status": "success", "path": "en/agents-and-tools/tool-use/browser-use-sdk.md", - "sha256": "80d6a0b238694c0e98aeeab32ea080254802b0515cb8e1665adf0a7b613cffb8", - "size": 79747 + "sha256": "33c5b419ae8681bf935066fc7c774b3fc082bb9cd7cf278285257bcb19891f7d", + "size": 79725 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool", "status": "success", "path": "en/agents-and-tools/tool-use/computer-use-tool.md", - "sha256": "fa99672ea8c5e63cddecba1023762639bfd87219f30cea52a33cb23972d1fec7", - "size": 118778 + "sha256": "ef70c9493d875700fd8329759fe65e6a10b4dbdcb1a833c0a6ef5d051dc5fa4f", + "size": 118393 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool", "status": "success", "path": "en/agents-and-tools/tool-use/browser-use-tool.md", - "sha256": "1f5952580ab559272c93937846eeb13b930c60aa889f9c0ac43764caebd48ddb", - "size": 108083 + "sha256": "0f3fa694daaac1bbd8d6f74a280e0e75df8d22676fdc41540b58d269ffeded38", + "size": 108153 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/troubleshooting-tool-use", "status": "success", "path": "en/agents-and-tools/tool-use/troubleshooting-tool-use.md", - "sha256": "89631ba04c9ba3540f6115a9dc763bb6fc53824e232194d8e78cfe569db52496", - "size": 15272 + "sha256": "8fac27652a83e0c7b636f64286e8229c7aad84ff41032140160c670afcb67bcb", + "size": 15268 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference", "status": "success", "path": "en/agents-and-tools/tool-use/tool-reference.md", - "sha256": "fec165573024f68207fa51ab30c72fa2b5160bd76e8a235b95e98fe08015b4a4", - "size": 19382 + "sha256": "e43d45a543bb6b139a9e6a3d92d5c124aa326e449be0a12d66d824334e2ae4a2", + "size": 19390 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/manage-tool-context", "status": "success", "path": "en/agents-and-tools/tool-use/manage-tool-context.md", - "sha256": "6e63b207b0b99d2100df62fc770ce3044181e5bce3f9eb81a54bb70007e5f258", - "size": 5501 + "sha256": "e28518200ed0c5bd4f0526751a55db7b379d30ef9716772f8f9f40db5df8d586", + "size": 5509 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-combinations", "status": "success", "path": "en/agents-and-tools/tool-use/tool-combinations.md", - "sha256": "19af85f13fbc207a03784d4dbd31083f2335b97882d7b6831a86a94fd8a064dd", - "size": 6170 + "sha256": "a8bef1b41ec5428812910a3a376496c8a3d3ee99c31afb7b9f81f936ca4a4757", + "size": 6178 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-use-with-prompt-caching", "status": "success", "path": "en/agents-and-tools/tool-use/tool-use-with-prompt-caching.md", - "sha256": "a0bb0d71af45051398a1e63c7379fe0ec5af0dd91ea9351cba2d9b5c474161f6", - "size": 11881 + "sha256": "b99507270f0365a7846c4d69ed792138b2e0a8b33db8f8cf1bc24fe03dced886", + "size": 11888 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling", "status": "success", "path": "en/agents-and-tools/tool-use/programmatic-tool-calling.md", - "sha256": "f9d0e8f804fcbfb1c5afaf167a67efc6c65b8d19d2cdebf0e2f8f3fb9e99d1e5", - "size": 62225 + "sha256": "99e5b7fcf973c2e18681b0213660431c2402ae03c3470c3f09875de1b98bb7f4", + "size": 62171 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming", "status": "success", "path": "en/agents-and-tools/tool-use/fine-grained-tool-streaming.md", - "sha256": "f193b886a4aeb195535a07ed2e612ca1a89cb48b5f1b6f8451daf25ce03a07fc", - "size": 36453 + "sha256": "1e457627355706bee23832df4921aca75cffc489f4cd96d72233a1145ce600db", + "size": 36436 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/context-windows", "status": "success", "path": "en/build-with-claude/context-windows.md", - "sha256": "7d790a0e38c0fce064361fb56418b16cf108bce2b64d294b098624b97739a036", - "size": 16261 + "sha256": "7c53cf27aaad2ed8a7f0b8076e058b312d725949f22fbadb5d7f423b0d5f1d51", + "size": 16191 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/context-editing", "status": "success", "path": "en/build-with-claude/context-editing.md", - "sha256": "652c965cc22dd54f50ba76bafc2b977f278230f04e38f244263145180315de45", - "size": 104419 + "sha256": "d97efadd69440d56c5b092dbddf0dfb29a00c0eca8098c3f4a92b073e399b7e5", + "size": 103258 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-caching", "status": "success", "path": "en/build-with-claude/prompt-caching.md", - "sha256": "65cb644a86d9ce9c8f3adad15af656c33db58a719b14ba7e899614b22616cd9f", - "size": 160239 + "sha256": "709298a25f8f81fa12a2c283c7a6ceb135a7bc4aead0a8db23a8dff4360be734", + "size": 159894 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages", "status": "success", "path": "en/build-with-claude/mid-conversation-system-messages.md", - "sha256": "eee1c514258855d7159630327c40d0427f00d56de06ecfee5c37e3a18507608f", - "size": 105168 + "sha256": "4d490b43257b0f937465fe45f527616ed10a8bd9a21b02991f363e820d04bbed", + "size": 104661 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/mid-conversation-effort-example", "status": "success", "path": "en/build-with-claude/mid-conversation-effort-example.md", - "sha256": "fd0901161b36533bfd4dde87a9f09f0a51af68eb0632cbcfbcf5b829da2237a1", - "size": 162666 + "sha256": "f7a03d5d6cc8eb9b87b6489b17bf361857e4a1953ba88a1f5911337dfb046e09", + "size": 162222 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics", "status": "success", "path": "en/build-with-claude/cache-diagnostics.md", - "sha256": "31fad2772d9a7bba196465752c4bee844b186cdc0658a9f0e1baa4c5f0b0b166", - "size": 46677 + "sha256": "ec72925efe9bb497e37a360259351b0d5bc5ad4f5febe4aaea5baf760b21c807", + "size": 46450 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/token-counting", "status": "success", "path": "en/build-with-claude/token-counting.md", - "sha256": "9190230d61827b5a1c713daeeca424195213f3961d17f6d184245842a0d4338f", - "size": 43419 + "sha256": "8eb922a4f5d95d45bb9fa4a70c27e8f428001d62a8645618a3e309f5843d1648", + "size": 43244 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction", "status": "success", "path": "en/build-with-claude/compaction.md", - "sha256": "7a655205a3db0594a392dd25ac18e8fc1f8d6ed8af56a4d48707abb7057b3121", - "size": 12234 + "sha256": "b8c66a81d710b7fdeb2868b4e73288f45d7fb560f5f69cc0e26154f89654f161", + "size": 12237 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand", "status": "success", "path": "en/build-with-claude/compaction-on-demand.md", - "sha256": "649c1b29e0f4d41b940b5aacdb47149fc91d7aac8aed04c1fcf7b02a98591aca", - "size": 47077 + "sha256": "f1e85a3855d2234e5d24e63b226c1cef980d782bbf9a385794c67bf7bedc221a", + "size": 46833 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction-keep-recent-turns", "status": "success", "path": "en/build-with-claude/compaction-keep-recent-turns.md", - "sha256": "da99363c1d7438c05428d51c051ead78b1bef2cb311f722447716772afc03bd1", - "size": 22000 + "sha256": "729d870ee420cd5e5fe67cfdba4551d4740ed427b0d2f8e04eeefa25886d73a3", + "size": 21874 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction-background", "status": "success", "path": "en/build-with-claude/compaction-background.md", - "sha256": "0aae16421f4f8c525c8588e44e347ff114a72191631acc160ad3a85be5028989", - "size": 23378 + "sha256": "b92ed8c0e44b4e035493a4125f23759da96f3877703c11e3fab43d24ee59c369", + "size": 23075 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks", "status": "success", "path": "en/build-with-claude/compaction-thinking-blocks.md", - "sha256": "cac24375c4685e8acfe2ee2c742907ae59318cc0b63f9a68c2e00599356ef67f", - "size": 31711 + "sha256": "2fbcd521e0174962969788d1001208c8419dd4de000738ecadfeb4742fefd2f0", + "size": 31437 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/compaction-threshold", "status": "success", "path": "en/build-with-claude/compaction-threshold.md", - "sha256": "e265f34476bc86a1bb220bbc40b301331a13e269bad189bcedc71a172197d8d7", - "size": 114516 + "sha256": "19a24aa9a4c33ce6880546fc391cd1d1f31f4a3a1c38acbac93521cf160272e7", + "size": 114210 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/files", "status": "success", "path": "en/build-with-claude/files.md", - "sha256": "29b5ec964555e394e53c150f24cc75be6b5dcc5ea4f090056f8ed252bc649512", - "size": 37423 + "sha256": "4d0e0ebb37fee401fc6376446ab87604135c84145ea7997efaf0045ae169e9ee", + "size": 38019 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/pdf-support", "status": "success", "path": "en/build-with-claude/pdf-support.md", - "sha256": "9a2e9e0427c89c6cc5b684524943301b4e66f8c1ceee86676f4ff1e5ed1c9df8", - "size": 61568 + "sha256": "1c47ddaf5baa47b851fa7a58a471a768e8b741921c1e8f2d43207cd9975f5297", + "size": 61564 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/vision", "status": "success", "path": "en/build-with-claude/vision.md", - "sha256": "63c226856ef8be5112113b5c98831481e54c45ce520ed1bd4792c59458526fe0", - "size": 47772 + "sha256": "116105a08ca1bda02de9e21abd7eabf56762e49b9ff98c3a5d68d6d0d9984431", + "size": 47679 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/vision-coordinates", "status": "success", "path": "en/build-with-claude/vision-coordinates.md", - "sha256": "29e597c5551921e29b4100f31a8d10f65a68538450970f28bd8ee88dc9056f35", - "size": 35141 + "sha256": "5414f9b222549bcfab9156cb0ca95256dfdcfbb8bfff1060df08936e72d9a176", + "size": 35190 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview", "status": "success", "path": "en/agents-and-tools/agent-skills/overview.md", - "sha256": "d4ee7be3d55001004a1c22790608ad48a1643badb2087195ddbddec1acbbe5f0", - "size": 21791 + "sha256": "00f0675b702bc0ed28974971b6ca870e20b62a447e1aae62d457190fcfa1c755", + "size": 21841 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/agent-skills/quickstart", "status": "success", "path": "en/agents-and-tools/agent-skills/quickstart.md", - "sha256": "f5a9d594410764097eb6d2de0866984389937f33b82ef4960638c4bf2629f349", - "size": 37033 + "sha256": "1641b50a4caa95de15b60d13d6c6ba65c2e048de6b7c456820f6258ffc13b64e", + "size": 36819 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices", "status": "success", "path": "en/agents-and-tools/agent-skills/best-practices.md", - "sha256": "727f3fa1168eb1c33ce6a3cbfc94a02ef1dfd647388f6ca9daf7cb6294762f42", - "size": 42028 + "sha256": "1490eb6111daf632f8fed716863efe080162b8d615d5bc888b6ba0777b759c0a", + "size": 42151 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise", "status": "success", "path": "en/agents-and-tools/agent-skills/enterprise.md", - "sha256": "4b10bbd62c50fd8c389d63449b8aae4b562deeb8eda74aec6f0baf0563182061", - "size": 16270 + "sha256": "c1cd8c85e27c1f8110dafc0660fe4829bcaddee6752c891397c589ec92eff494", + "size": 16380 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/skills-guide", "status": "success", "path": "en/build-with-claude/skills-guide.md", - "sha256": "76a440b2aff54e1b1a6e0c0ed4102437da4c7a759c00290f4d81e97acadbbe7f", - "size": 144610 + "sha256": "d2b7e954a33697089d84ff66c13197c4db5ea26c56265b162b0fbebf2f0bc0a2", + "size": 145282 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/remote-mcp-servers", "status": "success", "path": "en/agents-and-tools/remote-mcp-servers.md", - "sha256": "bd8bc14c597f0adcf0caf3f63fd38ea1a919736af5c5022a1b9e5a998743d508", - "size": 1756 + "sha256": "ed1485d913af94c77447c68c2b261c1676f05ad874f9b2c8921c75f83d03d9f4", + "size": 1769 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-connector", "status": "success", "path": "en/agents-and-tools/mcp-connector.md", - "sha256": "b0aa6583a802283a1583bc084e61d11eee7ad6bf7337aefd5f721210927e4bd0", - "size": 73460 + "sha256": "f4d545c6ebba5e0cfd978ae0495a2a9b32222f8df045130b361a2bc50d02acee", + "size": 73261 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/overview.md", - "sha256": "3513f5d31181e190fc444a09500e88a486d109d81849a752bd1e9fc2786a0fc6", - "size": 19798 + "sha256": "af5d70cfa50becab6b3f551baf5ee778102bf26adc4fff013bd766e67311f0c4", + "size": 19796 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/concepts.md", - "sha256": "a4784f030cc9302d08f06c3e22f4a75325965a9af6fa564bf0a21c2726cfdc6d", - "size": 10525 + "sha256": "e2e42e1354126b73fd05bedd3076f749eb8bb45cd610b6d6e7ff1c57ca9ff37f", + "size": 10535 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/quickstart", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/quickstart.md", - "sha256": "9ec8b89e700af70117536aa9c06b61510d68631070932629242b6abde8447408", - "size": 11765 + "sha256": "88819287ed86baa29cfa586ca78891f34280b76fde46119ce30bf38c9e7b7564", + "size": 11782 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/console.md", - "sha256": "8a7c2ec6c95820ac75f603535bcd8784edeb940fbc877a0027fa9b94fb76492c", - "size": 15468 + "sha256": "eec16ddda53dd2f84b669982749d6568bfab5412138e5a23d4b552c4f0384111", + "size": 15510 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-helm", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/deploy-helm.md", - "sha256": "a2e66ce4c5e74595913dbd6128978f496943bcf074a4de9877e11ed1bda6d099", - "size": 24644 + "sha256": "a3ef469bedd34fcad72efc26c6a79c0fa112dbaf4f524e673bc72095cb7b8a6b", + "size": 24681 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-compose", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/deploy-compose.md", - "sha256": "899b651af5663e1c971da22569334992f2c1be031962ac9c32360c8d308020bf", - "size": 22931 + "sha256": "d3d8513e512b87b596da8caa883e7c3bf46cedd482c7db7a15c1cd4bf0ce1828", + "size": 22956 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/security", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/security.md", - "sha256": "0df903933be8d645c8562624f365c40a77c9236ffc35d967a10f18c66f656eb6", - "size": 5613 + "sha256": "8b259c89d8532ab0c94af32b2834feccb8dc6614f16bb1b417a5645dcf4e5620", + "size": 5612 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/troubleshooting.md", - "sha256": "516d6a58997702e8f6aedbdd3beea5510c0a9c078321e5a95f8e4c3a550f5f2c", - "size": 10316 + "sha256": "be4e8ea12affbcd8849820f8d05707c2bf2b75a432e6fccd186141d9f69f54e9", + "size": 10327 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference", "status": "success", "path": "en/agents-and-tools/mcp-tunnels/reference.md", - "sha256": "87c5260ba9b23b4d29a279f209004648c7f819b200edfd12dc907ef7501f8308", - "size": 12729 + "sha256": "4ad49db6275a7c23866846c1df972d702f69dfe16f85dc0fffc65d6ca54e6360", + "size": 12727 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock", "status": "success", "path": "en/build-with-claude/claude-in-amazon-bedrock.md", - "sha256": "24d9382149f029faabce170198d96e0c24ca4c8c419b66aa83f2e3c356ba2df5", - "size": 23203 + "sha256": "aa47d3477281e06f61e0a29140e8e4eb9252e10b3ac1986863b8cfbf8b01fbed", + "size": 23202 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy", "status": "success", "path": "en/build-with-claude/claude-on-amazon-bedrock-legacy.md", - "sha256": "825f810a264e779d212c8112e23015922be01b7d20346943b290caf5516c84c8", - "size": 41690 + "sha256": "eb7af140d1902a90ead56608d789cc9d9359bfbfcf3f14c507f847c9e7b8b12d", + "size": 42397 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws", "status": "success", "path": "en/build-with-claude/claude-platform-on-aws.md", - "sha256": "a2a71be2ea51950f01fa3995a9ed34c4b01b66274b7c23eb12f07d857908dacb", - "size": 101491 + "sha256": "9c03a8b618522cf841e140b9417be17692cbc05c95d444f343081d2629b99127", + "size": 102601 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai", "status": "success", "path": "en/build-with-claude/claude-on-vertex-ai.md", - "sha256": "431b963e51fb1a00029ca011f80aed960abec1557124527367475d062b4bca66", - "size": 35194 + "sha256": "4ff162bffd726363f80c5155c908fe3c2cf90dfcd25bc351b8f1ebadae0a5b95", + "size": 35306 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry", "status": "success", "path": "en/build-with-claude/claude-in-microsoft-foundry.md", - "sha256": "38ec822c356a0904924cb6782203200c3e6746ac41eb47fa45e69a10e8533bf9", - "size": 39313 + "sha256": "c29a0c57959757dbd21d9cbbe33b5e8bd9832b05f2e8c3d33ef5f42e5763d4ab", + "size": 39327 }, { "url": "https://platform.claude.com/docs/en/managed-agents/overview", "status": "success", "path": "en/managed-agents/overview.md", - "sha256": "b25fa2671463904bc5fc5bcd413e7a4d7ea4ad870d225b24d0faf60042e97af4", + "sha256": "d40f99245ebcecea400d48ddf30a4ccf5c16fa76135073411d63943b61b2e779", "size": 7758 }, { "url": "https://platform.claude.com/docs/en/managed-agents/quickstart", "status": "success", "path": "en/managed-agents/quickstart.md", - "sha256": "4589a8e538f5b089ad2403e5df726d417d82220d45723927b8c4bab9ac58d40a", - "size": 34661 + "sha256": "b1fe56e1beccf830a7aaf1e2568de86cb8748e1668a8b038cfaead021ac07a52", + "size": 34247 }, { "url": "https://platform.claude.com/docs/en/managed-agents/onboarding", "status": "success", "path": "en/managed-agents/onboarding.md", - "sha256": "f01195da20a47aef6b6951d22ed6250ca5233c1ad6e8a87df9d9707fbe94ef37", - "size": 4185 + "sha256": "ecc40eb5e85bf27ccb7910232300c599020d362875dcbda08e104a99af3ec4b8", + "size": 4208 }, { "url": "https://platform.claude.com/docs/en/managed-agents/migration", "status": "success", "path": "en/managed-agents/migration.md", - "sha256": "260154c39a5cb918cff08a9c134295152432d9ca376199482126885067268c96", - "size": 54435 + "sha256": "4723aa3b08c5e3a82b0bf9a21f6a35d447a9c6bed48635d8cc5512ecd469e5fc", + "size": 52907 }, { "url": "https://platform.claude.com/docs/en/managed-agents/agent-setup", "status": "success", "path": "en/managed-agents/agent-setup.md", - "sha256": "1885c2ac82d4d5ad1417e61f2f13e5f88e92ad9ed1836ff7e0400ab118ca06bf", - "size": 40860 + "sha256": "8bd73a5110106059dc818065f14818b04d0aec84bedf32d3d0511fa63247ad0c", + "size": 40557 }, { "url": "https://platform.claude.com/docs/en/managed-agents/tools", "status": "success", "path": "en/managed-agents/tools.md", - "sha256": "78b81519f7860f4f2fe82d471c28fb5c1434c0ce8f909e19363d4562fc10ff97", - "size": 20533 + "sha256": "9dd4f5dccc603296eb7f15ad81b6f1d83efe7756855ff936d88f43aa2fbd5e44", + "size": 20029 }, { "url": "https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions", "status": "success", "path": "en/managed-agents/tools-web-restrictions.md", - "sha256": "b86c56754819c70783bf2195211fc9cced79eb18208185c2b0605935e5d56026", - "size": 29941 + "sha256": "850868b817d1c4c90113009ddf87fccd387b85e8a3454602243eb9c997158a45", + "size": 29924 }, { "url": "https://platform.claude.com/docs/en/managed-agents/mcp-connector", "status": "success", "path": "en/managed-agents/mcp-connector.md", - "sha256": "19ec483419bf7556ea29bd3319fb707a63a1a41b7c965aa3a288dfb3fbf5ddd5", - "size": 19078 + "sha256": "9f041be6b8d33c6f73f913b35f2e582cef03ce225c2c6e1997336e50595b68db", + "size": 18610 }, { "url": "https://platform.claude.com/docs/en/managed-agents/permission-policies", "status": "success", "path": "en/managed-agents/permission-policies.md", - "sha256": "02198f382abaa7b881d88d30a9218a94305cc806203155b7df63283cd2bc43dc", - "size": 52065 + "sha256": "c1fd661a6124f7832c3563148b649a0487cfd7f5713d09bb573d1836c7e85ede", + "size": 48784 }, { "url": "https://platform.claude.com/docs/en/managed-agents/skills", "status": "success", "path": "en/managed-agents/skills.md", - "sha256": "7e58d54036c9b0375daf0ab5bbbc4a96f4394e1dd3af2fb3ed7925bfa8f30b4e", - "size": 23730 + "sha256": "afcf89c41413a1b7efb4548763636a7c046c43e680fbf9a1e589294a2fb815ae", + "size": 23334 }, { "url": "https://platform.claude.com/docs/en/managed-agents/choosing-an-environment", "status": "success", "path": "en/managed-agents/choosing-an-environment.md", - "sha256": "b429a78e0fed52cdef231327fa11ba016508722bee79214a7bc87ec20256b283", - "size": 11188 + "sha256": "a1af17540c4d777bab525db10597cfaee935509947a3211869bef4c3d321fae9", + "size": 11191 }, { "url": "https://platform.claude.com/docs/en/managed-agents/environments", "status": "success", "path": "en/managed-agents/environments.md", - "sha256": "299927b259b42dd32a0341bfa14099cb2e2035b87468563f417718ffb303b0b5", - "size": 36017 + "sha256": "9529ca3add6b0f3be8dccc2601845bbc61ec40e63d3d61b5b23941cc26ab9c8b", + "size": 36008 }, { "url": "https://platform.claude.com/docs/en/managed-agents/cloud-sandboxes-reference", "status": "success", "path": "en/managed-agents/cloud-sandboxes-reference.md", - "sha256": "4222b196ba5cb553bc03af254a23d3145c2b21ab04a9d1d8134a99d6746ed8d3", + "sha256": "fc5a8d922735b63a468f09525a2dbbd0517373ef05726ebc3fca8c959e2833fe", "size": 5256 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes.md", - "sha256": "01f7c83b029f54a87aafa79fb2631d04b9d5d1654664b4eb7541970dc75eefaf", - "size": 22845 + "sha256": "fe625847ad0a680ca93cd195c42d184657ca7064e71b82bd883217341c6ab18e", + "size": 22608 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-workers", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-workers.md", - "sha256": "b53de27905518cd8306521873e3c6f8272cebee46d0a3b9417083b662ce95694", - "size": 38476 + "sha256": "bf7739c4581b83376e1355afbb248ace5bf8b7f56b3f6d9d0f76d8e75787a61c", + "size": 38505 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-memory.md", - "sha256": "29ff4d8155efca734ee3229cd77d097c7829c8e4114b9879535d4b6d091b49fd", - "size": 11203 + "sha256": "f297a5adcbee17ec12a6be94a445bf44e5694823b91b8a007eba3e52c3c9c057", + "size": 11215 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-custom-tools", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-custom-tools.md", - "sha256": "e0ae0f22ae0a844fdeecc22e1e88a0a067641ce4b16c5e5e2fae79db85a4e280", - "size": 36152 + "sha256": "9c1d5f330f90b3ef46557aac43a395a3ea5fd95d5f8fce3bbdcb991b42ddd78c", + "size": 35858 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-operations", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-operations.md", - "sha256": "50c574ee503094379775ad4a0d3b3f1baf144da512a04f46a722a7d45dd295f0", - "size": 18760 + "sha256": "34d412632cdee0717a159759bbc7b361c6b5bb108db21f4249cd6bec7245bd80", + "size": 18709 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-reference", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-reference.md", - "sha256": "b0c1518bee8ee25f546563a25ee764435d2c53d10c627af5f98a04ae15d6e3e2", + "sha256": "0fb919a9dff4224339c6ff49199a3c2b407e133771c00cad524670476f696d9e", "size": 22649 }, { "url": "https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-security", "status": "success", "path": "en/managed-agents/self-hosted-sandboxes-security.md", - "sha256": "99639598df4b9f0927401de176eb447e777443a8fef140058c6ca1909c572e05", - "size": 5317 + "sha256": "6853b679f05335198dbc47afc11d3952c9ec987b3901a68d71a836fc34dcbb6f", + "size": 5305 }, { "url": "https://platform.claude.com/docs/en/managed-agents/sessions", "status": "success", "path": "en/managed-agents/sessions.md", - "sha256": "eced185749c2c8b31b47829b46f8a92ab81ca9d35429de565dd36cd19d4a8a21", - "size": 44223 + "sha256": "ce397f663b32912bb87934ab8636da72aeaf108277405f91b917c7c28469fb0b", + "size": 43148 }, { "url": "https://platform.claude.com/docs/en/managed-agents/session-operations", "status": "success", "path": "en/managed-agents/session-operations.md", - "sha256": "4489523c14d525acf3804d93de8fc2a6fa03b5ff660a52c4fed203ead74b422a", - "size": 28985 + "sha256": "9fa64c714e9bc171e2ffe609bd2dfd87fa65677dea1112422ce9f6795926b62b", + "size": 28315 }, { "url": "https://platform.claude.com/docs/en/managed-agents/events-and-streaming", "status": "success", "path": "en/managed-agents/events-and-streaming.md", - "sha256": "f197e08a2e31b175fa4a09a70b38fd32bbf2fb1b6ec9e3067d8ca055c817aef0", - "size": 68765 + "sha256": "b810e6a77000cbbcf09d445ccd2aa44ccc1301ac481d09b54114e35d8357dede", + "size": 66656 }, { "url": "https://platform.claude.com/docs/en/managed-agents/event-deltas", "status": "success", "path": "en/managed-agents/event-deltas.md", - "sha256": "fb5427b09dcf6a47725283ffe8366f21c2e25a3f053d7770b1d60f0addebb306", - "size": 41708 + "sha256": "c25a9e4955945de30d977063ee7955a1f09fbc7a1a23cd0ddb603614a1759565", + "size": 41449 }, { "url": "https://platform.claude.com/docs/en/managed-agents/session-observability", "status": "success", "path": "en/managed-agents/session-observability.md", - "sha256": "5188f9ad872f1bf3bdbd766cd0336d18a45cb1bae146131e36e38438496e683d", - "size": 11456 + "sha256": "36d4fcb35da40aa67fe6c2d0103bfc2e7db53ce682e6726cc3167abfa0473f88", + "size": 11451 }, { "url": "https://platform.claude.com/docs/en/managed-agents/budgets", "status": "success", "path": "en/managed-agents/budgets.md", - "sha256": "db4b9af6fe125481ac5f8d1db24105c4a79d23b7f708796ae7bc378680700f82", - "size": 25934 + "sha256": "f6d885541190d4fb911959c9d996cb8c8609cca25280492cf1d740fe7a0aa462", + "size": 25758 }, { "url": "https://platform.claude.com/docs/en/managed-agents/webhooks", "status": "success", "path": "en/managed-agents/webhooks.md", - "sha256": "ab3fbf15ba4a0ffa43d29862ca70c8ae98e16086f82d152ba0c5f60b584b2352", - "size": 33690 + "sha256": "024f20625c6b088eb179561d09bc76c39ad23e1097e39a3fcf77ebd7aa6c934f", + "size": 33747 }, { "url": "https://platform.claude.com/docs/en/managed-agents/define-outcomes", "status": "success", "path": "en/managed-agents/define-outcomes.md", - "sha256": "58765904efaac636cb7b8340a74c86f7c052176a7119d7ca45f11a9463f6fa20", - "size": 32215 + "sha256": "e0131b3d7fe1492ab16cc685c06709e56a58c2c1f571987a87e39a368783c89a", + "size": 31715 }, { "url": "https://platform.claude.com/docs/en/managed-agents/vaults", "status": "success", "path": "en/managed-agents/vaults.md", - "sha256": "a4235c91e59f5360575f4b9c30f170e33e6ff7030fee9b0f7ceaa47b32ad508e", - "size": 49208 + "sha256": "0c240ecb59fc8e157dd4e762f2e5ff979d433dfb644951788d757441031261a9", + "size": 48046 }, { "url": "https://platform.claude.com/docs/en/managed-agents/github", "status": "success", "path": "en/managed-agents/github.md", - "sha256": "27024db0c23cdc927b8264256822fb1349f5599527c76f21fd4530c1664c01a7", - "size": 30759 + "sha256": "2e8a128ae96d3a4f53e0327bb921061ed6028afa7a509883bac4091f699fce63", + "size": 29791 }, { "url": "https://platform.claude.com/docs/en/managed-agents/files", "status": "success", "path": "en/managed-agents/files.md", - "sha256": "27845812cf2e158b9e9301a05363b1d268a0c211fbd2849f938a6f226e286cf1", - "size": 23090 + "sha256": "89a4bc3de2e30572bee3571fbe4603b8b48c5022f5ae7b9ffac89a6b05839424", + "size": 22444 }, { "url": "https://platform.claude.com/docs/en/managed-agents/memory", "status": "success", "path": "en/managed-agents/memory.md", - "sha256": "63dda473f3a98ec8cc5cc618f6b6bb0d178deddb3832f3dd6ad6e659171b5ecb", - "size": 49412 + "sha256": "1b67c3f8f0864a482fdf6f556b328acb9175dc2a278a0729f31ed1be9b9bfcf1", + "size": 49252 }, { "url": "https://platform.claude.com/docs/en/managed-agents/dreams", "status": "success", "path": "en/managed-agents/dreams.md", - "sha256": "d140425db506cbe5c327d3d392f889bbe986a2ee2b56d33f1a849ffee707dce1", - "size": 25680 + "sha256": "c1e342e89e9233491441f9d3c93a1ae9b6410f11a8ecd1fd22a5557c6022b0fc", + "size": 25357 }, { "url": "https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration", "status": "success", "path": "en/managed-agents/multiagent-orchestration.md", - "sha256": "501c8c6337df141309988b96eba6333a6207c1a690510c6d2451cf3fe700967d", - "size": 72243 + "sha256": "ab7d3a3b33e6d66a31b6b404c7a48be40b17f19c9897e5d06601b43fb3976d8b", + "size": 70633 }, { "url": "https://platform.claude.com/docs/en/managed-agents/session-threads", "status": "success", "path": "en/managed-agents/session-threads.md", - "sha256": "822541ecf74350ed3f170e973e060a420a2f5c74e4a3e1a4e793d34c42a59a41", - "size": 37418 + "sha256": "67b046640680cd5695872af03b6c9dd7a3d678add120293d72fe8bdfec7e355a", + "size": 36763 }, { "url": "https://platform.claude.com/docs/en/managed-agents/workflow-runs", "status": "success", "path": "en/managed-agents/workflow-runs.md", - "sha256": "022130b85c599881c7dbd208b5cd22cc09e0c2f0f4c4c7762532b435c608a7e3", - "size": 77181 + "sha256": "d26b50717cfa5a522bfb86d14851909e31379a9af3a1535b8454b397d42a15c2", + "size": 76473 }, { "url": "https://platform.claude.com/docs/en/managed-agents/scheduled-deployments", "status": "success", "path": "en/managed-agents/scheduled-deployments.md", - "sha256": "7144fc0094e871d009af5f1cb94705abf71af6c28bfde90d94282f9508f36dc9", - "size": 29851 + "sha256": "c35260386114819dec5c573b2acd5a568801834f50c08bdac8dd230ee8cc1222", + "size": 29268 }, { "url": "https://platform.claude.com/docs/en/managed-agents/secure-deployment", "status": "success", "path": "en/managed-agents/secure-deployment.md", - "sha256": "372332d48ac29122407602b6e8cee184aebbb240268c746c9813de0bdd12c16b", - "size": 69993 + "sha256": "b43bcc040ddb8cc4f2d3e8b15c78d58895dd320ae6b107e77b2bd975c525d970", + "size": 73190 }, { "url": "https://platform.claude.com/docs/en/managed-agents/secure-deployment-monitoring", @@ -926,57 +926,57 @@ "url": "https://platform.claude.com/docs/en/managed-agents/secure-deployment-risks", "status": "success", "path": "en/managed-agents/secure-deployment-risks.md", - "sha256": "6c6b826d3c2f7310711ad84eb0345b0268a965df8fd157e107a7c4dd8fa9d4d6", - "size": 8752 + "sha256": "a102df9e6514094928c78cd4dc8dd236fc3a96b4de97a682935cc8d0fc8ef437", + "size": 8754 }, { "url": "https://platform.claude.com/docs/en/managed-agents/reference", "status": "success", "path": "en/managed-agents/reference.md", - "sha256": "1c0d8e60335785f83ec6fd27ffd08cccc335c8e43f09e67b1208bf6878b59c9d", - "size": 27461 + "sha256": "3dcacc717382d42dd0f6e4c127ba1030a4a0739c450d430882d0b19fdf832cea", + "size": 27446 }, { "url": "https://platform.claude.com/docs/en/manage-claude/admin-api", "status": "success", "path": "en/manage-claude/admin-api.md", - "sha256": "68c83792b739710a748af397fbe97d66dd33eacd6788876ea727a8850fd7da67", - "size": 54470 + "sha256": "47e253a8c7627ae487c4c6d9d807ee7f07726e2875503d6b3d5e301514bd99a2", + "size": 54310 }, { "url": "https://platform.claude.com/docs/en/manage-claude/user-management", "status": "success", "path": "en/manage-claude/user-management.md", - "sha256": "868808a01d44ee57d9cb2af76685cc08083202f971ea8481b9886841b5bcb3f4", - "size": 87657 + "sha256": "bfb5857bc0ae4d461498090d8fdf51687cf310ba7ac1cd4c98dda37a341a2808", + "size": 87445 }, { "url": "https://platform.claude.com/docs/en/manage-claude/plugins-api", "status": "success", "path": "en/manage-claude/plugins-api.md", - "sha256": "8feacfe74b21d69b7c6b4d2149e11283d83b7072a39233d6882c66e8854f3ed9", - "size": 182132 + "sha256": "704b1d9e90a12318da3331c501bf91e7f7ff24c4f4aba5c349195c64837924d1", + "size": 182201 }, { "url": "https://platform.claude.com/docs/en/manage-claude/workspaces", "status": "success", "path": "en/manage-claude/workspaces.md", - "sha256": "2c2f12d048237824bf427210be8f0e95ba68be5ba5bcea802bc9410ab0a4633e", - "size": 45554 + "sha256": "f317e73890fbc440ea9eda1014e8d0c5fa2c4ff1bfcf40addb65f6b8ccd94e63", + "size": 45523 }, { "url": "https://platform.claude.com/docs/en/manage-claude/organization-webhooks", "status": "success", "path": "en/manage-claude/organization-webhooks.md", - "sha256": "c43238133f8d2406dd988def87251ca784ec95dbb9dfa95ef97a9088669a53e1", - "size": 21052 + "sha256": "34ebca1a9217a96b55519034bd97fc91703d5aee0f6db192a715600b8e7c32a7", + "size": 20934 }, { "url": "https://platform.claude.com/docs/en/manage-claude/user-profiles", "status": "success", "path": "en/manage-claude/user-profiles.md", - "sha256": "09c8679d52ec75ec4bf7293822a80ac5e822c2034d9c61bc454bc9331f657907", - "size": 30688 + "sha256": "1c0e26cf51112e809c62548ad0031d5c098a6e4d9a36cd0e31c4dca31cd449dc", + "size": 34199 }, { "url": "https://platform.claude.com/docs/en/manage-claude/user-profiles-verification-portal", @@ -989,169 +989,169 @@ "url": "https://platform.claude.com/docs/en/manage-claude/admin-api-keys", "status": "success", "path": "en/manage-claude/admin-api-keys.md", - "sha256": "ae974f7a54778f8535164149f9924a15184b74efdeaeaf6318b106797eb6aa02", + "sha256": "7c82b81b1ebed3164fb0103dd7e2c13387d66338bde624fc351cd16830c1f24c", "size": 17684 }, { "url": "https://platform.claude.com/docs/en/manage-claude/app-attest", "status": "success", "path": "en/manage-claude/app-attest.md", - "sha256": "a4360c5330b8b6a033f998d4dc802ea5172c09a0b12b7865a8e12c693f73b64b", - "size": 4571 + "sha256": "b2d7753612325d03ef9ab45337cc3e3c29e8a667d734a392e59472d0521b4762", + "size": 4569 }, { "url": "https://platform.claude.com/docs/en/manage-claude/workload-identity-federation", "status": "success", "path": "en/manage-claude/workload-identity-federation.md", - "sha256": "01b276dd224a70858b74c79d52ca4c9c5f398404abb2789785af9b505e1531b8", - "size": 26364 + "sha256": "4ef04a74350663c1e7dfccbf24e5f0263f54a70b36f4eb16f38be1c7c9ecee10", + "size": 26374 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-admin-api", "status": "success", "path": "en/manage-claude/wif-admin-api.md", - "sha256": "caf882dc13d80b33a51796bb0a70b98cfe0c8b3e8135e57ee8cd77b0bd720446", - "size": 46618 + "sha256": "fdb46dd2d38cb17606ff284cc6b1219901396acf122f80beaccf505493a3468e", + "size": 46611 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-reference", "status": "success", "path": "en/manage-claude/wif-reference.md", - "sha256": "aba756d214e0a9b9c393c3bb94148e7aabd5c18a7fd4180d5cbdd875a7803b5b", - "size": 47306 + "sha256": "cb08d80ff7849f70e1f6a09de2a865428b7ff7c253601fd31738afc11ee6886b", + "size": 47279 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/aws", "status": "success", "path": "en/manage-claude/wif-providers/aws.md", - "sha256": "712ef288dbace6585848135ea1702ca48ad2bd1046abeed0483970adec2f314e", - "size": 34975 + "sha256": "8828b57924878212d41881f8d9a2c73b267a4259cd5d1d69049f26d4f2c4fb79", + "size": 34919 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/gcp", "status": "success", "path": "en/manage-claude/wif-providers/gcp.md", - "sha256": "28d0ef45c2730489f3abd2e375b8a755dbeb0d50405c2d2a9437e088d595f75b", + "sha256": "d04893ddf3b533cf15de7b8cc5eae3acfb434a078c0a00e4f39392c181256806", "size": 22557 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/azure", "status": "success", "path": "en/manage-claude/wif-providers/azure.md", - "sha256": "e8ffe009dbeac2ff4beca52ec3cab90548f659afcf43da749b96dc75f7adf216", + "sha256": "b9d44d32fbe3f171764ccdee345efc00db8e7c34e85bef85780f10cc13349ab2", "size": 70012 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/github-actions", "status": "success", "path": "en/manage-claude/wif-providers/github-actions.md", - "sha256": "d07cdb3e282fe73fee6301ebcdf83ecf8d7da76ae41009a2d7eed233f8d56979", - "size": 14844 + "sha256": "6beae92ce8bcf1ca8c6f331ee723128523839b2edfcc21d5f149779e57de9c5a", + "size": 14835 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/kubernetes", "status": "success", "path": "en/manage-claude/wif-providers/kubernetes.md", - "sha256": "9d7c407fc3d0f0f3bc631d49b230f6744be03d1e95666235eff4f7a89eb55a39", - "size": 14503 + "sha256": "97f0c28ffddd0c90849c9c55b9d9e3e81bb45c8f5ae0495dbf339971ee318c4e", + "size": 14501 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/spiffe", "status": "success", "path": "en/manage-claude/wif-providers/spiffe.md", - "sha256": "c97174216ef0892fa0a535853f870c5e20a6e3116f356dcb9ff0c0bab655c08b", - "size": 30605 + "sha256": "f53a12003527f70dea9c6e453bcd247a23dff22c8e963b9ffdd7e818bcf830be", + "size": 30608 }, { "url": "https://platform.claude.com/docs/en/manage-claude/wif-providers/okta", "status": "success", "path": "en/manage-claude/wif-providers/okta.md", - "sha256": "f8eba59abc2d27f172cbb8356574ef7eac38be3484002d1ad0126d80b9b70711", - "size": 24236 + "sha256": "1fc38e27973dfcd80f061e276aa44e18541069708e659229f2b15c19bec6e603", + "size": 24246 }, { "url": "https://platform.claude.com/docs/en/manage-claude/usage-cost-api", "status": "success", "path": "en/manage-claude/usage-cost-api.md", - "sha256": "3cecb210a08f1ba46b13d4d2ac179b79e2298221f69d763f3107dab45d030489", - "size": 16860 + "sha256": "f6df596832f94bff11887ec6e08de686ce279fa7f35b7750fc3e8228736f4672", + "size": 16879 }, { "url": "https://platform.claude.com/docs/en/manage-claude/rate-limits-api", "status": "success", "path": "en/manage-claude/rate-limits-api.md", - "sha256": "670a4cfbc51983902c924f5a6012af83b72aece8bf8bfb4a7ee817a21009401d", - "size": 39173 + "sha256": "82ec0cd8a886e779ff3284aeaab59f1f7c14f4c389f92e41a790eaacbb7adeff", + "size": 39731 }, { "url": "https://platform.claude.com/docs/en/manage-claude/analytics-api", "status": "success", "path": "en/manage-claude/analytics-api.md", - "sha256": "80fe64eecbc8d373e5f2f67f635e612988a8aa792b00249da0dc029beaefeb1a", - "size": 14100 + "sha256": "3b2db8692039ce6136ce51040e8ff3e54049c26fe6fde9be3f1c6b168c78f71b", + "size": 14095 }, { "url": "https://platform.claude.com/docs/en/manage-claude/claude-code-analytics-api", "status": "success", "path": "en/manage-claude/claude-code-analytics-api.md", - "sha256": "46681f8615a45eb862992a60a0041ed31ddf2e0dcdadc066ac919556a7cffbb4", - "size": 14075 + "sha256": "c27275b8a8093bbafa9bc853035eced0116e71cfe3ba4598eabfa8c5677c6a6b", + "size": 14087 }, { "url": "https://platform.claude.com/docs/en/manage-claude/spend-limits-api", "status": "success", "path": "en/manage-claude/spend-limits-api.md", - "sha256": "899b486d96d36450ad16182d468f779a098b181e3c868849ec05f2524fefc3da", - "size": 82644 + "sha256": "2c9d726e7b8eaa1c4630356772e81d87fc4b52f3877943754f0397bf33f07739", + "size": 82675 }, { "url": "https://platform.claude.com/docs/en/manage-claude/opentelemetry", "status": "success", "path": "en/manage-claude/opentelemetry.md", - "sha256": "2a80789d102c85a2f7aa2959ed24f75f511556d661aa8bec3fd1438db8bef5f6", - "size": 26794 + "sha256": "476265481cfe814f4ae0dd296b03907f0089835a072e01ba5249976019cbdbff", + "size": 26515 }, { "url": "https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk", "status": "success", "path": "en/manage-claude/opentelemetry/sdk.md", - "sha256": "0c280478db23f295ef12c9e8d01bd204553a4574ab6e7b83767a441afeb6a713", + "sha256": "f86f7ea05d341159590aea487e37d35e3cbffd0eb9ac55b9a72892bf9ae7fe3a", "size": 31922 }, { "url": "https://platform.claude.com/docs/en/manage-claude/opentelemetry/api", "status": "success", "path": "en/manage-claude/opentelemetry/api.md", - "sha256": "cf7b309cbf572fb7364fa053fbd018a9651a4f1e35e6a330a82cac7214115c36", - "size": 40964 + "sha256": "40bb48a55d1258b1138923dc04fa72ef4d4b3dbdb134d5e137407bb9832461c8", + "size": 42284 }, { "url": "https://platform.claude.com/docs/en/manage-claude/data-residency", "status": "success", "path": "en/manage-claude/data-residency.md", - "sha256": "b3b762253e5f0e2138d3041f136f7b3f65e8397d87c24affa384b42e84028ba8", - "size": 15351 + "sha256": "68c442adb020bad556eaf14f5ecc6192e9173d99894556594ef1251b00ae231c", + "size": 15345 }, { "url": "https://platform.claude.com/docs/en/manage-claude/api-and-data-retention", "status": "success", "path": "en/manage-claude/api-and-data-retention.md", - "sha256": "766c1c0acaa0ed9d704f732b6e86bcd512455e20624ebd1e2aa08e14427fcd16", - "size": 60878 + "sha256": "76e09f78d63bda799424837315745f17bfe658b16cb0190b05adab3c3cad9d27", + "size": 61461 }, { "url": "https://platform.claude.com/docs/en/manage-claude/access-transparency", "status": "success", "path": "en/manage-claude/access-transparency.md", - "sha256": "5b9858f7c22fb6799ada68a52d8d9697c231118e82158ecb4d74a6e2a2c38ed7", - "size": 25158 + "sha256": "e34b58079c789c921d5276daef18f66091c5343596125a9f6b60b3cfcdfd1ff4", + "size": 25143 }, { "url": "https://platform.claude.com/docs/en/manage-claude/access-transparency-log", "status": "success", "path": "en/manage-claude/access-transparency-log.md", - "sha256": "079e057e9420d2503a49919686ccc655e0d32befda265dd2f19cd1cfd86ad3d1", - "size": 56841 + "sha256": "f9721c4df9b5231d8b9cad5db002509cd68bdcc93bdd7244e5964d967c9d0dcd", + "size": 56864 }, { "url": "https://platform.claude.com/docs/en/manage-claude/cmek", @@ -1192,85 +1192,85 @@ "url": "https://platform.claude.com/docs/en/manage-claude/inference-hooks", "status": "success", "path": "en/manage-claude/inference-hooks.md", - "sha256": "652c0827048cd9fca868fba42d8a74f0ae769968a5d147c13ba4acaefce21a38", - "size": 12746 + "sha256": "2d15ae2296d7fc03f9509f3ad911eecf089d000990f110de16b97a5848ea0f80", + "size": 12770 }, { "url": "https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration", "status": "success", "path": "en/manage-claude/inference-hooks-configuration.md", - "sha256": "56a75c1d356642191e0026fdee5918896c2faaefa1521936850ab27c9d27e857", - "size": 22790 + "sha256": "8c445052ab2c5cebfc3b858a71f3e131717802137810b8b83db155e88b1fb1da", + "size": 22832 }, { "url": "https://platform.claude.com/docs/en/manage-claude/inference-hooks-endpoint", "status": "success", "path": "en/manage-claude/inference-hooks-endpoint.md", - "sha256": "b9ae24570ba6f0df43491b96a18c5752d373d270f8c28962ebedffd44a92ba12", - "size": 52842 + "sha256": "eb0133ca307fa63ba9ea3c4489769d410c79fac2fec168da22dc5acb15129695", + "size": 52879 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-api", "status": "success", "path": "en/manage-claude/compliance-api.md", - "sha256": "325206be4422164ba5077faeaca4ad3212d84d970734aa7f99840a91e6c987b8", - "size": 10161 + "sha256": "bb8261a0f48a6bea45e615c0bb48d541a3d838e310be853d263518e14f9041dd", + "size": 10158 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-api-access", "status": "success", "path": "en/manage-claude/compliance-api-access.md", - "sha256": "099995a689bda9984bc87b2fdb072a0d2836a91b47970d4e1ceecb49bfcf5e82", - "size": 17744 + "sha256": "f1787c44bff7b624c542df4b41dcdecaa6aab67e3400b36c9ee726e037f21405", + "size": 17743 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed", "status": "success", "path": "en/manage-claude/compliance-activity-feed.md", - "sha256": "b3ddc571abf94de5a6ecfdefaea7f89827f49831f336234456c93515d8d8f223", - "size": 17912 + "sha256": "dd26846e0484912b27af1b672031cf045195902b8ab9c7835bfbd5be58d64520", + "size": 17864 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-content-data", "status": "success", "path": "en/manage-claude/compliance-content-data.md", - "sha256": "5c2c1a7a8cd500dc5d137fd54b837437436e7e162e6ca3995eb3998ddf9661ca", - "size": 26295 + "sha256": "4a5423cd32aaeb8e092393470a2cfd4e18e622583c64caf4c301657b6248d897", + "size": 26244 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-sessions", "status": "success", "path": "en/manage-claude/compliance-sessions.md", - "sha256": "c7328129ef6b8deb5381f332e229defe333d7abdd543364e9ebf07126d453ef6", - "size": 54563 + "sha256": "76cd8c719d4a3dbb1bb0987ee5e57e679b10cbd515bead62a5f5d10ec5e9afd5", + "size": 54543 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-org-data", "status": "success", "path": "en/manage-claude/compliance-org-data.md", - "sha256": "07e7f5e1fcd35d18af302a1739555a1bd29053292fba9e58c03ff549e8447523", - "size": 26646 + "sha256": "86f064290c8ecdd561aaf41963f1e3f0cd9b309db2c897cc3f62ca0e8481d324", + "size": 26648 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-integration-patterns", "status": "success", "path": "en/manage-claude/compliance-integration-patterns.md", - "sha256": "d8aec5f0b0d3027a373cef1dbe8971626ba47e09b9ab9dcfdebf2a05c1ea7fb6", - "size": 18088 + "sha256": "cebd613ca7e45f4cacb8daef0dd4233f18a5cd39bdc66faf9787a15e23519d37", + "size": 18073 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-errors", "status": "success", "path": "en/manage-claude/compliance-errors.md", - "sha256": "0bc48dcba2dc356eabc8bcea3448550ffbd76fd5c16782d75c8ee6ed13247def", - "size": 55478 + "sha256": "f565f5dd1d303855398c5e67a7ce4cae67a35cbbc29cd9783cc68dbd14b2836c", + "size": 55477 }, { "url": "https://platform.claude.com/docs/en/manage-claude/compliance-faq", "status": "success", "path": "en/manage-claude/compliance-faq.md", - "sha256": "c25635d29b5bdd0eefcf535b4196e63ab89246227222a3e490ef25b607c5a993", - "size": 26801 + "sha256": "4dfd4809a213f92470d50adf709984589f68c6827e8245a8de0dd73ffe233748", + "size": 26799 }, { "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/overview", @@ -1283,29 +1283,29 @@ "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/ticket-routing", "status": "success", "path": "en/about-claude/use-case-guides/ticket-routing.md", - "sha256": "7173a5837b8a0cd5c48ad779515a861f45d821a4508373a7e3efddebd2ff1ada", - "size": 75040 + "sha256": "89211f6aefe70c25f5e859064232b09dc474fdbb9f1ad0a61a880e4a8e356484", + "size": 75146 }, { "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/customer-support-chat", "status": "success", "path": "en/about-claude/use-case-guides/customer-support-chat.md", - "sha256": "2b884d7d090973573aabc98e9a91e637a138fbbcbeec75f47b76be94ba8f73b5", - "size": 55476 + "sha256": "7435447f5e77c0d7bdc0df01f6c23e4dd26ab90e97a711b1770a80f06a8c870c", + "size": 55004 }, { "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/content-moderation", "status": "success", "path": "en/about-claude/use-case-guides/content-moderation.md", - "sha256": "7c430d14ad0bba47ea85d02c6e401f4ef1ccaa8f85aa4f121eddf235e318e8d4", - "size": 115162 + "sha256": "9be8b8d8a044b467369b0910319e89cbb927968d0939758bc3bbc9e442ad5396", + "size": 115213 }, { "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/legal-summarization", "status": "success", "path": "en/about-claude/use-case-guides/legal-summarization.md", - "sha256": "11267b60d8c38f470f21de051b2c76860b57d4fdb259bbc729de7790ef42a3b5", - "size": 57882 + "sha256": "00f6bf54f8c08443c4d1e89311952f765f722ad9aa1dd86befe8844e94741d9a", + "size": 57935 }, { "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/commerce-agents", @@ -1318,225 +1318,225 @@ "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview", "status": "success", "path": "en/build-with-claude/prompt-engineering/overview.md", - "sha256": "00b38d6bb7f54f72b7b0f4c138d4474c7e086aa4c07b9329caa051870de94bcd", - "size": 2812 + "sha256": "cbd28e3fa05da7afd15cfb011e6fe653b4c2da453c398b6863a9b5c48fb61962", + "size": 2806 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices", "status": "success", "path": "en/build-with-claude/prompt-engineering/claude-prompting-best-practices.md", - "sha256": "e9bd30b6abd49cc42549387cfa7a4cd9946d79d0eb7ed2a1c12f4cf431ee04f4", - "size": 74447 + "sha256": "21a866aa68b8fd00667ed14ffffb60b405168ce415c4dbe128a14bbacb0bb978", + "size": 74503 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1.md", - "sha256": "b921ea4d827411b3f4401fd5c92021eb7166c6c5642688321a3780297d8b5497", - "size": 55151 + "sha256": "1209e6f1f08388108855450c70c04d08b01aea587e3eb92c61646091343c40eb", + "size": 54924 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-fable-5.md", - "sha256": "f10e377e6a6d53f848db16c58f6bb23d7e1c03e475788e87d0c6bd99d03603b2", - "size": 19305 + "sha256": "9a4d1966c0c7724673f890cc7b6f48bd84d0b01ff32504364df21ed64461131a", + "size": 19324 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5.md", - "sha256": "3432e66ac97f77b45e1ecba014c9d6d0001be7ab47b55ebe8c70f5aa55883a14", - "size": 28753 + "sha256": "04956a0f74c2f38781e354a4e3df1b2d5fc701ad691f33c31c66f030e201b6ea", + "size": 28879 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-opus-5.md", - "sha256": "e73cd26863642596486a43f90ff9c04d13f8e4b6cd00ae83546d4d3cd93c5143", - "size": 12902 + "sha256": "4ca67ba8e89375f49a2d36efe94a6af1757ced731610cd02a1e2899734236c9b", + "size": 12941 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8.md", - "sha256": "9f67fae4a2a5037da7517cdab7691c61b6c85760dc089146160475579a243b3a", - "size": 16514 + "sha256": "284215e1634f7c6df51d088d60dce340d2b77a93c239911a521c9b56cbd4fc83", + "size": 16518 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5.md", - "sha256": "6886cdd2625b73be5bd74420e31c3a050c1c52b8073b9bebe15f4dcf33e44f91", - "size": 27949 + "sha256": "f3617ae74a4ad28dbbcedce7e465bec585659fc46fcdb1052e013da4c417ca77", + "size": 28031 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5.md", - "sha256": "560089d4c75943749b7a81afdf628290c518713e8e82aff88b389c5cc5544c8e", - "size": 15963 + "sha256": "300753efed8782406642119a51a2a3c7f47668254c38d0d65df83777a0e98620", + "size": 15966 }, { "url": "https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5", "status": "success", "path": "en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5.md", - "sha256": "e871a37701e88998c5bed2e15c586048c86d3d8ab5c333a67c60ad717e0131fd", - "size": 15006 + "sha256": "feae12ab2bd28ae3c200ac438e2b3652d632898550b23545099154fa08596e36", + "size": 15010 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/develop-tests", "status": "success", "path": "en/test-and-evaluate/develop-tests.md", - "sha256": "ecc98b539689526778b73c4f9d62dd61de7dc764bc5bd1c1eee84c7ea29bd42a", - "size": 153067 + "sha256": "55bf56219b827dc817fb176672455465d43153fe7c782e8aae2857a19d98ea13", + "size": 153085 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-latency", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/reduce-latency.md", - "sha256": "6d76f277e68101da168479fda45f065e270c06e004f17bdf17d6b35589914006", - "size": 11441 + "sha256": "565eacd59aa4a6ffec4b5ea5f36cfb8f798269bde1179f8126b1b4ddebc87bc1", + "size": 10826 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations.md", - "sha256": "64257357e2479cec79d656c5cee8cf7e33574ee24484c0abc30e91d4adc24e27", - "size": 4017 + "sha256": "ee678590843c4d701d19974caf13de51b3440b283b0bbfb6fd657fca8c37d08f", + "size": 4014 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/increase-consistency", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/increase-consistency.md", - "sha256": "f9199d8b674997104b7a90e287ef34fa276039529aea6eb01cb12527a4753066", - "size": 13947 + "sha256": "74f9dee8ab595972f291bb158ac6387dbc9761396aa4f136ecbc7c4606b50157", + "size": 13948 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks.md", - "sha256": "61ee75848886c04c17fa521b813073846bc4adcbbac1f829685316f8bde577eb", - "size": 12498 + "sha256": "5495a44ff5413c20f5e98ef9169f33bd28a919c13a68979c1281a7c6e02bbca7", + "size": 12506 }, { "url": "https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak", "status": "success", "path": "en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak.md", - "sha256": "db1608f147d42fb10038364945b7a688221c9eb567bcf17fac2570c3ca672d51", - "size": 3394 + "sha256": "ffe89674171ad6e3407c26ae56c7e79713218a584a481fa456cfee5df9af3565", + "size": 3372 }, { "url": "https://platform.claude.com/docs/en/about-claude/glossary", "status": "success", "path": "en/about-claude/glossary.md", - "sha256": "fc100d3a072d841cb2e77f13b652c65f3057207a127e82c36aee2d82d3ca8dc2", - "size": 9595 + "sha256": "30f18d3c81d33dd8fbc43566a72877aa5fa8ec24c3fa529a12b74a28ab0c8752", + "size": 9602 }, { "url": "https://platform.claude.com/docs/en/about-claude/additional-resources", "status": "success", "path": "en/about-claude/additional-resources.md", - "sha256": "5f8fecfe013fbd747426c5c21e1096914383c1486b5b8f7bf5cce5ed01c4542c", - "size": 1512 + "sha256": "c838859ef93dd4966227e377a61ea70cc17d58c52f29cba7881909633a2a33c4", + "size": 1519 }, { "url": "https://platform.claude.com/docs/en/models/overview", "status": "success", "path": "en/models/overview.md", - "sha256": "e45c1c8a21ca036c6638de55904540e3040c60d7547e322c3440c45faf1cb4fc", - "size": 20530 + "sha256": "86d26d2b1f39ff97f686ebf6633042048886b26ece5a1214a4b8a3352a35f692", + "size": 20455 }, { "url": "https://platform.claude.com/docs/en/models/fable-5-1/overview", "status": "success", "path": "en/models/fable-5-1/overview.md", - "sha256": "e68ae6278712f38b3d60bb4041c3d2a50115c36d27eb9ddeb3d007e9b17f3846", - "size": 14972 + "sha256": "bbc86f0ac66e84d0ea2befd302d0a1e6fb3efd302d78a58782ab34e274af8476", + "size": 15136 }, { "url": "https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1", "status": "success", "path": "en/models/fable-5-1/whats-new-fable-5-1.md", - "sha256": "3bf3caca9385e5b2a738fe280b64a26a14b666a26d02c8f6c50943ce1ed90002", - "size": 39128 + "sha256": "fbd536d426cd06d1cd8f4bb80aff06839802f589b71719d588f422554077a0bd", + "size": 40103 }, { "url": "https://platform.claude.com/docs/en/models/fable-5-1/migration-guide", "status": "success", "path": "en/models/fable-5-1/migration-guide.md", - "sha256": "561afeb1f09136abde77a5f378ead34103a7263379f7c86dfd801a86eb194d2a", - "size": 94135 + "sha256": "031a0754e490882060342763b1af500d4522b11c4d4dd0762d41df4b699b6662", + "size": 95745 }, { "url": "https://platform.claude.com/docs/en/models/opus-5-5/overview", "status": "success", "path": "en/models/opus-5-5/overview.md", - "sha256": "db3d6cbf322fadb625f19337625d9b10eaa1acb1b5565403c563dd2195bfe142", - "size": 14330 + "sha256": "7140a428547674e82699a993fdc59d0df52bc5ff77e45f0877adf2a40dfc5105", + "size": 14338 }, { "url": "https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5", "status": "success", "path": "en/models/opus-5-5/whats-new-opus-5-5.md", - "sha256": "5c52f0943bcd9e9af1f53e9038f79672d4a3e5cb196a18c330ae883592e50c21", - "size": 22099 + "sha256": "d0a31759905fbf36aa7972389cae82b1a72867b14724934cd83f28f5a6fed6cc", + "size": 22183 }, { "url": "https://platform.claude.com/docs/en/models/opus-5-5/migration-guide", "status": "success", "path": "en/models/opus-5-5/migration-guide.md", - "sha256": "87292ccb702677a92416fa00dd1a248882f3f043641fb99e99ae307ec15515ae", - "size": 91091 + "sha256": "725e52d0325163346e16b992bf7d22f4f2958da9456db86d9da8443f1307da50", + "size": 90716 }, { "url": "https://platform.claude.com/docs/en/models/sonnet-5-5/overview", "status": "success", "path": "en/models/sonnet-5-5/overview.md", - "sha256": "a8b46ef8e5942ca6e0acb324dc82f21795b6e80f3bba835e457523a22d5e6fc3", - "size": 14568 + "sha256": "bdcdf0eb05643ce9f63694842ed99ed083e19c5b2b729fbf39a142c9d7204e5c", + "size": 14553 }, { "url": "https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5", "status": "success", "path": "en/models/sonnet-5-5/whats-new-sonnet-5-5.md", - "sha256": "68db9d9c303529330ab9f974ffa0f42f8026c78136760923d1e136a552779b4f", - "size": 22820 + "sha256": "b6bc69ef3d1b9fa347be346ed65685f4b93444fad1ed1d53f3282800e5a79e12", + "size": 22896 }, { "url": "https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide", "status": "success", "path": "en/models/sonnet-5-5/migration-guide.md", - "sha256": "d67deee54553207583f1370a01843a4a00b05ce457cae21355018f4213628756", - "size": 55466 + "sha256": "95654553a0350062506967dcb2222c305ff252b96754794441564ed2b684cfde", + "size": 55331 }, { "url": "https://platform.claude.com/docs/en/models/haiku-5-5/overview", "status": "success", "path": "en/models/haiku-5-5/overview.md", - "sha256": "855f19b98e70c83526d722a72334bdc6ff4f58366097e465917cb8e6ed3a3b86", - "size": 14684 + "sha256": "2200403561aacae84bb37299c0d311793b588b1f6aca9008cb14b71ed094be9f", + "size": 14524 }, { "url": "https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5", "status": "success", "path": "en/models/haiku-5-5/whats-new-haiku-5-5.md", - "sha256": "45165c16d549ee7235125e5f30efd5253bc06310c418b60bd73b27a60c017839", - "size": 12396 + "sha256": "a83e0111c0c74a5742afb0efe945d3369c8625c7e1911efddeed4e83462c38d9", + "size": 12413 }, { "url": "https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide", "status": "success", "path": "en/models/haiku-5-5/migration-guide.md", - "sha256": "559b5d1a889edfffc4d970a8d28e75a5fac39328414e3c0abd684cf67608847d", - "size": 19202 + "sha256": "316d3265a809b0abc72a0b57ff3e70da18babe3fb040124472033a1a3ce457b8", + "size": 18887 }, { "url": "https://platform.claude.com/docs/en/models/mythos-5-1/overview", "status": "success", "path": "en/models/mythos-5-1/overview.md", - "sha256": "02ac6af64537b3db27f6520c15e748d8af66f6b36bc1c3bef2a0d9f6a3161c8a", - "size": 10904 + "sha256": "e8fb5c4634d56dad130d3fd50e5330bd3ebb2a12802989cc4030e6f98bb77bd3", + "size": 10892 }, { "url": "https://platform.claude.com/docs/en/models/mythos-5/overview", @@ -1549,8 +1549,8 @@ "url": "https://platform.claude.com/docs/en/models/fable-5/overview", "status": "success", "path": "en/models/fable-5/overview.md", - "sha256": "f5a6e9d40d3e43d78f9f1614bf4eeb32ca98d8178cd2bcb865ec1021b7b6c026", - "size": 12166 + "sha256": "f385aa2690b4d59667a8a445de75e70266af0897ead417eec90531ac9e09410f", + "size": 12169 }, { "url": "https://platform.claude.com/docs/en/models/opus-5/overview", @@ -1563,8 +1563,8 @@ "url": "https://platform.claude.com/docs/en/models/sonnet-5/overview", "status": "success", "path": "en/models/sonnet-5/overview.md", - "sha256": "58a1ca5219a72a21bd4e4a63d9f1094fdfa082caee15eae9997b88b9bf7ed6df", - "size": 12969 + "sha256": "d2d7688384ef572601f2f047537dd461cabd75988a948ebf03cc8d752933e4c3", + "size": 12958 }, { "url": "https://platform.claude.com/docs/en/models/opus-4-8/overview", @@ -1619,22 +1619,22 @@ "url": "https://platform.claude.com/docs/en/about-claude/models/choosing-a-model", "status": "success", "path": "en/about-claude/models/choosing-a-model.md", - "sha256": "3e80bced0fa5b08032870f93668b315b8b9ac48f7972c2d45f9faf694af31d68", - "size": 8763 + "sha256": "39e65adddb870c54d1de56af99e103c4a2ea17d370d4ced4c5027acca7791e90", + "size": 8762 }, { "url": "https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence", "status": "success", "path": "en/about-claude/models/optimizing-for-cost-and-intelligence.md", - "sha256": "8dd7bd3ac11f97507c013a233626121a014acb8ef697cbd2e69e467890c5d012", - "size": 181969 + "sha256": "af00fdfe22ec65adc4f4e85c52ad1ffab749e366d78e5c1fb3cd52e3cf7722f0", + "size": 182361 }, { "url": "https://platform.claude.com/docs/en/about-claude/models/migration-guide", "status": "success", "path": "en/about-claude/models/migration-guide.md", - "sha256": "5d0f9a4ff22990804f1c10a7223fb2ccd588579b72f6f9cd43dad0582634dd61", - "size": 1055 + "sha256": "6eb88eac34b9dcc52b0defa3dcba287337cd46fcacebf723ec765736e4cdcede", + "size": 1062 }, { "url": "https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions", @@ -1647,29 +1647,29 @@ "url": "https://platform.claude.com/docs/en/about-claude/model-deprecations", "status": "success", "path": "en/about-claude/model-deprecations.md", - "sha256": "ad1c50227e13e9d3e194da3cc109db9b18012453059ed792eaae178d2aca206a", - "size": 14238 + "sha256": "ce0d97cc92ff8004f0a0ec16016520f48d1042dea39c4ee51511deb86158ecab", + "size": 14367 }, { "url": "https://platform.claude.com/docs/en/resources/overview", "status": "success", "path": "en/resources/overview.md", - "sha256": "1f036206f35dda6b17fb3afab156e8cf241c672fd5c21003bb079a4a2a938627", - "size": 4109 + "sha256": "07cf3223a163f3820f05f86b3517455b1ba5920336305fc78321605022e8f7df", + "size": 4113 }, { "url": "https://platform.claude.com/docs/en/about-claude/pricing", "status": "success", "path": "en/about-claude/pricing.md", - "sha256": "d0dc6009ff1bae0023eec432d7c21d4a3b71a71e542ac350dbfd13dc85a8b862", - "size": 50428 + "sha256": "cd91b9b575a49310938ef2de2aac6bcc2d41475611516ff36c994ead2e9469b9", + "size": 50513 }, { "url": "https://platform.claude.com/docs/en/about-claude/api-credits-for-subscribers", "status": "success", "path": "en/about-claude/api-credits-for-subscribers.md", - "sha256": "2415ea4d6794619b3135961483ca59fc2a97d5e73dc1a45cb8a62705c0aedc21", - "size": 12174 + "sha256": "5abbe7ca13fe3a7616efabbff98ae8484109abb382532cd70327b8d104264a88", + "size": 12163 }, { "url": "https://platform.claude.com/docs/en/release-notes/system-prompts/overview", @@ -1836,162 +1836,162 @@ "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/overview", "status": "success", "path": "en/cli-sdks-libraries/overview.md", - "sha256": "9b4bd92f521f27c7e8f3d5e4d859e6d27ed601003e6722e1333947deb74a32eb", - "size": 5124 + "sha256": "b0ac1837d9448da213225674a8d2e014f2d60b841b7fa00e2644d5ed5be06735", + "size": 5429 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart", "status": "success", "path": "en/cli-sdks-libraries/cli/quickstart.md", - "sha256": "2c0488a7ca75010110ef57ba5e19d6cb886ef935cf833a267980948f395068ec", - "size": 5341 + "sha256": "c4c16882ea0318acef95f12233c92e6da5144502271121dcee65491212912fc5", + "size": 5347 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication", "status": "success", "path": "en/cli-sdks-libraries/cli/authentication.md", - "sha256": "82d82aa613e536ed00b1a7f634845537af8741fc6d9063f23654365ed5e51e27", - "size": 8877 + "sha256": "407283da7075395c43f114611a67e7e0ef72401f296f82dda1bbd90a3bb399e7", + "size": 8852 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using", "status": "success", "path": "en/cli-sdks-libraries/cli/using.md", - "sha256": "3cbf151a7f9329e541cdd18868160f2b2d62126b16a8c64e36bf423ddd5ebed1", - "size": 14083 + "sha256": "174386b4635e46dd43f54111f2ced1c845c229d053c0c181e9b177abc389228b", + "size": 14091 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/scripting", "status": "success", "path": "en/cli-sdks-libraries/cli/scripting.md", - "sha256": "da0ba9b3e45cb5764c9777af7380792123a6b6ff004d524dead82e164c70e508", - "size": 5955 + "sha256": "57daef2c945c01d8ac58e7447717b3153ab70978efc82c17cbf866ca61b9e877", + "size": 5959 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/apply", "status": "success", "path": "en/cli-sdks-libraries/cli/apply.md", - "sha256": "6063ee2c3df9ef98dadc13910809f08b3118587777a9839a91e375994d1b67d6", + "sha256": "21aadd1ec31537fa7571fdadc467cf10bb29126495ad34bf4ebee60b95766d85", "size": 15484 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/cli/sessions-connect", "status": "success", "path": "en/cli-sdks-libraries/cli/sessions-connect.md", - "sha256": "e8560de9ce7a70c170f00d6995f92d0484364243da50e7b6d6ff71bc5b8230b0", - "size": 4457 + "sha256": "1e64abd4ecaffc8c13088452f315f22967517b9981a36b0a0ee71216e1c79480", + "size": 4454 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/middleware", "status": "success", "path": "en/cli-sdks-libraries/middleware.md", - "sha256": "384ecf87146f4faede82e8c77d486de549a6d134ad713ed5fd9f15c05130d64f", - "size": 6762 + "sha256": "01b94cdd403152d74e0b38ecd5e32686d1a808720508bc1046d27aa3df5a19a5", + "size": 6767 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python", "status": "success", "path": "en/cli-sdks-libraries/sdks/python.md", - "sha256": "17056e0742f369e60e7e375ad0200a627cbe5106f581a7842f5bb8ba4041efbd", - "size": 26879 + "sha256": "f2f692822a42f33839f8198d99d2832db669b9b1b820dabb8e0382ce7cbaa3be", + "size": 27384 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript", "status": "success", "path": "en/cli-sdks-libraries/sdks/typescript.md", - "sha256": "e263c3872cf4c4ef1257fd08e1a1c7bd5a88bb7fe92ebd3a27f9e72872d07364", - "size": 29777 + "sha256": "3573f1c9c76453c0f696b326f0224ad39ee7efc05e443544baf426bddc52c204", + "size": 30244 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/csharp", "status": "success", "path": "en/cli-sdks-libraries/sdks/csharp.md", - "sha256": "89159a21750465295a9b72b7e9168579f504900b552575fead1d2dd824f3f7fd", - "size": 15998 + "sha256": "35326ac804621dc3365cf33d1e853dcf00337da287bc3ac8333c19e4d0ee1752", + "size": 16182 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/go", "status": "success", "path": "en/cli-sdks-libraries/sdks/go.md", - "sha256": "a48d6d19a4932f9697c1afa2bedae4c5d738108b0475f1c0b1404e36b48a635d", - "size": 26763 + "sha256": "63c99a4363f5e48859fe64b11eecad71539baf8e76d65fd350ef38fcaa81506b", + "size": 27168 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java", "status": "success", "path": "en/cli-sdks-libraries/sdks/java.md", - "sha256": "461cb97e5e52d1829cf6a32b03d13f9e0affe6cf1c442116c5d9574627f0e0af", - "size": 47969 + "sha256": "21f5ff543bddf300c3dff2e04d4c8f16a9d73439d6569429174f2465f975598d", + "size": 48275 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/php", "status": "success", "path": "en/cli-sdks-libraries/sdks/php.md", - "sha256": "1842f73a8f28fa84890115f05de2ecff41614295f95717cfa2a44c6e784522a0", - "size": 9575 + "sha256": "5d7612372a3a8c6a73024acbbd47a21086d56fa3cd529d658d7bf18a2b997c2c", + "size": 9694 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/ruby", "status": "success", "path": "en/cli-sdks-libraries/sdks/ruby.md", - "sha256": "bea65d951d85e248b7b8f1d8a16075e2440ebc0b382030ab89e985d92ab1f4b4", - "size": 15034 + "sha256": "5d2feca87938328809d8625a0730d6b79669eca513ee21f1e5b116d212d5ade1", + "size": 15363 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models", "status": "success", "path": "en/cli-sdks-libraries/libraries/apple-foundation-models.md", - "sha256": "b5ca9ccead1c9fd0cc0dbed489dbfb5e1d563a21b8f38b90dde63aed572347b6", - "size": 16147 + "sha256": "3af3cd180b414cac2d7a78e40e1e95345f61c55fd47544a9a5dcf905ad2a4b2d", + "size": 16143 }, { "url": "https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk", "status": "success", "path": "en/cli-sdks-libraries/libraries/openai-sdk.md", - "sha256": "3c1eefb7d77065671986bcf39f9070cacaf730730757ab5be72a4073ef89b862", - "size": 35646 + "sha256": "04eedee35554da9e521362eae296d9967280094ffcbc7f23f5f0142529fe57c7", + "size": 35560 }, { "url": "https://platform.claude.com/docs/en/api/overview", "status": "success", "path": "en/api/overview.md", - "sha256": "664c9cafae632da322db3fd906dd917e304cb776f1656a49add02286e03e06f7", - "size": 22349 + "sha256": "3a26361b25315d1534c4ef414bc89c2829a53591ea1ab45b34d27ff96eefed21", + "size": 22679 }, { "url": "https://platform.claude.com/docs/en/api/beta-headers", "status": "success", "path": "en/api/beta-headers.md", - "sha256": "3f3f44da38f9a1e5708acb2ea025d90f3dbf2255ac395354be901f15367a460f", - "size": 9769 + "sha256": "d5b02c8e244bb815090c75fe21514c2ffd26134a6a315b8e9c3089edf4d0e9d4", + "size": 9709 }, { "url": "https://platform.claude.com/docs/en/api/errors", "status": "success", "path": "en/api/errors.md", - "sha256": "b67a0f8df4340e6a92267a6323330432e48537d85693f74afd035ef6cc24d8c5", - "size": 33306 + "sha256": "c6fc04f579cb02b6f7e641731920e9a58f09afa37a3435e5eba890d04d27a396", + "size": 33515 }, { "url": "https://platform.claude.com/docs/en/api/opentelemetry/spans", "status": "success", "path": "en/api/opentelemetry/spans.md", - "sha256": "18cd5db32183c4408c83792c57e49860f135f5bffef186fbc35cca9406112960", - "size": 94294 + "sha256": "3ff4e0396bd622fe25ea19ab2bdb1b826254531e13ba19126277964a1e19b62d", + "size": 93852 }, { "url": "https://platform.claude.com/docs/en/api/rate-limits", "status": "success", "path": "en/api/rate-limits.md", - "sha256": "00194eb8ec221f26de4c135941be011edfa77e565dc3ef0b00bd385affe39827", - "size": 36056 + "sha256": "959581b9f4e162affc25823058a10d89d01f588908556a5e85674770d47d91ac", + "size": 36138 }, { "url": "https://platform.claude.com/docs/en/api/service-tiers", "status": "success", "path": "en/api/service-tiers.md", - "sha256": "4ddd8b5de0e3b5cbdf58938f3e11396fcbee0b965033e353ffcbc7ab44df94d1", - "size": 8817 + "sha256": "7470091b5b1f8b4aee504086ee427a6d0b8eb0bf253538b1b19e056425042fe8", + "size": 8822 }, { "url": "https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions", @@ -2004,43 +2004,43 @@ "url": "https://platform.claude.com/docs/en/api/versioning", "status": "success", "path": "en/api/versioning.md", - "sha256": "45d247cdbfa26b2872a6ba7331e24d178efde4b2b3d99f3178bc7d05f37784f5", - "size": 1806 + "sha256": "be23f72b4b64b529b0fd75b38041f0932146cdb5c34e682f66c8d3df3904b76a", + "size": 4524 }, { "url": "https://platform.claude.com/docs/en/api/ip-addresses", "status": "success", "path": "en/api/ip-addresses.md", - "sha256": "c3c62f43f063a10547c0102fc74a5398b7e396c65a3669cce2973a2a8c73f472", - "size": 1462 + "sha256": "a8d2aa1e5a61e7001ec23c9ff22ffaa5bd161c5668692a31d00bcb0fede046ff", + "size": 1458 }, { "url": "https://platform.claude.com/docs/en/api/supported-regions", "status": "success", "path": "en/api/supported-regions.md", - "sha256": "da4e956b1e51a0c435b03794b0440e93b9473ec452473ece5a1ee90cebdc503b", - "size": 2327 + "sha256": "23556f88cbb5bc7b9c9184939449051f9fadb15a708aa2c3e4b0a8dd69376a15", + "size": 2324 }, { "url": "https://platform.claude.com/docs/en/api/claude-code/routines-fire", "status": "success", "path": "en/api/claude-code/routines-fire.md", - "sha256": "28011d6b7dec9a4e0cadfc5706b0aa6086ef53f692df14e647aba4696744630d", - "size": 13428 + "sha256": "f5d9da1370dd2c6642af8f9ef0405c587c125b6c00deb0cf3bb3885d5e2d2569", + "size": 13774 }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/agent-skills/claude-api-skill", "status": "success", "path": "en/agents-and-tools/agent-skills/claude-api-skill.md", - "sha256": "7f35102b7eaca34e85c441c4dc985309a76df6032192ba99aab8225b8ba88774", - "size": 17369 + "sha256": "5c301b9749c2b138ee6beacae40fbf7b29ea8d3feb3c2980438182aee57d4664", + "size": 17351 }, { "url": "https://platform.claude.com/docs/en/release-notes/overview", "status": "success", "path": "en/release-notes/overview.md", - "sha256": "38ec4df3947563777e8156d5da98866a705fc902bc4489d2577a35380e968924", - "size": 129033 + "sha256": "e44246a59866b69fb396bb5d53fa47fd4601791d0f388131423b76c407ac132b", + "size": 130591 }, { "url": "https://platform.claude.com/docs/en/api/completions", @@ -5658,8 +5658,15 @@ "url": "https://platform.claude.com/docs/en/claude_api_primer", "status": "success", "path": "en/claude_api_primer.md", - "sha256": "04bcfe3edf6b244798d0e36315580b410f4bfae3c3c2f10867bcb05b17ef3f8b", - "size": 27300 + "sha256": "774332beff5da1b0bc65fde2007ac5428bd4362f1d68a67732fb4ee1c94e63ca", + "size": 27054 + }, + { + "url": "https://platform.claude.com/docs/en/api/migration-2026-10-21", + "status": "success", + "path": "en/api/migration-2026-10-21.md", + "sha256": "3014e18b31a24100503e97aca1c9b0a7c52cbae13b97a8ff5f9ce253a55f12c0", + "size": 85449 }, { "url": "https://code.claude.com/docs/en/overview", @@ -5700,8 +5707,8 @@ "url": "https://code.claude.com/docs/en/claude-directory", "status": "success", "path": "en/docs/claude-code/claude-directory.md", - "sha256": "cc7c1b1f2c77de338090828186f569df3b7bf6b089c01df8a4d78fa412eabff2", - "size": 28378 + "sha256": "9df085ab33aa735a66e2b7efeb3c0d93349c270fb239c157859c4da9119e4ffa", + "size": 28373 }, { "url": "https://code.claude.com/docs/en/context-window", @@ -5714,15 +5721,15 @@ "url": "https://code.claude.com/docs/en/prompt-caching", "status": "success", "path": "en/docs/claude-code/prompt-caching.md", - "sha256": "714b52ebc13d5643807a82c4274c6641fab64f59e4979dd3d437c1f58ef282a3", - "size": 41824 + "sha256": "faf9c38e2e8dbcac28e5328f1fb86b28a57fa0f1a4630ad4e6d137e8e0b0c06d", + "size": 41988 }, { "url": "https://code.claude.com/docs/en/memory", "status": "success", "path": "en/docs/claude-code/memory.md", - "sha256": "880f8371930be20fa8679619c84e2c0da2086d1b5fcd29d48ac7b27c07595a7a", - "size": 51105 + "sha256": "57effaf46f0e2f0ee63b1e80c719da46b7a3c5669a5840bb7c7ffd477d47eea3", + "size": 51390 }, { "url": "https://code.claude.com/docs/en/sessions", @@ -5763,8 +5770,8 @@ "url": "https://code.claude.com/docs/en/remote-control", "status": "success", "path": "en/docs/claude-code/remote-control.md", - "sha256": "d6ea7b5562efa238646597c357b680ffb53eb532a15c53b4a2eedb6f2294b860", - "size": 59055 + "sha256": "23a46c95af733f2bd7f08adf3a5c86a0e06992657b132e62e4df76b95c99a51c", + "size": 60272 }, { "url": "https://code.claude.com/docs/en/claude-projects", @@ -5798,8 +5805,8 @@ "url": "https://code.claude.com/docs/en/vs-code", "status": "success", "path": "en/docs/claude-code/vs-code.md", - "sha256": "214810e326489a7779c5db687ad78ab43b0126ea5d02953f9342ab3be9f3eac7", - "size": 86997 + "sha256": "8ea5063edf89c7ce1433f501136fa42ad36d675468c30cc76a2566a9b945fc4b", + "size": 87384 }, { "url": "https://code.claude.com/docs/en/jetbrains", @@ -5826,29 +5833,29 @@ "url": "https://code.claude.com/docs/en/claude-code-on-the-web", "status": "success", "path": "en/docs/claude-code/claude-code-on-the-web.md", - "sha256": "cc4eb5c4a32a199341c5bacc592dc1473740f7dc49aff2bb7215c299e8e36f44", - "size": 41934 + "sha256": "ec6bbeaf3d81e7c39926567e6501b14dbf7469f3e25f475595fcb72d9734e2bb", + "size": 42692 }, { "url": "https://code.claude.com/docs/en/routines", "status": "success", "path": "en/docs/claude-code/routines.md", - "sha256": "f77b6715d462c6695f9e949a082313cc480fedef553305761a2f187c289e5474", - "size": 40156 + "sha256": "66a0b4931d816aee9a1fc8e156f67756b9f3a5ca9ff1f248380d7c7d9889189c", + "size": 40887 }, { "url": "https://code.claude.com/docs/en/desktop-quickstart", "status": "success", "path": "en/docs/claude-code/desktop-quickstart.md", - "sha256": "06cbb4608f025923a789a378a94d29c40bdc28b5403645f1ccd17f57207e3e7a", - "size": 10642 + "sha256": "6d7f971a1886ffe95c9e229a33fb08dc0413d3c93bbbf1ec29d33a00a39cb8cf", + "size": 10610 }, { "url": "https://code.claude.com/docs/en/desktop", "status": "success", "path": "en/docs/claude-code/desktop.md", - "sha256": "d0115c65f4c78d31054ad886a3a07fc838df1c23d537e6790c6f6a4882bce2a8", - "size": 164099 + "sha256": "b7f7fa05d5f0c5d0154381b3c8f9afd00515246be19c8b95227bcc19f7902924", + "size": 163933 }, { "url": "https://code.claude.com/docs/en/desktop-linux", @@ -5952,8 +5959,8 @@ "url": "https://code.claude.com/docs/en/claude-security", "status": "success", "path": "en/docs/claude-code/claude-security.md", - "sha256": "dafc91878eada5bf710de6c7bba43d84adcc6fecb3bafb92a6756d7c549e6121", - "size": 15220 + "sha256": "41c30c500a3f05463299eaba52f296f3be1e7fb85c63b030faefa7a7082a3c67", + "size": 15058 }, { "url": "https://code.claude.com/docs/en/github-actions", @@ -6001,8 +6008,8 @@ "url": "https://code.claude.com/docs/en/agent-teams", "status": "success", "path": "en/docs/claude-code/agent-teams.md", - "sha256": "621c83a9cc20e43300019bb872ae17be0a9f3048ab5dc60c9b9ba227864e760c", - "size": 39455 + "sha256": "215467b0859639ba1af4bd81a0ae2ea26c7bbefd7e92c6b5dbc58472927855b2", + "size": 39748 }, { "url": "https://code.claude.com/docs/en/cross-session-messaging", @@ -6050,8 +6057,8 @@ "url": "https://code.claude.com/docs/en/artifacts", "status": "success", "path": "en/docs/claude-code/artifacts.md", - "sha256": "7a9cd3ab93053e864702e98f146988be33ea2fe757d45a6f9d2bd3bef4019000", - "size": 41358 + "sha256": "eaf6ba5219a1b84c6e46bb4c5062ce39b6a86084522515e59c271948c741d904", + "size": 41681 }, { "url": "https://code.claude.com/docs/en/hooks-guide", @@ -6071,8 +6078,8 @@ "url": "https://code.claude.com/docs/en/scheduled-tasks", "status": "success", "path": "en/docs/claude-code/scheduled-tasks.md", - "sha256": "4794c737b6c5b54795528abc7a9f2982a68c3875d7963a992e1cfa57c4ed399c", - "size": 17599 + "sha256": "db0464de04343531977300fd92c688db62101597fa80a148bbb953dada3b6259", + "size": 19118 }, { "url": "https://code.claude.com/docs/en/goal", @@ -6099,8 +6106,8 @@ "url": "https://code.claude.com/docs/en/large-codebases", "status": "success", "path": "en/docs/claude-code/large-codebases.md", - "sha256": "1323646a0198e7167aca34e724e9a3ba950c1196ca3661031127c5a2c317da10", - "size": 34347 + "sha256": "621870713aa5909b26ed22c4dd18e3d710cc10bd782511dd5af7b470a0e59669", + "size": 34434 }, { "url": "https://code.claude.com/docs/en/troubleshoot-install", @@ -6316,8 +6323,8 @@ "url": "https://code.claude.com/docs/en/plugins/troubleshooting", "status": "success", "path": "en/docs/claude-code/plugins/troubleshooting.md", - "sha256": "13d6a31ab4006bb3da5a1d469976dc1b40faee70f790c694736b90684b591128", - "size": 93864 + "sha256": "dfb21315b6150c3bbf15278f249b8513f65124ad7abc632a502e859709284836", + "size": 94315 }, { "url": "https://code.claude.com/docs/en/plugins/loading", @@ -6351,8 +6358,8 @@ "url": "https://code.claude.com/docs/en/admin-setup", "status": "success", "path": "en/docs/claude-code/admin-setup.md", - "sha256": "e2191140e4136b93d2ab3ec0961c7538fad83cefecbcdb5e455950ccd12da1f2", - "size": 26745 + "sha256": "551624f9513bbaff7334e96fb700a690388bfb274fb225592e5b316026964760", + "size": 26764 }, { "url": "https://code.claude.com/docs/en/setup", @@ -6659,8 +6666,8 @@ "url": "https://code.claude.com/docs/en/cloud-environments", "status": "success", "path": "en/docs/claude-code/cloud-environments.md", - "sha256": "43a35ca69abaf7fc57ccb8d9211b44816d04967cbf7837a45060e751c6a501f9", - "size": 62959 + "sha256": "a59b13b0cba8bd522f0fd6cdaccb5058b9f853d4bcd4478ad86e7b0b3f05566b", + "size": 63310 }, { "url": "https://code.claude.com/docs/en/self-hosted-environments", @@ -6799,8 +6806,8 @@ "url": "https://code.claude.com/docs/en/env-vars", "status": "success", "path": "en/docs/claude-code/env-vars.md", - "sha256": "6c0123f6d94a3024920a3c0874647f957374b37663c13973e51bf3683c2d1cd8", - "size": 168359 + "sha256": "98b128c3f7d3c1e0a12e1ec8c2990489904f4cd662d1329f5c4b6926569c99e9", + "size": 168466 }, { "url": "https://code.claude.com/docs/en/tools-reference", @@ -7051,8 +7058,8 @@ "url": "https://code.claude.com/docs/en/agent-sdk/typescript", "status": "success", "path": "en/docs/claude-code/agent-sdk/typescript.md", - "sha256": "7d5cc0cd4a62bde3de703ff1caa2d7b007af11151b9686d4b34815709206ac7f", - "size": 293769 + "sha256": "59ac811a0f736daae32de4d79e6dbfe07984753acab769e7ea28b9df3b698a7b", + "size": 296465 }, { "url": "https://code.claude.com/docs/en/agent-sdk/typescript-v2-preview", @@ -9830,7 +9837,7 @@ "url": "https://support.claude.com/en/articles/8114491-get-started-with-claude", "status": "success", "path": "support/8114491-get-started-with-claude.md", - "sha256": "31cf192d611d89175e9a31535f287520d275c433e4c94b6d25e87440791d19a2", + "sha256": "b360ad7260e7f36276e9942bb7f9b693a81344483ed6db304bf335b3c46d4d8f", "size": 5203 }, { @@ -9844,8 +9851,8 @@ "url": "https://support.claude.com/en/articles/8114513-business-associate-agreements-baa-for-commercial-customers", "status": "success", "path": "support/8114513-business-associate-agreements-baa-for-commercial-customers.md", - "sha256": "b2efe3e45a79bcc285181054552c9d9ee7a5e21c2b4936471cb1d614f243c265", - "size": 67400 + "sha256": "876f9bc4c2cbdc4adef28a6f2fbd002cf752e412934195782302a08079353e9f", + "size": 67836 }, { "url": "https://support.claude.com/en/articles/8114518-claude-s-response-to-my-prompt-is-too-brief", @@ -9907,8 +9914,8 @@ "url": "https://support.claude.com/en/articles/8230524-delete-or-rename-a-conversation", "status": "success", "path": "support/8230524-delete-or-rename-a-conversation.md", - "sha256": "4b059fa289afbc94d6f909ccd48c6802091c0fe92e8daf0544650ef0e3f0ae2f", - "size": 5875 + "sha256": "c860dfbe8ed7a3d573c6f4129595ab5c4c5e2d151da2bdc537ec21730544d42c", + "size": 5887 }, { "url": "https://support.claude.com/en/articles/8241126-upload-files-to-claude", @@ -9977,8 +9984,8 @@ "url": "https://support.claude.com/en/articles/8325618-paid-plan-billing-faqs", "status": "success", "path": "support/8325618-paid-plan-billing-faqs.md", - "sha256": "a7b6635d9515185b54d4c9c248470bafa156647262baddc44a8831cb78eb0701", - "size": 4951 + "sha256": "33b0f2814b3020662d1f32616af7fae992ad73a047f38683a2d1612aae1432f0", + "size": 4949 }, { "url": "https://support.claude.com/en/articles/8325621-i-would-like-to-input-sensitive-data-into-my-chats-with-claude-who-can-view-my-conversations", @@ -10040,8 +10047,8 @@ "url": "https://support.claude.com/en/articles/8887527-customizing-your-appearance-settings", "status": "success", "path": "support/8887527-customizing-your-appearance-settings.md", - "sha256": "7096aa65df43d1debf40b72e4abdb11e3a3a8cdf70aeaccf90fd31c28571be86", - "size": 1878 + "sha256": "715c078f8044c8cfba42588457180ba79615c7e06c252292d293608989cb0adc", + "size": 1874 }, { "url": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler", @@ -10215,8 +10222,8 @@ "url": "https://support.claude.com/en/articles/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization", "status": "success", "path": "support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md", - "sha256": "82cc40735397ea741becb544572a1a823656046dbe7bad2e5fc1468476103094", - "size": 10270 + "sha256": "07b7c9056a4b89c9489c38b381394ef78352ac9b3b4c944c522c69846fec5f6c", + "size": 10264 }, { "url": "https://support.claude.com/en/articles/9301722-updates-to-our-acceptable-use-policy-now-usage-policy-consumer-terms-of-service-and-privacy-policy", @@ -10257,7 +10264,7 @@ "url": "https://support.claude.com/en/articles/9519177-how-can-i-create-and-manage-projects", "status": "success", "path": "support/9519177-how-can-i-create-and-manage-projects.md", - "sha256": "e1403bcbff4d00dd17b1149fb9126252e9ab8417c1381edac7aafa9430c2ebeb", + "sha256": "f940145403193a157b64cdda5a803493acae47e86525b97235006f06523bc52b", "size": 9201 }, { @@ -10327,8 +10334,8 @@ "url": "https://support.claude.com/en/articles/9796807-create-and-manage-workspaces-in-the-claude-console", "status": "success", "path": "support/9796807-create-and-manage-workspaces-in-the-claude-console.md", - "sha256": "ec9925224126e88ee9413a7fd204708d73afe2e12085dc906ea3c4a188522d21", - "size": 7379 + "sha256": "833631be0babd065cb90fe08d02da0f80f0ee332d5e259e5a132a43de69c5198", + "size": 7353 }, { "url": "https://support.claude.com/en/articles/9797531-what-is-the-enterprise-plan", @@ -10509,8 +10516,8 @@ "url": "https://support.claude.com/en/articles/10310342-how-do-i-log-out-of-all-active-sessions", "status": "success", "path": "support/10310342-how-do-i-log-out-of-all-active-sessions.md", - "sha256": "c375c83980eb6723fa83652f623dcc0dcc5d5040f33053037e5f824d1c649e9d", - "size": 2492 + "sha256": "e1d2145f8e7b9a279a73394ed20d0e7796391e6f39dab8a419b25db25d090834", + "size": 2496 }, { "url": "https://support.claude.com/en/articles/10366376-how-can-i-delete-my-claude-console-account", @@ -10558,8 +10565,8 @@ "url": "https://support.claude.com/en/articles/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans", "status": "success", "path": "support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md", - "sha256": "7c0f0abb7c43752d3781b6acb97c92bf9c260fd3ed898195282ea770908dbe15", - "size": 1040 + "sha256": "7c309077dc5c1b779bdfcf03cadd11d2890161eed5fa15ebe8b92136baecbf88", + "size": 1036 }, { "url": "https://support.claude.com/en/articles/10504853-manage-user-feedback-settings-on-claude-console", @@ -10579,8 +10586,8 @@ "url": "https://support.claude.com/en/articles/10593882-share-and-unshare-chats", "status": "success", "path": "support/10593882-share-and-unshare-chats.md", - "sha256": "c74e5bbe90a3eb55de714a1a3f665ff87f4a65dcbd95c2e5352686eec2eef498", - "size": 4010 + "sha256": "0e465ea722be47a0a60ac6c8a8125c0e51129c88b3afcc0741248e4ef7e1e588", + "size": 4022 }, { "url": "https://support.claude.com/en/articles/10684626-enable-and-use-web-search", @@ -10607,7 +10614,7 @@ "url": "https://support.claude.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop", "status": "success", "path": "support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md", - "sha256": "192f6a6dda6fdbc00c2d0376847f6ca0c1b4ccc955a5104fd626e07c007d18f4", + "sha256": "6fffcd6ec599f64593f796734ddd12213d7310a841ea354abe3310fd9b663a56", "size": 8392 }, { @@ -10642,8 +10649,8 @@ "url": "https://support.claude.com/en/articles/11101966-use-voice-mode", "status": "success", "path": "support/11101966-use-voice-mode.md", - "sha256": "44270a337ed272fbd55a80e000d1653ac6476ff54616ea891e8bf82dd7c364d4", - "size": 10559 + "sha256": "2aac00352f6c553ca39476bbf05600b38470cdaef1a5be2c90d232520c276b13", + "size": 10553 }, { "url": "https://support.claude.com/en/articles/11107691-why-is-a-coupon-or-promotion-not-available-for-my-account", @@ -10775,7 +10782,7 @@ "url": "https://support.claude.com/en/articles/11725453-set-up-the-claude-lti-in-canvas-by-instructure", "status": "success", "path": "support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md", - "sha256": "59a4d3584e183417f65400935f8d8772b52bbb5dd6ebb29d5b2872e531d2d336", + "sha256": "562e9090f6ea97a6246df756d2e42ff9565f49895fae25e371cfcaa626a328a6", "size": 2750 }, { @@ -10789,15 +10796,15 @@ "url": "https://support.claude.com/en/articles/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context", "status": "success", "path": "support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md", - "sha256": "901a3d52057e8e27704437035c292b5bde88bfd1f48ade31e0f1be30ac76ebe1", - "size": 28560 + "sha256": "684bcf8b6fd5d52e74feabf56916042015555533cb300b9c64f570a8b2f6363d", + "size": 28714 }, { "url": "https://support.claude.com/en/articles/11818288-why-am-i-being-asked-to-verify-my-payment-method", "status": "success", "path": "support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md", - "sha256": "699b4e0286d65095cfbaf1b822c84de5a561dc68a657ac4570b6748821b44b18", - "size": 820 + "sha256": "b3e529280547ff5f34eb9d72dfb0b53d6f84feb97d735650291f0e29048ae8d0", + "size": 818 }, { "url": "https://support.claude.com/en/articles/11825384-how-to-update-claude-for-ios", @@ -10831,8 +10838,8 @@ "url": "https://support.claude.com/en/articles/11869629-use-claude-with-android-apps", "status": "success", "path": "support/11869629-use-claude-with-android-apps.md", - "sha256": "c56f3ab1b54dcd2d0f165d7809cdbce2124aeadab7d503b9fe55f9b7db9ea824", - "size": 13993 + "sha256": "488ead229fb3038dfe1cd595a85819233030d73f2ec51057d16c5e5ace3392d6", + "size": 13995 }, { "url": "https://support.claude.com/en/articles/11932705-automated-security-reviews-in-claude-code", @@ -10866,15 +10873,15 @@ "url": "https://support.claude.com/en/articles/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans", "status": "success", "path": "support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md", - "sha256": "8595052c3ca8990807b2cae0f77dba534722b1bc1fbd9f976e5d8347b0e03ff3", - "size": 9709 + "sha256": "56a1f115d007ad8c0238493adb44516131e58940b2ef655d3eec37c980dd466a", + "size": 9703 }, { "url": "https://support.claude.com/en/articles/12012173-get-started-with-claude-in-chrome", "status": "success", "path": "support/12012173-get-started-with-claude-in-chrome.md", - "sha256": "9f20d5f0df41bb103643e971670e09ede06f4663a825c0a59ba966530404f49d", - "size": 14859 + "sha256": "3b2026138194e40826d0f098a06fe1e8649f0d99e8beaa3aa499eb7433518bb1", + "size": 14857 }, { "url": "https://support.claude.com/en/articles/12053672-what-happens-to-a-user-s-data-when-they-are-removed-from-a-team-or-enterprise-organization", @@ -10887,8 +10894,8 @@ "url": "https://support.claude.com/en/articles/12083917-change-your-team-plan-from-monthly-to-annual-billing", "status": "success", "path": "support/12083917-change-your-team-plan-from-monthly-to-annual-billing.md", - "sha256": "4c2d40a7bff98e67dd7cca8479534b930f58d131fee390e9e29e38c01e058fba", - "size": 1396 + "sha256": "d03458050b2751818788305b92b04d226d12e61bb75d8bcb14612a76f08c5a11", + "size": 1392 }, { "url": "https://support.claude.com/en/articles/12109679-creating-a-new-account-after-deletion", @@ -10901,8 +10908,8 @@ "url": "https://support.claude.com/en/articles/12111783-create-and-edit-files-with-claude", "status": "success", "path": "support/12111783-create-and-edit-files-with-claude.md", - "sha256": "8c48605e1e29f0fa1e9385281c668398b9b8ca0040262df635ed485f24c5eec2", - "size": 17960 + "sha256": "45a9021196466e367e3045ec840414050a790462cbb45196d90fa3fa502e780b", + "size": 17962 }, { "url": "https://support.claude.com/en/articles/12119250-model-safety-bug-bounty-program", @@ -10922,8 +10929,8 @@ "url": "https://support.claude.com/en/articles/12138966-release-notes", "status": "success", "path": "support/12138966-release-notes.md", - "sha256": "f9eda0c563a386c92c32e168454ab7fc7b4166d592603d4a22583420d0b2c69a", - "size": 39788 + "sha256": "5edf46c4dc583f274e77776bd30085a38f6dc7575dfe6b84e52f57b4ab5d82ba", + "size": 40120 }, { "url": "https://support.claude.com/en/articles/12157520-claude-code-usage-analytics", @@ -10936,14 +10943,14 @@ "url": "https://support.claude.com/en/articles/12260368-use-incognito-chats", "status": "success", "path": "support/12260368-use-incognito-chats.md", - "sha256": "a725c54dfc8ce65c88b62799aae0276e2e45760a959dfbd9a537bf55009769c1", - "size": 4376 + "sha256": "1080bd1954449b669f61cb339699cc59246aecc80336e758f63daadf658c1c5b", + "size": 4374 }, { "url": "https://support.claude.com/en/articles/12293051-use-claude-in-xcode", "status": "success", "path": "support/12293051-use-claude-in-xcode.md", - "sha256": "bdd07b88dde8d8802ed178e48b3fbd65ad663198b5112bd4bea873eb6052d9e7", + "sha256": "ac5c77948f18a16519aed969e4f0b9954b0241b1568bd1010837008951123ad1", "size": 1907 }, { @@ -10985,15 +10992,15 @@ "url": "https://support.claude.com/en/articles/12429409-manage-usage-credits-for-paid-claude-plans", "status": "success", "path": "support/12429409-manage-usage-credits-for-paid-claude-plans.md", - "sha256": "ebdb0f8b8b75a90ad940f3f9fec49526b2ea43fa79f0acfb644cd6c185d3bbee", - "size": 7968 + "sha256": "b0196f7b9683d9b20d75742ac16553e6242da956718038f135e086e1abdf322e", + "size": 7972 }, { "url": "https://support.claude.com/en/articles/12466728-troubleshoot-claude-error-messages", "status": "success", "path": "support/12466728-troubleshoot-claude-error-messages.md", - "sha256": "f7d73f4b8f930934a7b07ae0bc4969b862bf26cdd32a944d747ada382b42cf9b", - "size": 5141 + "sha256": "d87a74d55b3b0b7ff5f9df0febd1e0711952c0d3dcf61a481a55668490863bd3", + "size": 5139 }, { "url": "https://support.claude.com/en/articles/12489464-use-enterprise-search", @@ -11013,8 +11020,8 @@ "url": "https://support.claude.com/en/articles/12512180-use-skills-in-claude", "status": "success", "path": "support/12512180-use-skills-in-claude.md", - "sha256": "aec9202478a0bffaf13d5adca8a170ee01b6c1f3d618f0026b7c20bcee67a761", - "size": 19154 + "sha256": "6a4a20eb191bfd0ea215732bfb82b3ca8fdbe7832b2ac7c66d4f3db6eb8d53d8", + "size": 19148 }, { "url": "https://support.claude.com/en/articles/12512198-how-to-create-custom-skills", @@ -11034,8 +11041,8 @@ "url": "https://support.claude.com/en/articles/12592343-enabling-and-using-the-desktop-extension-allowlist", "status": "success", "path": "support/12592343-enabling-and-using-the-desktop-extension-allowlist.md", - "sha256": "49f027057d749565aa5a988709d6a32276068e0710ca735a134de5311652e09c", - "size": 5714 + "sha256": "19fa971d98ae79287dcc932c475aba170066d1633f9f257943343f8b686c2e9d", + "size": 5712 }, { "url": "https://support.claude.com/en/articles/12611117-deploy-claude-desktop-for-macos", @@ -11048,7 +11055,7 @@ "url": "https://support.claude.com/en/articles/12618689-use-claude-code-in-the-cloud", "status": "success", "path": "support/12618689-use-claude-code-in-the-cloud.md", - "sha256": "3ce835c923b607e1307f5e9ffa61793da7e8fd4f3b1939c0d092c5f895b3de25", + "sha256": "d2ed8afbc409ec22dde0b7a8f9bd01509725d9d5ce1524fcb8aea1227647d03b", "size": 11058 }, { @@ -11069,7 +11076,7 @@ "url": "https://support.claude.com/en/articles/12626668-use-quick-entry-with-claude-desktop-on-mac", "status": "success", "path": "support/12626668-use-quick-entry-with-claude-desktop-on-mac.md", - "sha256": "2528c5b18d25ab0f5c50e7a605b9d7bc5fd8b40538eb79a04996f0182f4bd10b", + "sha256": "fab4d777a33b2053d449c875db0fef7d0fe56a07307273f82a3ebf22def9cc08", "size": 5974 }, { @@ -11104,8 +11111,8 @@ "url": "https://support.claude.com/en/articles/12883420-view-usage-analytics-for-team-and-enterprise-plans", "status": "success", "path": "support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md", - "sha256": "d94a6941dc5543bd9daa6eeb1655944a8fa7cd8e8c9b375cb04c13fb8cebf228", - "size": 15093 + "sha256": "11415c15d6ac8d138fb92f7d8d30fcf8a1ebec8dd38552c6af7605da12fc2762", + "size": 15103 }, { "url": "https://support.claude.com/en/articles/12902405-claude-in-chrome-troubleshooting", @@ -11125,8 +11132,8 @@ "url": "https://support.claude.com/en/articles/12902446-claude-in-chrome-permissions-guide", "status": "success", "path": "support/12902446-claude-in-chrome-permissions-guide.md", - "sha256": "b779a6d3f950d5b38cfe59f5b05c771545ae9081f5409d2e76f7ad872c6498bd", - "size": 9563 + "sha256": "1a13e68e97c4a24439fe089b44d10873b1625dc33f7a9d88679d2be08764e9d5", + "size": 9571 }, { "url": "https://support.claude.com/en/articles/12938627-how-to-gift-a-claude-subscription", @@ -11153,8 +11160,8 @@ "url": "https://support.claude.com/en/articles/12997503-team-plan-billing-faqs", "status": "success", "path": "support/12997503-team-plan-billing-faqs.md", - "sha256": "f234c3b76b9ead7e70e95474f676f1fdde9a395500ea4c550a46c6d1ae636e7b", - "size": 5413 + "sha256": "73cfd4ef376725b3f138ffc0b12b4235a02ca5b24716a52d26af64337d2cc9a2", + "size": 5417 }, { "url": "https://support.claude.com/en/articles/13015708-access-the-compliance-api", @@ -11202,14 +11209,14 @@ "url": "https://support.claude.com/en/articles/13132885-set-up-single-sign-on-sso", "status": "success", "path": "support/13132885-set-up-single-sign-on-sso.md", - "sha256": "354889dde4d96c8f6188f6efae231dd4c6e9cad622dda26794880014316ca02b", - "size": 13645 + "sha256": "109b55413f3aabe5c9f4b2da40248a1d132051ebc6530638fe71aa131273ac63", + "size": 13651 }, { "url": "https://support.claude.com/en/articles/13133195-set-up-jit-or-scim-provisioning", "status": "success", "path": "support/13133195-set-up-jit-or-scim-provisioning.md", - "sha256": "892ce07b1b11315fae39aff539fd16c9dae18ce47fc048432247002ed3c99333", + "sha256": "96035c8fa59fb1d122b1f48cb915d35bf1f942fa57274a6731307a444e458ae9", "size": 22519 }, { @@ -11237,8 +11244,8 @@ "url": "https://support.claude.com/en/articles/13163631-configuring-session-security-settings", "status": "success", "path": "support/13163631-configuring-session-security-settings.md", - "sha256": "d6af99ace2bbade2d186a82441d9c0e92f66b9121564d0b29d3e3663ca3f2c5e", - "size": 3693 + "sha256": "45b952f1d96c41da03d022817eaea1f52cd219c1882d8ec75cddcc7c41879334", + "size": 3697 }, { "url": "https://support.claude.com/en/articles/13171706-crisis-helpline-support-in-claude", @@ -11251,8 +11258,8 @@ "url": "https://support.claude.com/en/articles/13189465-log-in-to-your-claude-account", "status": "success", "path": "support/13189465-log-in-to-your-claude-account.md", - "sha256": "d6578cf84d61aac3f94b1cc387252944f60d26ab95b5f58317d3f1e84c4ae48a", - "size": 7037 + "sha256": "ea54bb7241e2229c7676a97b3d003cf5ced77b3e3508c7e3d6a6846a72a882db", + "size": 7041 }, { "url": "https://support.claude.com/en/articles/13198485-enforce-network-level-access-control-with-tenant-restrictions", @@ -11279,15 +11286,15 @@ "url": "https://support.claude.com/en/articles/13325567-account-management-faqs", "status": "success", "path": "support/13325567-account-management-faqs.md", - "sha256": "2c449e49f618a2b2c92b6ffb13e6ca5c5d6d2af5e131db396944469ea05241b9", - "size": 2636 + "sha256": "d63461e25f93f5e4a16d1e5a8ecef23ae1e39c41ec567c2cebf3e4a90ef797cd", + "size": 2638 }, { "url": "https://support.claude.com/en/articles/13345190-get-started-with-claude-cowork", "status": "success", "path": "support/13345190-get-started-with-claude-cowork.md", - "sha256": "25606e7e0bc2bd3c11676b86877efcbba4858eb4c699102b327ffd271be54f74", - "size": 23058 + "sha256": "7aabfc0a4672cb541a919549ef31382ed088fd73949e46b2e7631b7d7c40bfc0", + "size": 23056 }, { "url": "https://support.claude.com/en/articles/13346458-customize-your-console-appearance-settings", @@ -11314,8 +11321,8 @@ "url": "https://support.claude.com/en/articles/13371040-log-in-to-your-console-account", "status": "success", "path": "support/13371040-log-in-to-your-console-account.md", - "sha256": "4f0c23d4a1e3e52c405564b59ecc1545492eb960769e7e64c52a588a0aef4329", - "size": 4613 + "sha256": "bd4cb9ed736b8ef2ecd0396b808d11e06584b1ba5f8c101265407144b302d45f", + "size": 4611 }, { "url": "https://support.claude.com/en/articles/13393991-purchase-and-manage-seats-on-enterprise-plans", @@ -11370,8 +11377,8 @@ "url": "https://support.claude.com/en/articles/13641943-visual-and-interactive-content", "status": "success", "path": "support/13641943-visual-and-interactive-content.md", - "sha256": "aa4165f83de23a205b2096967f307b9e3633f95c7e6a8f8dfb98dde98a50f46a", - "size": 6513 + "sha256": "67d2ce89464f80c9b761198a33737314165c7170d89dc0969bb38ee88f7a6a0f", + "size": 6509 }, { "url": "https://support.claude.com/en/articles/13663666-use-visual-and-interactive-content-on-team-and-enterprise-plans", @@ -11426,8 +11433,8 @@ "url": "https://support.claude.com/en/articles/13837440-use-plugins-in-claude", "status": "success", "path": "support/13837440-use-plugins-in-claude.md", - "sha256": "9e83680070e168b91740ec5b4ad2b8a0adf63ea31ee936aca9f6d02200d8c7da", - "size": 15195 + "sha256": "da5dcdee6965200e86a0bdd093fee7ca099c7525f021db634bc80cce4c171f48", + "size": 15191 }, { "url": "https://support.claude.com/en/articles/13854387-schedule-recurring-tasks-in-claude-cowork", @@ -11524,8 +11531,8 @@ "url": "https://support.claude.com/en/articles/13947068-assign-tasks-from-anywhere-in-claude-cowork", "status": "success", "path": "support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md", - "sha256": "2dd3a9a7a5f9dd91242ca45f3dbd9f0160882b23a74bc3c73e50cab33edc52f5", - "size": 9460 + "sha256": "ea0dffdeb191710136de2f7fbc69621ce59663501bcbe210fa4eb4b0541f701a", + "size": 9462 }, { "url": "https://support.claude.com/en/articles/13979539-custom-visuals-in-chat-and-cowork", @@ -11545,8 +11552,8 @@ "url": "https://support.claude.com/en/articles/14116274-organize-your-tasks-with-projects-in-claude-cowork", "status": "success", "path": "support/14116274-organize-your-tasks-with-projects-in-claude-cowork.md", - "sha256": "a6acac32badd0636e765ba87ca03f28e81a285a08c7c2df0d5d5a42346637013", - "size": 8391 + "sha256": "30e2967c2b3392b0531eaa5dc22b4592ec82d53041d4eb5208622b0b63fa6412", + "size": 8387 }, { "url": "https://support.claude.com/en/articles/14128542-let-claude-use-your-computer-in-cowork", @@ -11615,8 +11622,8 @@ "url": "https://support.claude.com/en/articles/14499648-how-scim-sync-works-for-enterprise-organizations", "status": "success", "path": "support/14499648-how-scim-sync-works-for-enterprise-organizations.md", - "sha256": "17ef5e0a08a038a1d9b8cf17d263f7002d820231ef05c50861b43f5179efce75", - "size": 7674 + "sha256": "4c45c918057820b4a36dbf7bb34f5a30925e88f4a7cf605a8b26f4bfd6f1b04b", + "size": 7670 }, { "url": "https://support.claude.com/en/articles/14503520-available-beta-and-research-preview-features", @@ -11727,7 +11734,7 @@ "url": "https://support.claude.com/en/articles/14604842-cyber-verification-program", "status": "success", "path": "support/14604842-cyber-verification-program.md", - "sha256": "f233ca9b21306a5e0bfc5d44f51f3859dd1c05607189512261a3ef98cd06d4ec", + "sha256": "9e2fae2dc6ce7d27c728053f3b1e07571c34a777363cd69df0b30b0a4ea7187b", "size": 25122 }, { @@ -11748,8 +11755,8 @@ "url": "https://support.claude.com/en/articles/14661296-use-claude-security", "status": "success", "path": "support/14661296-use-claude-security.md", - "sha256": "c3653c97e088ffc0cd08cf5819df94122f83b129df26961e349afb6d0123ae03", - "size": 8705 + "sha256": "db7de8a6eef7c7ec3cb7d45284fcca7ee3eed9b43a43e13ce8b6065cf5e3d7b3", + "size": 18895 }, { "url": "https://support.claude.com/en/articles/14729249-use-live-artifacts-in-claude-cowork", @@ -11839,8 +11846,8 @@ "url": "https://support.claude.com/en/articles/15330088-set-a-default-model-for-your-organization", "status": "success", "path": "support/15330088-set-a-default-model-for-your-organization.md", - "sha256": "054694acc1886ecc1432a826f4654e7ac13dc701f775249a740bd26e5be78bf1", - "size": 11313 + "sha256": "8147ff83ebbef50bc2d97e4e77f0a4f170ef437f378932cf1bd57cc0feef481b", + "size": 11311 }, { "url": "https://support.claude.com/en/articles/15330651-claude-enterprise-admin-api-reference-guide", @@ -11951,8 +11958,8 @@ "url": "https://support.claude.com/en/articles/15694740-manage-model-access-for-your-organization", "status": "success", "path": "support/15694740-manage-model-access-for-your-organization.md", - "sha256": "dc753b313b314426b2f0ce08657fb54c94e92a6e307b49d9e7b186074f4e5800", - "size": 10336 + "sha256": "4246927accb2869a543523177639a9de7705eeef41216c7019ec9854c3e90eed", + "size": 10334 }, { "url": "https://support.claude.com/en/articles/15707726-using-claude-for-legal-work-privilege-confidentiality-and-how-to-think-about-configuration", @@ -11986,8 +11993,8 @@ "url": "https://support.claude.com/en/articles/15936181-get-started-with-1password-for-claude", "status": "success", "path": "support/15936181-get-started-with-1password-for-claude.md", - "sha256": "8470824155bca50311b9e4949dc9cbd0a630f32af0d119bd0a28d9b8e9f3140a", - "size": 5058 + "sha256": "78533e9546479abe72e84e7ddbaf72912e1ad0b4724421f7004e4b9eafb10240", + "size": 5056 }, { "url": "https://support.claude.com/en/articles/16049681-why-claude-switched-models-in-your-conversation-with-opus-5-or-opus-5-5", @@ -12035,7 +12042,7 @@ "url": "https://support.claude.com/en/articles/16607638-understanding-your-pro-or-max-plan-invoices", "status": "success", "path": "support/16607638-understanding-your-pro-or-max-plan-invoices.md", - "sha256": "13a2ab4078e3ba8275251fb9a3fe1314478bd96f7965abb0a4679fc4ef763668", + "sha256": "bd2b150e612e96ed3a428d9a936a5033874046ceef6c0f73283d57997a1ef34a", "size": 5834 }, { @@ -12105,8 +12112,8 @@ "url": "https://support.claude.com/en/articles/16764810-assign-a-program-to-workspaces-in-claude-console", "status": "success", "path": "support/16764810-assign-a-program-to-workspaces-in-claude-console.md", - "sha256": "f11fb9703b36f7ef79e45ba911713db08427fb6015f0600cdd40d496d32f4a61", - "size": 6170 + "sha256": "0ba6ce27ee10fa836c8aa3f28e7684349dca9e58509f542b7180079a65c36520", + "size": 6157 }, { "url": "https://support.claude.com/en/articles/16824617-turn-on-data-retention-for-a-workspace-in-a-zero-data-retention-organization", @@ -12140,8 +12147,8 @@ "url": "https://support.claude.com/en/articles/16951679-use-claude-in-google-docs-sheets-and-slides", "status": "success", "path": "support/16951679-use-claude-in-google-docs-sheets-and-slides.md", - "sha256": "f56fd75dbf0de3252eb04ccd9c3db604e4944e621e08c43346a42e7eff5d3284", - "size": 21892 + "sha256": "e625412ebfe425e240b549f5910e530878ba49ba3cc6e230952721314a013528", + "size": 21898 }, { "url": "https://support.claude.com/en/articles/16952184-set-up-salesforce-in-claude-for-your-organization", @@ -12168,8 +12175,8 @@ "url": "https://support.claude.com/en/articles/17005973-manage-pooled-group-budgets-on-enterprise-plans", "status": "success", "path": "support/17005973-manage-pooled-group-budgets-on-enterprise-plans.md", - "sha256": "71630988e11cdb73f651e46f139a581dd71848defc00a7de5a254bbec8abe9ce", - "size": 6980 + "sha256": "25fbb99ad517b579fc424129c51daadeb0560f6e95b348cdb060fa58ab431c91", + "size": 6982 }, { "url": "https://support.claude.com/en/articles/17007452-what-is-a-limit-reset", @@ -12217,8 +12224,8 @@ "url": "https://support.claude.com/en/articles/17203415-set-up-claude-for-intune", "status": "success", "path": "support/17203415-set-up-claude-for-intune.md", - "sha256": "556f2927dab6e4d374cfd7e7b7452fd88e96d6eefdf7206e4252583727323361", - "size": 11377 + "sha256": "16fba50dafda29012a6443b4ac8815e2e12f0dbec905db0e9a6a9e0106276991", + "size": 11379 }, { "url": "https://support.claude.com/en/articles/17318731-use-claude-code-local-mode-and-claude-cowork-local-mode-on-a-hipaa-ready-enterprise-plan", @@ -12231,8 +12238,8 @@ "url": "https://support.claude.com/en/articles/17440474-migrate-from-standalone-claude-design-to-claude", "status": "success", "path": "support/17440474-migrate-from-standalone-claude-design-to-claude.md", - "sha256": "837b9fbd572ee46235a54b86407596f74fe4bd7699d5c9360f8680e065cfdb6b", - "size": 15277 + "sha256": "86d6967adc230cf1e80469801db90d636e13e7103a5e05cd013f54e9e4e4c04c", + "size": 15289 }, { "url": "https://support.claude.com/en/articles/17444146-claude-haiku-4-5-is-leaving-the-model-selector", @@ -13477,29 +13484,29 @@ "url": "https://claude.com/docs/government/changelog", "status": "success", "path": "claude/government/changelog.md", - "sha256": "378cbfe06fdae929c601b4e84601e1ca4c0157c94cd21c95a509914a2d4ff6e9", - "size": 14807 + "sha256": "1b5178aa741a7375ede57a6b8cd32927a68eaeb05a5c43d81ea6837f8983e0f1", + "size": 20204 }, { "url": "https://claude.com/docs/government/config/overview", "status": "success", "path": "claude/government/config/overview.md", - "sha256": "477008a7ab1dac91f32074ed6318236e1488c1b1f835e5244e7bf75f15329b54", - "size": 16746 + "sha256": "2e8a8b8b3417ef1aa9634a750c9bfb32b5249153ee81fe61748b6f45ca91ecc4", + "size": 16539 }, { "url": "https://claude.com/docs/government/config/plugins-and-connectors", "status": "success", "path": "claude/government/config/plugins-and-connectors.md", - "sha256": "b1413f2538badd5a150d090fb7c549e2b271d818e52977a794a45fe18996c783", - "size": 11911 + "sha256": "5ddcbc25e9c54433eee60a96f566f0792c57e4f9afb0bc53beaea51bb0eda937", + "size": 11816 }, { "url": "https://claude.com/docs/government/config/settings", "status": "success", "path": "claude/government/config/settings.md", - "sha256": "fe33a82cb5c17f6da14477eab49d9d299b4700e6e76b2198d1b1b5c688e11386", - "size": 40031 + "sha256": "df33f3b2cf9507d6ed85a6dad2935e888b31da41115268eb40e28c25a2df0d5f", + "size": 24776 }, { "url": "https://claude.com/docs/government/connectors/microsoft-365", @@ -13946,8 +13953,8 @@ "url": "https://claude.com/docs/third-party/claude-desktop/admin-console", "status": "success", "path": "claude/third-party/claude-desktop/admin-console.md", - "sha256": "238b32d894155949850c9aabc028deef5dd5f200a5be821be1236db1f05dd1f3", - "size": 70691 + "sha256": "6149fe38892ef00726e7d0764951e6bbe874db7503b9a6ce0349d3be2c00985a", + "size": 70795 }, { "url": "https://claude.com/docs/third-party/claude-desktop/bedrock", @@ -14044,8 +14051,8 @@ "url": "https://claude.com/docs/third-party/claude-desktop/connectors-salesforce", "status": "success", "path": "claude/third-party/claude-desktop/connectors-salesforce.md", - "sha256": "1102a3651779546f9fc37ea2225d84e1a81e152845fd98701f792eb3a35e04f0", - "size": 5458 + "sha256": "b0654e8f129acebacaa14cf957dc87053ed874e4b9a858c7003b80f05a8b552b", + "size": 6097 }, { "url": "https://claude.com/docs/third-party/claude-desktop/credential-helper", @@ -14191,8 +14198,8 @@ "url": "https://claude.com/docs/third-party/claude-desktop/telemetry", "status": "success", "path": "claude/third-party/claude-desktop/telemetry.md", - "sha256": "68a08d34deff28cf56f4470b187cabfefdc9a38ac8d180631eda68cd7c182439", - "size": 35309 + "sha256": "c4844f74b3abcbcbfe22ba96f849c2b84b08db19a927fbcc6bb0431a72dd29e1", + "size": 35405 }, { "url": "https://claude.com/docs/third-party/claude-desktop/unified-claude", @@ -14216,123 +14223,123 @@ "size": 18110 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/models", + "url": "https://code.claude.com/docs/en/slash-commands", "status": "success", - "path": "en/api/ruby/models.md", - "sha256": "342da0c9499f79412efc3cd27a21fc40d4b348c9a7c4384eadea7c8c760b2c3b", - "size": 40339 + "path": "en/docs/claude-code/slash-commands.md", + "sha256": "df82f2aaebe552f82d1b4d89f3ad6f156520ad3e8f404644df32ed41a68a823b", + "size": 110552 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta", + "url": "https://code.claude.com/docs/en/ultraplan", "status": "success", - "path": "en/api/ruby/beta.md", - "sha256": "57165f3ffda766b9cc5ef986ef662170fa9c7273a315c45e05b7fd1246c1cada", - "size": 3502964 + "path": "en/docs/claude-code/ultraplan.md", + "sha256": "140170a1baf128531aa98be28c5b8592440969cd386a21ab5707def73354aabd", + "size": 1050 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/completions", + "url": "https://code.claude.com/docs/en/plugin-dependencies", "status": "success", - "path": "en/api/ruby/completions.md", - "sha256": "6c904cfd3562b20775ecc98b6ee1a44f70fb589f2b14fac53050da97b626cff7", - "size": 16261 + "path": "en/docs/claude-code/plugin-dependencies.md", + "sha256": "429195438ab959715ee4d09e29b98163372f93e33fcc14d9efc87bcebfc0c3e2", + "size": 17135 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages", + "url": "https://code.claude.com/docs/en/plugins", "status": "success", - "path": "en/api/ruby/messages.md", - "sha256": "c0c6ca250f1b03ec43a30d82819723c43b127b14049ab1154d6d62261a2dafc1", - "size": 1213517 + "path": "en/docs/claude-code/plugins.md", + "sha256": "3d758b5da01f42cf2201c4f4d38a7ac24dbf76e7f31d03cf77632e4d720535cf", + "size": 13310 }, { - "url": "https://platform.claude.com/docs/en/api/java/models", + "url": "https://code.claude.com/docs/en/iam", "status": "success", - "path": "en/api/java/models.md", - "sha256": "b5ed56998a149d7eece5f0e7445d0012550d6f9a366e5a8ad32cfe097b958f40", - "size": 44717 + "path": "en/docs/claude-code/iam.md", + "sha256": "7eee08423ba09f648ad55d2a977d2783960450b5867e1629b23386341293a81d", + "size": 30701 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta", + "url": "https://code.claude.com/docs/en/desktop-changelog", "status": "success", - "path": "en/api/java/beta.md", - "sha256": "3cab85b3a6d8da8041abfb02b2758a67b2dc014802155e88494c584cd5b590aa", - "size": 3698081 + "path": "en/docs/claude-code/desktop-changelog.md", + "sha256": "b7f7fa05d5f0c5d0154381b3c8f9afd00515246be19c8b95227bcc19f7902924", + "size": 163933 }, { - "url": "https://platform.claude.com/docs/en/api/java/completions", + "url": "https://code.claude.com/docs/en/plugin-relevance", "status": "success", - "path": "en/api/java/completions.md", - "sha256": "dac04c9a86324b4e7c13eb58abb606a379f92df763c04e8cca8635d30c0732ca", - "size": 16295 + "path": "en/docs/claude-code/plugin-relevance.md", + "sha256": "bed8ccb839090c1ea1d9ca8654e280905276bd44c57f80b68fa4e4b75c02b93a", + "size": 12863 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages", + "url": "https://code.claude.com/docs/en/discover-plugins", "status": "success", - "path": "en/api/java/messages.md", - "sha256": "14b591e1c6300a2a858282e77a33001629c1982c0a4aa29fbea20c0da495534f", - "size": 1166608 + "path": "en/docs/claude-code/discover-plugins.md", + "sha256": "2af08db4214c45b94d140ebb6ae7407f85ee7cc92059095605cc5934a6f8bb51", + "size": 31337 }, { - "url": "https://platform.claude.com/docs/en/api/python/models", + "url": "https://code.claude.com/docs/en/plugin-marketplaces", "status": "success", - "path": "en/api/python/models.md", - "sha256": "737ea30a7d1f86a1d4c75d78c3740caeeca94105f563b32cfec56f8f0b00f308", - "size": 41112 + "path": "en/docs/claude-code/plugin-marketplaces.md", + "sha256": "d016e2a495335b74acb363c28cc83f516a5c8df3954e64937841edde7271bc8c", + "size": 13855 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta", + "url": "https://code.claude.com/docs/en/plugins-reference", "status": "success", - "path": "en/api/python/beta.md", - "sha256": "6de77e0ca93660883bb1bbe7a064383120aba33fec170e19844e1a2e47200f71", - "size": 3395351 + "path": "en/docs/claude-code/plugins-reference.md", + "sha256": "2af4d8d137d49ce2f1c47fa1cc9d527217d8ba93e146b2b2b5baf221a076ae28", + "size": 41985 }, { - "url": "https://platform.claude.com/docs/en/api/python/completions", + "url": "https://code.claude.com/docs/en/plugin-hints", "status": "success", - "path": "en/api/python/completions.md", - "sha256": "0bbcf544184c890fbb9435d145fa788e3776f0b37bd272abeea0dd3c2f0e5686", - "size": 16604 + "path": "en/docs/claude-code/plugin-hints.md", + "sha256": "cae42089de7d22257f486031fcff3698a3b9e6bdcc642778014fcfc603d570eb", + "size": 6662 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages", + "url": "https://code.claude.com/docs/en/web-scheduled-tasks", "status": "success", - "path": "en/api/python/messages.md", - "sha256": "2be4422351533cda56c5398795cadbd134fa09fc5908f8925c1e1d3dccda54c2", - "size": 1181720 + "path": "en/docs/claude-code/web-scheduled-tasks.md", + "sha256": "66a0b4931d816aee9a1fc8e156f67756b9f3a5ca9ff1f248380d7c7d9889189c", + "size": 40887 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/models", + "url": "https://code.claude.com/docs/en/agent-sdk/slash-commands", "status": "success", - "path": "en/api/typescript/models.md", - "sha256": "a74790e23e563d4c22c986ed24604d7bbf60a5eaaf8f8b314ee95afc0c250b28", - "size": 41451 + "path": "en/docs/claude-code/agent-sdk/slash-commands.md", + "sha256": "ba547726732fd543fa07f96bc243fb597d578d8546df1373b721ead01dab0646", + "size": 26910 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta", + "url": "https://platform.claude.com/docs/en/api/cli/beta", "status": "success", - "path": "en/api/typescript/beta.md", - "sha256": "2a90fcffda7ac769ce77cd7e549169f893eb9621153c1b45321770248cd932e1", - "size": 3504147 + "path": "en/api/cli/beta.md", + "sha256": "b08ba74f447277b88dbc3260e5a74808d4804f5cff8586690e66420b97d92697", + "size": 2575677 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/completions", + "url": "https://platform.claude.com/docs/en/api/cli/models", "status": "success", - "path": "en/api/typescript/completions.md", - "sha256": "0569e41ea2b90456e5ef36bded005ba41a558f0e11e52580d28777c58bed7200", - "size": 16729 + "path": "en/api/cli/models.md", + "sha256": "dc8896f0a0abb96930e81b986aede5238c362c07ad7b8bb72d674548bfa5d2f9", + "size": 43995 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages", + "url": "https://platform.claude.com/docs/en/api/cli/completions", "status": "success", - "path": "en/api/typescript/messages.md", - "sha256": "27932a8a78b0017a000af2a945d8d2dfdcda7cf579980cd79fb79d88c685db4f", - "size": 1189214 + "path": "en/api/cli/completions.md", + "sha256": "905170f45ec6b3386841c5a54902cdc53a9822d6c44611b686da607d0a2fc4f0", + "size": 11544 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/models", + "url": "https://platform.claude.com/docs/en/api/cli/messages", "status": "success", - "path": "en/api/csharp/models.md", - "sha256": "74570ab863caa58c65c36dbe34a8130c13348308a14984c2f70715d4c5777fdf", - "size": 45040 + "path": "en/api/cli/messages.md", + "sha256": "77a1d7386d49725e5013dfb84e61ea7a1e80ea78277fbc69887cfc8dcc43cde7", + "size": 974506 }, { "url": "https://platform.claude.com/docs/en/api/csharp/beta", @@ -14341,6 +14348,13 @@ "sha256": "926f261bf00a14007c0519de2b5daa3a4c1fd2aac2b1f3756a688bd6fb21396d", "size": 3638058 }, + { + "url": "https://platform.claude.com/docs/en/api/csharp/models", + "status": "success", + "path": "en/api/csharp/models.md", + "sha256": "74570ab863caa58c65c36dbe34a8130c13348308a14984c2f70715d4c5777fdf", + "size": 45040 + }, { "url": "https://platform.claude.com/docs/en/api/csharp/completions", "status": "success", @@ -14356,11 +14370,32 @@ "size": 1172576 }, { - "url": "https://platform.claude.com/docs/en/api/php/models", + "url": "https://platform.claude.com/docs/en/api/java/beta", "status": "success", - "path": "en/api/php/models.md", - "sha256": "7cd0d92c2f3fea30d7132a0aba6e49530e578ea832646bcd947c900a98090be9", - "size": 18474 + "path": "en/api/java/beta.md", + "sha256": "3cab85b3a6d8da8041abfb02b2758a67b2dc014802155e88494c584cd5b590aa", + "size": 3698081 + }, + { + "url": "https://platform.claude.com/docs/en/api/java/models", + "status": "success", + "path": "en/api/java/models.md", + "sha256": "b5ed56998a149d7eece5f0e7445d0012550d6f9a366e5a8ad32cfe097b958f40", + "size": 44717 + }, + { + "url": "https://platform.claude.com/docs/en/api/java/completions", + "status": "success", + "path": "en/api/java/completions.md", + "sha256": "dac04c9a86324b4e7c13eb58abb606a379f92df763c04e8cca8635d30c0732ca", + "size": 16295 + }, + { + "url": "https://platform.claude.com/docs/en/api/java/messages", + "status": "success", + "path": "en/api/java/messages.md", + "sha256": "14b591e1c6300a2a858282e77a33001629c1982c0a4aa29fbea20c0da495534f", + "size": 1166608 }, { "url": "https://platform.claude.com/docs/en/api/php/beta", @@ -14369,6 +14404,13 @@ "sha256": "1e3755c20d08d997c6f3ea3da9e2e7e264422149bd969a9a0613bba3e36559dd", "size": 1092352 }, + { + "url": "https://platform.claude.com/docs/en/api/php/models", + "status": "success", + "path": "en/api/php/models.md", + "sha256": "7cd0d92c2f3fea30d7132a0aba6e49530e578ea832646bcd947c900a98090be9", + "size": 18474 + }, { "url": "https://platform.claude.com/docs/en/api/php/completions", "status": "success", @@ -14384,8719 +14426,8684 @@ "size": 285474 }, { - "url": "https://platform.claude.com/docs/en/api/cli/models", + "url": "https://platform.claude.com/docs/en/api/go/beta", "status": "success", - "path": "en/api/cli/models.md", - "sha256": "dc8896f0a0abb96930e81b986aede5238c362c07ad7b8bb72d674548bfa5d2f9", - "size": 43995 + "path": "en/api/go/beta.md", + "sha256": "1d58d9080e8be7477237ac50f60b56038fa22c7e1e2e58d9203c151636a8f989", + "size": 4198231 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta", + "url": "https://platform.claude.com/docs/en/api/go/models", "status": "success", - "path": "en/api/cli/beta.md", - "sha256": "b08ba74f447277b88dbc3260e5a74808d4804f5cff8586690e66420b97d92697", - "size": 2575677 + "path": "en/api/go/models.md", + "sha256": "450af16bf1c06bf97841ad1b6e55c3d37154a17220f88ef68b161d384a8a220f", + "size": 48435 }, { - "url": "https://platform.claude.com/docs/en/api/cli/completions", + "url": "https://platform.claude.com/docs/en/api/go/completions", "status": "success", - "path": "en/api/cli/completions.md", - "sha256": "905170f45ec6b3386841c5a54902cdc53a9822d6c44611b686da607d0a2fc4f0", - "size": 11544 + "path": "en/api/go/completions.md", + "sha256": "bf993efccfbd138bda4d5d0a27e8100097bb2197ac71c2098b89940072572eb4", + "size": 18359 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages", + "url": "https://platform.claude.com/docs/en/api/go/messages", "status": "success", - "path": "en/api/cli/messages.md", - "sha256": "77a1d7386d49725e5013dfb84e61ea7a1e80ea78277fbc69887cfc8dcc43cde7", - "size": 974506 + "path": "en/api/go/messages.md", + "sha256": "7f9e26275076605ed43d841baebac5af814e85214a16cb7de058ef83354018ef", + "size": 1276472 }, { - "url": "https://platform.claude.com/docs/en/api/go/models", - "status": "success", - "path": "en/api/go/models.md", - "sha256": "450af16bf1c06bf97841ad1b6e55c3d37154a17220f88ef68b161d384a8a220f", - "size": 48435 - }, - { - "url": "https://platform.claude.com/docs/en/api/go/beta", - "status": "success", - "path": "en/api/go/beta.md", - "sha256": "1d58d9080e8be7477237ac50f60b56038fa22c7e1e2e58d9203c151636a8f989", - "size": 4198231 - }, - { - "url": "https://platform.claude.com/docs/en/api/go/completions", - "status": "success", - "path": "en/api/go/completions.md", - "sha256": "bf993efccfbd138bda4d5d0a27e8100097bb2197ac71c2098b89940072572eb4", - "size": 18359 - }, - { - "url": "https://platform.claude.com/docs/en/api/go/messages", - "status": "success", - "path": "en/api/go/messages.md", - "sha256": "7f9e26275076605ed43d841baebac5af814e85214a16cb7de058ef83354018ef", - "size": 1276472 - }, - { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions", - "status": "success", - "path": "en/api/go/beta/sessions.md", - "sha256": "205646698cb5654f45b6372043c3e559879578355a7a59c2b6d297b13892d0df", - "size": 1283663 - }, - { - "url": "https://platform.claude.com/docs/en/api/go/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/ruby/beta", "status": "success", - "path": "en/api/go/beta/webhooks.md", - "sha256": "5b988bdf08ee34bb9ccf18329e24224d196c9666c4662c1d30f208b73465e55c", - "size": 34918 + "path": "en/api/ruby/beta.md", + "sha256": "57165f3ffda766b9cc5ef986ef662170fa9c7273a315c45e05b7fd1246c1cada", + "size": 3502964 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills", + "url": "https://platform.claude.com/docs/en/api/ruby/models", "status": "success", - "path": "en/api/go/beta/skills.md", - "sha256": "9271e3c1377b417d4479afb75c82b0e73dd22e532d1f903cabceed805a83ec69", - "size": 73876 + "path": "en/api/ruby/models.md", + "sha256": "342da0c9499f79412efc3cd27a21fc40d4b348c9a7c4384eadea7c8c760b2c3b", + "size": 40339 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents", + "url": "https://platform.claude.com/docs/en/api/ruby/completions", "status": "success", - "path": "en/api/go/beta/agents.md", - "sha256": "c5185fb85e36c81bb14661e9d367ebca249f7d0813f05f5cd05298a2047bd993", - "size": 483295 + "path": "en/api/ruby/completions.md", + "sha256": "6c904cfd3562b20775ecc98b6ee1a44f70fb589f2b14fac53050da97b626cff7", + "size": 16261 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/ruby/messages", "status": "success", - "path": "en/api/go/beta/deployments.md", - "sha256": "105348968d6c36e9ca17e7c265c98886ad5e4375d20df5beb9ed30efa3c0f89d", - "size": 262856 + "path": "en/api/ruby/messages.md", + "sha256": "c0c6ca250f1b03ec43a30d82819723c43b127b14049ab1154d6d62261a2dafc1", + "size": 1213517 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/python/beta", "status": "success", - "path": "en/api/go/beta/deployment_runs.md", - "sha256": "d3a8edc81a60afa0213f9a7d8099ee191901030ab92c03fac6ccd26ebe01dd5f", - "size": 40126 + "path": "en/api/python/beta.md", + "sha256": "6de77e0ca93660883bb1bbe7a064383120aba33fec170e19844e1a2e47200f71", + "size": 3395351 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/python/models", "status": "success", - "path": "en/api/go/beta/user_profiles.md", - "sha256": "d35e2dc0f9ca98985fb5bc0eb9070f115548de8278b1c6ee87d795436e54109a", - "size": 93482 + "path": "en/api/python/models.md", + "sha256": "737ea30a7d1f86a1d4c75d78c3740caeeca94105f563b32cfec56f8f0b00f308", + "size": 41112 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/models", + "url": "https://platform.claude.com/docs/en/api/python/completions", "status": "success", - "path": "en/api/go/beta/models.md", - "sha256": "a72a08a75790e72abe3f8279c5bee0e39354ebbf9f682df02a7d3d194d4bc1a7", - "size": 51843 + "path": "en/api/python/completions.md", + "sha256": "0bbcf544184c890fbb9435d145fa788e3776f0b37bd272abeea0dd3c2f0e5686", + "size": 16604 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/python/messages", "status": "success", - "path": "en/api/go/beta/vaults.md", - "sha256": "42f16c012095cb8eca06e1f68f06838c0c67fb52c2e7bd24d6b6801747464573", - "size": 131975 + "path": "en/api/python/messages.md", + "sha256": "2be4422351533cda56c5398795cadbd134fa09fc5908f8925c1e1d3dccda54c2", + "size": 1181720 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/typescript/beta", "status": "success", - "path": "en/api/go/beta/memory_stores.md", - "sha256": "66e5a690d5725360aa35c7b28fa624944bc3f58f9f583ed9aa06cd38f48432af", - "size": 147520 + "path": "en/api/typescript/beta.md", + "sha256": "2a90fcffda7ac769ce77cd7e549169f893eb9621153c1b45321770248cd932e1", + "size": 3504147 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/typescript/models", "status": "success", - "path": "en/api/go/beta/tunnels.md", - "sha256": "08f31889d17586ac011bccbb7a90073c549dc22df79df58c2a6ed77c5c878799", - "size": 79807 + "path": "en/api/typescript/models.md", + "sha256": "a74790e23e563d4c22c986ed24604d7bbf60a5eaaf8f8b314ee95afc0c250b28", + "size": 41451 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments", + "url": "https://platform.claude.com/docs/en/api/typescript/completions", "status": "success", - "path": "en/api/go/beta/environments.md", - "sha256": "b10e086e1ace0c3aa65402f61a34a1257a25eb7b8530347f797cc3b15d821468", - "size": 145521 + "path": "en/api/typescript/completions.md", + "sha256": "0569e41ea2b90456e5ef36bded005ba41a558f0e11e52580d28777c58bed7200", + "size": 16729 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files", + "url": "https://platform.claude.com/docs/en/api/typescript/messages", "status": "success", - "path": "en/api/go/beta/files.md", - "sha256": "dd7b3b0823ec0c1ddd63ead1e2ee672777dcaf974c8fb5d8ce1da8c7d6e2e65d", - "size": 39803 + "path": "en/api/typescript/messages.md", + "sha256": "27932a8a78b0017a000af2a945d8d2dfdcda7cf579980cd79fb79d88c685db4f", + "size": 1189214 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/count_tokens", "status": "success", - "path": "en/api/go/beta/messages.md", - "sha256": "5faf350ee670fa8f9941db99b00758a060d2236ef25f192b4f73337b1ade98a8", - "size": 3237694 + "path": "en/api/typescript/messages/count_tokens.md", + "sha256": "6a7a3ebaae94c6f4a89b95bb5e88f48e9be74b4314278dd09db469716b2f6610", + "size": 97979 }, { - "url": "https://platform.claude.com/docs/en/api/go/models/list", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches", "status": "success", - "path": "en/api/go/models/list.md", - "sha256": "491aff5cd0c8b3bba1ece323600bbadb27e611c2698c5bde524a25d11dedc872", - "size": 16777 + "path": "en/api/typescript/messages/batches.md", + "sha256": "0d06d2918c3a1fa31f84a4bcb87dbcb7d6624d3ffc2d1d2e0cc24438d26e6863", + "size": 286260 }, { - "url": "https://platform.claude.com/docs/en/api/go/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/create", "status": "success", - "path": "en/api/go/models/retrieve.md", - "sha256": "ee02a750907e1a5494cc8001ad657a01c8547a13c1cf505abd1f0f1cacae30c1", - "size": 15276 + "path": "en/api/typescript/messages/create.md", + "sha256": "26f31869174a7e74342493bda9e27c2c5282bce9f6a0ddba3555ee63bd8d3762", + "size": 142225 }, { - "url": "https://platform.claude.com/docs/en/api/go/completions/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults", "status": "success", - "path": "en/api/go/completions/create.md", - "sha256": "c450725666bb03e3fee92dc4f31e99bf54af25745a3c21dd38e293b7e3d64179", - "size": 14387 + "path": "en/api/typescript/beta/vaults.md", + "sha256": "4c3a448ac660f947002f07f4944f9c6b3e8955bdc71b46147c5e64559b1b874a", + "size": 89004 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs", "status": "success", - "path": "en/api/go/messages/create.md", - "sha256": "0c991fec5ebbc17bbed386a936639866a00083f9782f2b8975118bf3d9feac57", - "size": 147919 + "path": "en/api/typescript/beta/deployment_runs.md", + "sha256": "455c4652abae25c07ab64b2ce1df256d90a088dce3f41c5b64dd0a295b45bd6d", + "size": 32964 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/webhooks", "status": "success", - "path": "en/api/go/messages/count_tokens.md", - "sha256": "aa72785efbcb407a9fd665cb59c154f605620a1abe8fd6f9457e277f14f73a76", - "size": 102009 + "path": "en/api/typescript/beta/webhooks.md", + "sha256": "03d7a875d4346f1fd974e1140db9095c999a8d97343a00d5c5afbd5fd7163f33", + "size": 37110 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/models", "status": "success", - "path": "en/api/go/messages/batches.md", - "sha256": "843abf4e23d0bb459bf655738808b361bb2f9b891af372bee21545f733d9cd70", - "size": 314143 + "path": "en/api/typescript/beta/models.md", + "sha256": "1e367b1b8adfeac9c3be9ea92f2da35da95bc38c40d5829f7e40488b3453448c", + "size": 44694 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills", "status": "success", - "path": "en/api/go/messages/batches/create.md", - "sha256": "47026917ccecb611cffd224f635b52d8174f0846811c62cde12c0fd4de37ed1b", - "size": 126071 + "path": "en/api/typescript/beta/skills.md", + "sha256": "a6e0ae9b4227e35b0d788b25a3601abd2213e549a960b4ed6a57be8994eef409", + "size": 43794 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores", "status": "success", - "path": "en/api/go/messages/batches/list.md", - "sha256": "ddcc7a670f3446f30bab414ea5023f9e2cc9c8f2d4071eae2db924fd3d3caf74", - "size": 5820 + "path": "en/api/typescript/beta/memory_stores.md", + "sha256": "5afd8dad933ec95784c59b1a5c4fa3985142afaad0c7c0623aa5d0b5102cc684", + "size": 103778 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages", "status": "success", - "path": "en/api/go/messages/batches/cancel.md", - "sha256": "bcde07f82ffe6a8ebd67f92c5ebb799085a1f366cdf3e6f4b43fa075f1848cb0", - "size": 5661 + "path": "en/api/typescript/beta/messages.md", + "sha256": "f3eabc8ed19e1adce7695ae91d1f4cbff29596253c92512bf5481735114df98c", + "size": 2939363 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents", "status": "success", - "path": "en/api/go/messages/batches/retrieve.md", - "sha256": "317e212972d4a10b02f8c3ea5fcc447f2d7f5791d1fd1696e05b0d5ecf0945a9", - "size": 5339 + "path": "en/api/typescript/beta/agents.md", + "sha256": "35609c7ceea6edb7a6c306219282ed6aa597007ddcb63ca86c2a974635e88f76", + "size": 470449 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions", "status": "success", - "path": "en/api/go/messages/batches/results.md", - "sha256": "f704254650bad11cd12f43bc53852ddd9831cf4f9b3028121cd07df529b6ba3a", - "size": 43903 + "path": "en/api/typescript/beta/sessions.md", + "sha256": "2deaa7b688005a8a2f3487d4c012b5002caf9246971b91861ffedfaa6c79e88b", + "size": 1224813 }, { - "url": "https://platform.claude.com/docs/en/api/go/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles", "status": "success", - "path": "en/api/go/messages/batches/delete.md", - "sha256": "c8fd9f328d4daf47510651f78f050cfb389a3145a47272346b13b46ab8b603a5", - "size": 1956 + "path": "en/api/typescript/beta/user_profiles.md", + "sha256": "2ab4c15fa105f3562ae486e54e7e5832951144f93ab1f74857423a72694b65ef", + "size": 67145 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files", "status": "success", - "path": "en/api/go/beta/environments/create.md", - "sha256": "9e1a2489a6ae321aa52d228f2c8f491177369febaad109d474b4297a39f95fb0", - "size": 13399 + "path": "en/api/typescript/beta/files.md", + "sha256": "e97c5ca879732f70ab17d46cc66376ad7d132756e0e03f5f0a27a328a0e0303b", + "size": 23676 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments", "status": "success", - "path": "en/api/go/beta/environments/update.md", - "sha256": "240aae6a2717cb303dd95a80522d3a09e0647ee953c1e0a87935080406606bcf", - "size": 13538 + "path": "en/api/typescript/beta/deployments.md", + "sha256": "2024d948a6d644aa0cd7f83d0cde34593cc52d2c3bcbcd22e97abe11332b65e8", + "size": 225343 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels", "status": "success", - "path": "en/api/go/beta/environments/list.md", - "sha256": "a3c32db64cac6f207b4a98e54fae806bddbab2257b4e8043405b8243b110a3c8", - "size": 10779 + "path": "en/api/typescript/beta/tunnels.md", + "sha256": "a948c60a3b8ee961d5b2d19d9968b654d0e7109b4f9ded424f581ec8f61cd152", + "size": 47566 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments", "status": "success", - "path": "en/api/go/beta/environments/retrieve.md", - "sha256": "7138191dda6b4df9aaf324d9dd8d7534051aa1d4108d999e72c223f2ba4b678e", - "size": 10230 + "path": "en/api/typescript/beta/environments.md", + "sha256": "3030c2985cfbb8c8e8bfc0247ac89fd70586face09522159b32484090c35b559", + "size": 97821 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/models/list", "status": "success", - "path": "en/api/go/beta/environments/delete.md", - "sha256": "1ba0cc12486127f6f79eb33ec44fc7ba25f2f8c8d4711195779e7c60142b6904", - "size": 6907 + "path": "en/api/typescript/models/list.md", + "sha256": "1e20bb7265bb2d1884c8097145609585aba319df0de3c806747011c3a907ab0c", + "size": 13241 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/typescript/models/retrieve", "status": "success", - "path": "en/api/go/beta/environments/work.md", - "sha256": "7bd9e6bcda89b1b8166e457400d1c8636157b5da6aeec60fff67620298b03aea", - "size": 78023 + "path": "en/api/typescript/models/retrieve.md", + "sha256": "c137c36f1e43346c91339c98f9798b21578ba3e77698c37117dad898d13b00be", + "size": 11897 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/completions/create", "status": "success", - "path": "en/api/go/beta/environments/archive.md", - "sha256": "0acf843a086bbdfd678e10ce1d1596ae4be67edb375b422f6be6463f0385fdd2", - "size": 10312 + "path": "en/api/typescript/completions/create.md", + "sha256": "9f32e9e5e23a9efdbc6f7de960da5f046a2ab411584a5ee6bebcaff9a6c307f5", + "size": 13418 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/list", "status": "success", - "path": "en/api/go/beta/deployment_runs/list.md", - "sha256": "882e67ad04b6ea66d70428c5c530dbfd6322065ad3e69046450974c5e0d96983", - "size": 14416 + "path": "en/api/typescript/beta/vaults/list.md", + "sha256": "f9813ecff441a9b4b7c90f3d07805909d8797c493793bf330ef24cac36a327f4", + "size": 4714 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/archive", "status": "success", - "path": "en/api/go/beta/deployment_runs/retrieve.md", - "sha256": "aa223f554c46d788e50e8c55679bdbbeeca514805ec2ee16347dcba2ec6b7172", - "size": 13048 + "path": "en/api/typescript/beta/vaults/archive.md", + "sha256": "379e8d9b1ad73216058b3ce03bf9a9947b260c04f60daa3f68434b4e41827236", + "size": 4185 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/update", "status": "success", - "path": "en/api/go/beta/vaults/create.md", - "sha256": "7eca182f3489e73e324c2266115adc34285e42f38fc5096c26df48e23bab201e", - "size": 7574 + "path": "en/api/typescript/beta/vaults/update.md", + "sha256": "5ba5ca96dc23eaed6db60b2e3a1015d324248d0ceec94eaf9dfc8e3cefc9f489", + "size": 4465 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/retrieve", "status": "success", - "path": "en/api/go/beta/vaults/update.md", - "sha256": "30b2e7623ed78f08584291ff82fa119367352d8bdddaff9929521f4cde220638", - "size": 7713 + "path": "en/api/typescript/beta/vaults/retrieve.md", + "sha256": "b052719e663b8e31083dabe3296aa9c7d610242adcb2d9e7018fa479c55ff0af", + "size": 4184 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/delete", "status": "success", - "path": "en/api/go/beta/vaults/list.md", - "sha256": "de8faf0583b40ca46429638bacc8e0cfb5809b2c5e5e58df6c9f7c9d56c760f6", - "size": 7892 + "path": "en/api/typescript/beta/vaults/delete.md", + "sha256": "d5dd93bfa0fa9ab7a19be2264edca82432a231622383b57323593625aa19c998", + "size": 3550 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/create", "status": "success", - "path": "en/api/go/beta/vaults/retrieve.md", - "sha256": "4fe6b0243bb5d4ea1dd616c0fb4e48b67047259e3d9901ad946e83eeb1ca86e3", - "size": 7407 + "path": "en/api/typescript/beta/vaults/create.md", + "sha256": "539c87558f969bc324ba0683cb00d39e389266235fa27b35d2245298ff7a90a5", + "size": 4348 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials", "status": "success", - "path": "en/api/go/beta/vaults/credentials.md", - "sha256": "d1d50a56460bec1aead5d655b0c2bbcf932b7d4168ac602d39902266b8e108d4", - "size": 123176 + "path": "en/api/typescript/beta/vaults/credentials.md", + "sha256": "1dcfbfc31c59582452c72412bbce030b6c2e923e7d967a8f173c65ae0b1187d4", + "size": 97826 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/count_tokens", "status": "success", - "path": "en/api/go/beta/vaults/delete.md", - "sha256": "c75acca5d0d98190466ae0f1c632e7f7191d6426d2f5ce59e2bc649253faa452", - "size": 6813 + "path": "en/api/typescript/beta/messages/count_tokens.md", + "sha256": "f31f591206293c9098384270fc3cd07b7077da679336cedbd58c42fb41db1ddb", + "size": 148721 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches", "status": "success", - "path": "en/api/go/beta/vaults/archive.md", - "sha256": "035b28e99fe8b134b831d4c07a1a93b0639411f42b20e5d3b849cfa192ef4341", - "size": 7425 + "path": "en/api/typescript/beta/messages/batches.md", + "sha256": "6924d48a9f7eedeb54325b74c553945ac4d94a8baa736e35d50bbc2e8f07c823", + "size": 807203 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/create", "status": "success", - "path": "en/api/go/beta/user_profiles/create.md", - "sha256": "539547317b2d75999fbe4dd59abffdbbde65fa4068a53b81faf1a53e3c09b0f7", - "size": 15716 + "path": "en/api/typescript/beta/messages/create.md", + "sha256": "d67286871b06b1db7fbf0eab5bcb63b934a0d25a5456888347944248d9cc8c1f", + "size": 312903 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs/list", "status": "success", - "path": "en/api/go/beta/user_profiles/update.md", - "sha256": "69f836df36b244e06d80460faac4db3528de8c37a8dcd76c0acc31425f490f82", - "size": 15597 + "path": "en/api/typescript/beta/deployment_runs/list.md", + "sha256": "82ae4cfa0416fc06d3faf524bb51461bdec12786a20d54b4b6511cbca8e8b857", + "size": 11188 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/go/beta/user_profiles/list.md", - "sha256": "efdfa8b7e6e10268c963095d91cdeed1c50d40e45ae095fe3a90ed2807993c9c", - "size": 14762 + "path": "en/api/typescript/beta/deployment_runs/retrieve.md", + "sha256": "0a8ac4aa67e176e3e4eb89e7246e72fb121aa32be8ed81cb0c19e10fc7b657ad", + "size": 9645 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/list", "status": "success", - "path": "en/api/go/beta/user_profiles/create_enrollment_url.md", - "sha256": "75fcbca946eddfb42ed56f7d2a655d59e36f978e8a9fe6a89600b2bcafc57a17", - "size": 7294 + "path": "en/api/typescript/beta/agents/list.md", + "sha256": "be8126cffb4fd88ddc1ef1d041e369275912d7fb53580f39090328b0aacc848e", + "size": 31553 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/archive", "status": "success", - "path": "en/api/go/beta/user_profiles/retrieve.md", - "sha256": "c48bce501c19748c94bd25b02eb37ea64c936b322edba54409c7f0eed9ffa087", - "size": 13282 + "path": "en/api/typescript/beta/agents/archive.md", + "sha256": "ebd4e9404d36371cb0040a2a895c3519281a9a999f0819d80ead418a382f5b45", + "size": 30617 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/update", "status": "success", - "path": "en/api/go/beta/agents/create.md", - "sha256": "2ad9144ddc1723b340473992fd8379d1759b36545690e2ba4a6d923997cf850b", - "size": 65240 + "path": "en/api/typescript/beta/agents/update.md", + "sha256": "7cc37944650754619a6fa38d18e3d420127fa786bc08836cb7db6b3fb7e86e51", + "size": 68239 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/retrieve", "status": "success", - "path": "en/api/go/beta/agents/update.md", - "sha256": "e69c109c3cf2de11afdcc00ebb7046c05a25347730eb32aab27354a38a9c5a1c", - "size": 66164 + "path": "en/api/typescript/beta/agents/retrieve.md", + "sha256": "c50957166fa3615019985604f11d0edfcd3532f52039958d1ac3a54a8abf8dff", + "size": 30749 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/versions", "status": "success", - "path": "en/api/go/beta/agents/list.md", - "sha256": "ed604ca07b5fcab2d91421b4b7658fe428377a48dca7b8cf06aceda30f6b27a0", - "size": 35221 + "path": "en/api/typescript/beta/agents/versions.md", + "sha256": "8bc5f065b845a0ac757904bd96527d891a165831c44007a173220470a7cfdf38", + "size": 31332 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/create", "status": "success", - "path": "en/api/go/beta/agents/retrieve.md", - "sha256": "e64b5164416019d20f9822b3a1ec3889e4fedaedcc03048af65a88d83ec3c320", - "size": 34451 + "path": "en/api/typescript/beta/agents/create.md", + "sha256": "a3d8b8920182eda49fc7e2be3f0eb146b8a944eddadf2c86e8d847bcd1d567dc", + "size": 67278 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/list", "status": "success", - "path": "en/api/go/beta/agents/versions.md", - "sha256": "138feb2b0760b060f32aacb9b8bef667346ce67c094e5d094ab1588fa84c01b6", - "size": 34983 + "path": "en/api/typescript/beta/environments/list.md", + "sha256": "ce1c3b63676e57c1dcc8de98a3074fe0804b8b857595e58a65f7c1bbc46bdb11", + "size": 7586 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/archive", "status": "success", - "path": "en/api/go/beta/agents/archive.md", - "sha256": "4dcb8c52f2a826d727f558230055986a94f1b18fbacaf9cd4bc99c3b7a477c36", - "size": 34317 + "path": "en/api/typescript/beta/environments/archive.md", + "sha256": "362fc9e3f81a3d01ff7f2f6a0d39764f793717fad2c5f5bf430d14792d436585", + "size": 7068 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work", "status": "success", - "path": "en/api/go/beta/models/list.md", - "sha256": "78bb76ab123c1e75a9e6730d0670542802ebfadcac9daf33e5da90cd64eb9895", - "size": 17577 + "path": "en/api/typescript/beta/environments/work.md", + "sha256": "abb6b35c661323850b5b2b8b0a4c67842c02a2c4c2a3e206fffa5ee2e0acb27e", + "size": 48837 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/update", "status": "success", - "path": "en/api/go/beta/models/retrieve.md", - "sha256": "dec7ef68c6b738ef752bdd37cb41f8bf1d90cc8cff78418a6006ca17183f66ac", - "size": 16024 + "path": "en/api/typescript/beta/environments/update.md", + "sha256": "d17c45ebf4c31c1859482b9990a8f14b9cf72476b9af9f56ff631f1bade2b1e5", + "size": 10184 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/retrieve", "status": "success", - "path": "en/api/go/beta/tunnels/create.md", - "sha256": "766b65268ddf5a11dcea0b1547909e75650fe07dc16064316b731b38cf8fd320", - "size": 7832 + "path": "en/api/typescript/beta/environments/retrieve.md", + "sha256": "794493313997fd1b1790adc9241ae67cacaa1151b994ad79825bde4e166a0131", + "size": 7007 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/delete", "status": "success", - "path": "en/api/go/beta/tunnels/rotate_token.md", - "sha256": "6a53b13d10d8b948cb21b70d68494970724a9b1e228d14bf23ab057da9b86cf9", - "size": 7505 + "path": "en/api/typescript/beta/environments/delete.md", + "sha256": "e03ebfb46cef12b2edb6f425374ac64962585007a5b2d57728d90ae83db3bafe", + "size": 3644 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/create", "status": "success", - "path": "en/api/go/beta/tunnels/list.md", - "sha256": "673932031fe21cb2836d489e26c67ca6c48d6a4711ef35bf4bb64b33fa5ad4b7", - "size": 8133 + "path": "en/api/typescript/beta/environments/create.md", + "sha256": "8bbd33d7aaeb39e6f599b27cfdd2ea824c89e085496fff8310761ef2d098cea9", + "size": 10091 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/models/list", "status": "success", - "path": "en/api/go/beta/tunnels/certificates.md", - "sha256": "7fa6465fa1733a35f468e236936f95df44350728d1cc20c910109d86e9416ddd", - "size": 33717 + "path": "en/api/typescript/beta/models/list.md", + "sha256": "9c3dcce65d595bfa863e2126152ae56bf2b5eb030d8c8790bba22054c4346403", + "size": 13977 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/models/retrieve", "status": "success", - "path": "en/api/go/beta/tunnels/retrieve.md", - "sha256": "f0c76587ca03657967941fa908964fc7ece3b9fd3d894024cec804a1198b3614", - "size": 7634 + "path": "en/api/typescript/beta/models/retrieve.md", + "sha256": "ccecf76e244bab3688c5bb29ae407a521f851269b27996ade7325215e8779118", + "size": 12597 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/list", "status": "success", - "path": "en/api/go/beta/tunnels/reveal_token.md", - "sha256": "1f304285c4378d2d4044bbe1197aa37bbdf05cea04904b6ed76ebdd4d5eb11fd", - "size": 7390 + "path": "en/api/typescript/beta/user_profiles/list.md", + "sha256": "293ad5098e1a17bfba5a8861b0b96d4a344a83888d055c25f446045f0a5ff170", + "size": 10158 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/update", "status": "success", - "path": "en/api/go/beta/tunnels/archive.md", - "sha256": "0b57b3589af6d4a1f2c9c1318a6e788f8afddd1b35c13075b147c5b409e3f475", - "size": 7933 + "path": "en/api/typescript/beta/user_profiles/update.md", + "sha256": "d9cf1c77216ddd81644b5c1f2f1b78d9136304b65a336da369dca9465647f450", + "size": 13211 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/go/beta/sessions/create.md", - "sha256": "a8f489f6598e99801ded768c13a4234267c8a52b76b6b09ba744ea3a018a63ea", - "size": 93260 + "path": "en/api/typescript/beta/user_profiles/retrieve.md", + "sha256": "94ba576616e23fa34a60c74069c55106a77d052c139a18236776d6daa3fc34f3", + "size": 8989 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/go/beta/sessions/resources.md", - "sha256": "811bdf89d642e65282a4fa0c940e1ab4d1a339f9e8dc46ae1f28b88d54a89878", - "size": 49702 + "path": "en/api/typescript/beta/user_profiles/create_enrollment_url.md", + "sha256": "f5c947cf7d5ad682fb327d6ec88f564f439ea287c36225b52edb3ad7ad02053c", + "size": 4031 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/create", "status": "success", - "path": "en/api/go/beta/sessions/update.md", - "sha256": "cc8a5ec32e45b3ecae9b6826bd7541a140f9733831dd8dc99cd3ea9ac851256d", - "size": 52014 + "path": "en/api/typescript/beta/user_profiles/create.md", + "sha256": "98392f357e03039568f9782ae6f72e4889e87b33cdfbc40d0070a6c50518b404", + "size": 13357 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/list", "status": "success", - "path": "en/api/go/beta/sessions/list.md", - "sha256": "923e9ce9aa5aba3af4103cf6395b7d2df4c45b043cfb5ec29737f9dae060ef5c", - "size": 54032 + "path": "en/api/typescript/beta/skills/list.md", + "sha256": "d96baeff666e6dd716419405a3b3a2d090470c7868528e5ed2318d38a353ff9e", + "size": 5780 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/retrieve", "status": "success", - "path": "en/api/go/beta/sessions/threads.md", - "sha256": "9024a040f15e25d01c10fd0bcc343c7761c62da9178bb60c54b7d376c6cb0fb5", - "size": 476490 + "path": "en/api/typescript/beta/skills/retrieve.md", + "sha256": "32b1980adf8cac84a36226b3b726b94c1a1abcde6c4ec8b8e0e69061c9e35e4b", + "size": 5154 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/delete", "status": "success", - "path": "en/api/go/beta/sessions/retrieve.md", - "sha256": "4ac049e9e58a2052e66d221fff0dfe046e10948e47bbf6ee71df94576f897da0", - "size": 50650 + "path": "en/api/typescript/beta/skills/delete.md", + "sha256": "867f0b5ef22916d7a185e694a0ed71064d10c52cf4b05e4bb173e1c1ac0ab5f0", + "size": 3602 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions", "status": "success", - "path": "en/api/go/beta/sessions/events.md", - "sha256": "e144e6a6c65d0daac53897843fe401549b362b29c75f66ec82a08d00dd135abb", - "size": 609476 + "path": "en/api/typescript/beta/skills/versions.md", + "sha256": "1067b79f0a107e883f2c0c6ef258a03918e40e2f07d2027000f86327d90efda3", + "size": 23046 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/create", "status": "success", - "path": "en/api/go/beta/sessions/delete.md", - "sha256": "dc3f4be1eaefb01c531f6bca1ffaad01490b91d4b2963cd681103607ce8839cf", - "size": 6774 + "path": "en/api/typescript/beta/skills/create.md", + "sha256": "4ff8288cbbd86fba24adb539b7b403b6eeb296e81d099477f89b19272bd2205e", + "size": 5451 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/list", "status": "success", - "path": "en/api/go/beta/sessions/archive.md", - "sha256": "af2a363bddb9fb48f3a4c0f0647a1505e34ba632d0d9268f502dbcd65375ba5f", - "size": 50684 + "path": "en/api/typescript/beta/tunnels/list.md", + "sha256": "b8f74c150696a08223390a8d5d20deb457076a064c99ac63bde38ff4d76e2c71", + "size": 4943 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/archive", "status": "success", - "path": "en/api/go/beta/deployments/unpause.md", - "sha256": "955cc2e6f00b4d5fb5b4c914cacc6e14be73c45de762d4d62d2ed7583516b034", - "size": 24213 + "path": "en/api/typescript/beta/tunnels/archive.md", + "sha256": "5bbbab3b5b458186d57582ad36cd0a7cd221645bba33ff29a3309f8238ed8d6b", + "size": 4709 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates", "status": "success", - "path": "en/api/go/beta/deployments/create.md", - "sha256": "5db2350aaf9838a4cd82c33eefd0a5443043bb48480f8311065a28d73c55c48a", - "size": 35632 + "path": "en/api/typescript/beta/tunnels/certificates.md", + "sha256": "a5b162622fe157d18b15e9852c4f6036ff49938d9030a602741e5a525729c138", + "size": 20869 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/retrieve", "status": "success", - "path": "en/api/go/beta/deployments/update.md", - "sha256": "c268656bbe1c29ec35aa03f5e4a16e1226f688f6051d9a298bd374c5871b4e83", - "size": 35184 + "path": "en/api/typescript/beta/tunnels/retrieve.md", + "sha256": "e4effb475e8f79060230dc68d1189d8364473e00fdf9ac1a25534d9d8b29bebc", + "size": 4427 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/go/beta/deployments/list.md", - "sha256": "cdd89b361eef1a5d3f76f468ca9ed59b0413c08ca19a46f2dae2ee676267a413", - "size": 25292 + "path": "en/api/typescript/beta/tunnels/rotate_token.md", + "sha256": "51aa484f4b5ad711456786b039359fe56986f258cad1299ed17b1a4258d5d251", + "size": 4239 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/go/beta/deployments/retrieve.md", - "sha256": "f3f2755cdeee6ceb931add3425f15e69d8d7ff3e8a3253c63f5a0ba8bb0c7d9d", - "size": 24168 + "path": "en/api/typescript/beta/tunnels/reveal_token.md", + "sha256": "026de85b6a79a84895fd8e0fa5987b9283d83853bff4ff592eb5e364c99e9882", + "size": 4140 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/create", "status": "success", - "path": "en/api/go/beta/deployments/run.md", - "sha256": "e0f6d8ad18d3ebe4cafbe3c77f66b0049f501686657d2485cac9f7a5fe70b73c", - "size": 13031 + "path": "en/api/typescript/beta/tunnels/create.md", + "sha256": "26c26be6718044a1046fc90772ed28467f641754f8556ad735f5128042f7ab1b", + "size": 4617 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/list", "status": "success", - "path": "en/api/go/beta/deployments/pause.md", - "sha256": "9d75105171c8ad649253a2b8df169da28aa68c289d17f1e911881380ac981f96", - "size": 24193 + "path": "en/api/typescript/beta/files/list.md", + "sha256": "0da22168bda6c5341ab291c11152c4723f2de7fb69ac182313cd731ef189a6db", + "size": 5648 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/go/beta/deployments/archive.md", - "sha256": "95a0ade5cc1040e46723dfc0e5d685d98616b57aa5b993952a4a31e58b233a8f", - "size": 24213 + "path": "en/api/typescript/beta/files/retrieve_metadata.md", + "sha256": "f3defedbad4cff557a54807e9ce60eb508ab7fc1b8ac28046f819ed73e06f291", + "size": 4806 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/upload", "status": "success", - "path": "en/api/go/beta/skills/create.md", - "sha256": "829d7e6fae88fbb7bba809d976c2fc9a7f9298e14477517c8b95650c33659e29", - "size": 8899 + "path": "en/api/typescript/beta/files/upload.md", + "sha256": "14ec2ccde36b5c5c329a02677db9b45b11fd6722af3c3e7cb8cba21a7f357544", + "size": 5213 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/delete", "status": "success", - "path": "en/api/go/beta/skills/list.md", - "sha256": "82a2519f44c0b1cbfa9ea07216f12c473944b70ed5fc1e016fa85dfa4fd8113a", - "size": 9164 + "path": "en/api/typescript/beta/files/delete.md", + "sha256": "83de44409c9298ae131210c1b8b72fac3a987880d1ebe9fe757059c7b8a296c7", + "size": 3451 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/download", "status": "success", - "path": "en/api/go/beta/skills/retrieve.md", - "sha256": "c178b950ca190d4361ad4752921c2df0763bbff01684415ee205f317ff3536f6", - "size": 8563 + "path": "en/api/typescript/beta/files/download.md", + "sha256": "a3e356e25c9d77a16951f4b2d5ee6238d272cdf6d026a8a5a9222a6267d8be9e", + "size": 3226 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/unpause", "status": "success", - "path": "en/api/go/beta/skills/versions.md", - "sha256": "b066b1571452517c27816d37c94abe3d70d04c5144896141292e9c7894a5dc48", - "size": 39234 + "path": "en/api/typescript/beta/deployments/unpause.md", + "sha256": "7419b50a62ba072e474baf68f4aba3b0c0e0992a0c3b263169ccc91b51faaadb", + "size": 19733 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/list", "status": "success", - "path": "en/api/go/beta/skills/delete.md", - "sha256": "e615c1277d154a250810f2b8a17337aac2d0e68f93b53309041dd3d21cf17e3a", - "size": 6848 + "path": "en/api/typescript/beta/deployments/list.md", + "sha256": "69834a2af1afe5630a73e46d1e4ce4f7ad69055482ee5b915dbf9255062bcc03", + "size": 21109 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/archive", "status": "success", - "path": "en/api/go/beta/memory_stores/memory_versions.md", - "sha256": "fe03ef334779fd0c14ef278373a0167aa257cbce81b1f584052c348703d2a86b", - "size": 51624 + "path": "en/api/typescript/beta/deployments/archive.md", + "sha256": "772ff577cd63c171b0b667482b08a347f4540dab7493a6a34727758fd9183516", + "size": 19733 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/update", "status": "success", - "path": "en/api/go/beta/memory_stores/create.md", - "sha256": "a8a7f072cedb877d24504b22de6a8519b588912d40918a14efbe02ddf033f023", - "size": 9805 + "path": "en/api/typescript/beta/deployments/update.md", + "sha256": "d3a1a1ce84325aafaa2c5d81f65dba652168862fd7f27c6f438a5ca8c78cf19c", + "size": 31456 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/retrieve", "status": "success", - "path": "en/api/go/beta/memory_stores/update.md", - "sha256": "9652b8c3e26638a6439aa95dffda9c416c75f198ab8039c04b2a7212117fce97", - "size": 9659 + "path": "en/api/typescript/beta/deployments/retrieve.md", + "sha256": "20079a5ea5575373ef93d275c25a59e72b6296e6ec4b95c21232700870c8db5f", + "size": 19705 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/run", "status": "success", - "path": "en/api/go/beta/memory_stores/list.md", - "sha256": "9160e1e3b5f945511274fb43aba0649f5f7e24af0e0a1ef32ee3e33be2cffd84", - "size": 9568 + "path": "en/api/typescript/beta/deployments/run.md", + "sha256": "6858af7749019383456eb4a6ea453335d5634ef372884cd8dd9d9cb4a4d0d898", + "size": 9618 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/pause", "status": "success", - "path": "en/api/go/beta/memory_stores/retrieve.md", - "sha256": "3eac3fea68f0723d0fdb295ba73d6db03febd1c3d05c958569e802213fbeea99", - "size": 8806 + "path": "en/api/typescript/beta/deployments/pause.md", + "sha256": "59970477c978170d719d18ab3687a7cb7fef263f10bad1bae91c0e7ae8aaf8f4", + "size": 19715 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/create", "status": "success", - "path": "en/api/go/beta/memory_stores/delete.md", - "sha256": "0e27c20fb44e375e06210bfb6f2179d1a32ceb1ff034fa3d9f6ed955077ad591", - "size": 7122 + "path": "en/api/typescript/beta/deployments/create.md", + "sha256": "012eff81b6863fedce64a91616bbd9e8931402afb980c2525fd6f51079f09c22", + "size": 31381 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events", "status": "success", - "path": "en/api/go/beta/memory_stores/memories.md", - "sha256": "782cef54e9868be68623f3875466e4b322c98953a46b56f1aa09d6dc18a228fe", - "size": 65630 + "path": "en/api/typescript/beta/sessions/events.md", + "sha256": "d0c5a5398260e84ab55507fc998d98ac92ee7da68627fdf6d51dc3ef745177bc", + "size": 588289 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/list", "status": "success", - "path": "en/api/go/beta/memory_stores/archive.md", - "sha256": "441960ad1f79baeae764a72c4a71095eabcf2293eda9c8f9cee30428a4b50dff", - "size": 8919 + "path": "en/api/typescript/beta/sessions/list.md", + "sha256": "20b948057dd2c9606641bdc5ec7d15ea1e490631796959e458fbdc527e3bba1c", + "size": 49511 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/archive", "status": "success", - "path": "en/api/go/beta/files/download.md", - "sha256": "b799b5875b3d602fa930063a75312312e9ba67b752be0c60ad20ab35e0571307", - "size": 6435 + "path": "en/api/typescript/beta/sessions/archive.md", + "sha256": "843cd92b712774be3b91b290c43275d43dc44e3ea685774cc92812c99c856751", + "size": 46612 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/update", "status": "success", - "path": "en/api/go/beta/files/list.md", - "sha256": "db52d7b4db21445f417a3c42d0b50a15defaea82aa9a6650f95b25558ffa607c", - "size": 8827 + "path": "en/api/typescript/beta/sessions/update.md", + "sha256": "b79ffb597816df2c2aa4e0f5495d2d51d50d0fa244bf62b1a75043a9f13a3834", + "size": 71771 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/retrieve", "status": "success", - "path": "en/api/go/beta/files/upload.md", - "sha256": "e03c14672bcb4c95542c6f637dd723a81deb5c44007dd58652807575d34ffeb3", - "size": 8459 + "path": "en/api/typescript/beta/sessions/retrieve.md", + "sha256": "bf36beec8131e1521ae191d39d5ec9e8b538c9fcfd2173994c9a24858a347519", + "size": 46595 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources", "status": "success", - "path": "en/api/go/beta/files/retrieve_metadata.md", - "sha256": "3d82d15c396827cd1cd014601ae7436d51004d5cd5697b32acd257baea747fee", - "size": 8031 + "path": "en/api/typescript/beta/sessions/resources.md", + "sha256": "5b25050b3e48c3efdb130c83456c5b9d588e089fc3c0a387b3d5b3f20210a8aa", + "size": 37407 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/delete", "status": "success", - "path": "en/api/go/beta/files/delete.md", - "sha256": "7bd50a4c19db511714546f1892afd8b269cabd0c4b09f63de0cba8976f07f50d", - "size": 6712 + "path": "en/api/typescript/beta/sessions/delete.md", + "sha256": "7946ddf0a1e3a3788f8711b2a8532ad6de52b1a07488c5a580708273ecb976e4", + "size": 3509 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads", "status": "success", - "path": "en/api/go/beta/messages/create.md", - "sha256": "c12118b87b7aa570943598e519ad1afe3e88c46d3424d18d5ba83dbbc1f3a52c", - "size": 332033 + "path": "en/api/typescript/beta/sessions/threads.md", + "sha256": "e62ead5c557eb79f3d5cc3a255046aebe75f2569cab5e63a70e4cdf8ac23a3bd", + "size": 456601 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/create", "status": "success", - "path": "en/api/go/beta/messages/count_tokens.md", - "sha256": "8b137b9eb4b29e455201edc12f6d9dcb8d403c21393773e863e4af0a2238ef60", - "size": 157951 + "path": "en/api/typescript/beta/sessions/create.md", + "sha256": "de84e5dea9a442358e864f97b07fde2013e328d39df3be5446502e297e7cedd1", + "size": 87121 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/list", "status": "success", - "path": "en/api/go/beta/messages/batches.md", - "sha256": "d34f259aab75827c096a7849178cd3cccfa13e56e86148ad4d51239a4f086bff", - "size": 902013 + "path": "en/api/typescript/beta/memory_stores/list.md", + "sha256": "12aa4a2b3745ba0702e6ba12742cc0ae43ee89e40c17047e9f092293f80eca72", + "size": 6375 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/go/beta/messages/batches/create.md", - "sha256": "a147d153beab2acf573eeb9b0b410f6c75238582970f285c050d46e6fa98c362", - "size": 193053 + "path": "en/api/typescript/beta/memory_stores/memory_versions.md", + "sha256": "ef38d0894b93eeeefba6d7422ff83fd0932bcf8459b094f1551756bfa963c7c5", + "size": 41592 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/archive", "status": "success", - "path": "en/api/go/beta/messages/batches/list.md", - "sha256": "12423159d11b8539dc200526cd3b6c1a1bcc14ff859964fd103ec2a3214dfc29", - "size": 11088 + "path": "en/api/typescript/beta/memory_stores/archive.md", + "sha256": "f01bebc7b06f5944c4619523f640e6dc5c6fe166cdc1cb6c4bb7d8105c240b46", + "size": 5678 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/update", "status": "success", - "path": "en/api/go/beta/messages/batches/cancel.md", - "sha256": "0cfac6a895023ef9d8a1b6417ee16aa82040347f86f2a593aab526f311ef6fa2", - "size": 10937 + "path": "en/api/typescript/beta/memory_stores/update.md", + "sha256": "d840974ade52b2c22f6b37b46d43ab2c9a4b45ec94f242517cfe5556deaf5db4", + "size": 6402 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/go/beta/messages/batches/retrieve.md", - "sha256": "c2bcc7b1d74fde8f57a437ddbce3e63f72ca42f25067134a2b39f79faad38ec1", - "size": 10615 + "path": "en/api/typescript/beta/memory_stores/retrieve.md", + "sha256": "859f523473c0ce2076cc7c565fc625e6f2de692790dacf8af068ee80da9edf2e", + "size": 5586 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/delete", "status": "success", - "path": "en/api/go/beta/messages/batches/results.md", - "sha256": "1da812f2e63e85c11c0f52c58571408678f2dad98d01c56dd2df63479560c418", - "size": 174909 + "path": "en/api/typescript/beta/memory_stores/delete.md", + "sha256": "03e7fe48fbd9864072a4f64ba5350d81e6798726940f3e86c19061fbb25e8970", + "size": 3854 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/create", "status": "success", - "path": "en/api/go/beta/messages/batches/delete.md", - "sha256": "cd6739c5c652283d021c32ce3b7602b352e63a4dedbc11ceb3c43d19256fbdf5", - "size": 7200 + "path": "en/api/typescript/beta/memory_stores/create.md", + "sha256": "42d28aeaf113b4589b0a663cc00c5acac6e961b4fdcedd27390f2ca3bc8f4b04", + "size": 6568 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories", "status": "success", - "path": "en/api/go/beta/memory_stores/memories/create.md", - "sha256": "2a916fc336bc9a2923c0b93e849a202c0f17e8feec2acde8282a1100d02d21cf", - "size": 10346 + "path": "en/api/typescript/beta/memory_stores/memories.md", + "sha256": "fbb59bf467d46a5bd629161ade4dde7badc765078bd54409874efa5f2a06fdd8", + "size": 50905 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/go/beta/memory_stores/memories/update.md", - "sha256": "600a005b196652e9b1b081c1e97389998799d3231009005991e4533efe91ab32", - "size": 10749 + "path": "en/api/typescript/beta/memory_stores/memory_versions/redact.md", + "sha256": "697191dbb8a8cc893d5f7e1553b5766636e988e6139383f6f500926a1ccbba4f", + "size": 9659 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/go/beta/memory_stores/memories/list.md", - "sha256": "ea597f0db989dbd9782686fd520653aa76d84f03cc80b5cd6e968111acf7ece0", - "size": 11900 + "path": "en/api/typescript/beta/memory_stores/memory_versions/list.md", + "sha256": "bf4c17ad6cb8047fd9486b40d1023c9346453179dae6975e5d20710421c5403b", + "size": 12342 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/go/beta/memory_stores/memories/retrieve.md", - "sha256": "d5087e3c56e2438d703993bb1365718ebf2e6344b3f37f44317b7293dbe87857", - "size": 9814 + "path": "en/api/typescript/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "aaa9a805cfca6a4514212ef29df52dc994b474e3f1b225a2f5ec49e45f54f617", + "size": 10288 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/go/beta/memory_stores/memories/delete.md", - "sha256": "e768913f3a8da3ff0894bc166510d08e63bdcda32fdc876e70d7829acef58a83", - "size": 8008 + "path": "en/api/typescript/beta/memory_stores/memories/list.md", + "sha256": "463aab7ac046ee03c7f864061efd2f4381dde1449038caabb5bb5c9da82a0dda", + "size": 9034 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/go/beta/memory_stores/memory_versions/list.md", - "sha256": "dc8cf7684e188937bfbd866f71568892b3cf10b06cbac9c21d1e548f5cf5a13f", - "size": 15119 + "path": "en/api/typescript/beta/memory_stores/memories/update.md", + "sha256": "9037ad2bcebe7da7c68e5afb717d474877d27526c736357d87451bf41599e246", + "size": 8128 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/go/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "2009cacc1d2839d170228d719b059b0cb424cfd89a94ecdbf9a56b15df197b1d", - "size": 13525 + "path": "en/api/typescript/beta/memory_stores/memories/retrieve.md", + "sha256": "efffacb149a8397861ed395f5037824b6bc016b007bac83ad2652523b22a8b41", + "size": 6883 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/go/beta/memory_stores/memory_versions/redact.md", - "sha256": "727f5b346a3c516121719ddd345ce16dd391ad72f2cae9810db49b5a5539c17d", - "size": 13219 + "path": "en/api/typescript/beta/memory_stores/memories/delete.md", + "sha256": "273272c11022d487129251f67cced86810798ca457edc23da3dcc239e387abd9", + "size": 4730 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/go/beta/skills/versions/create.md", - "sha256": "11040650345bbe5d3535b026b277b7862582fbe634cbb5b5e43fa4200ded3a23", - "size": 7994 + "path": "en/api/typescript/beta/memory_stores/memories/create.md", + "sha256": "c3cbb60caa48c14db5f33ceac4711fdff79b4755cf43a3bc4943e6590f4f21bd", + "size": 7382 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/list", "status": "success", - "path": "en/api/go/beta/skills/versions/download.md", - "sha256": "42acf72d23f4bf7962bf454309532f369a00c251fe899acbdb41785cea98aed1", - "size": 6919 + "path": "en/api/typescript/beta/sessions/resources/list.md", + "sha256": "058533c1ab4e541acb406d2a7cceb945b45f13022ba375d8e1cbb7d51febf09f", + "size": 6890 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/update", "status": "success", - "path": "en/api/go/beta/skills/versions/list.md", - "sha256": "d78c97c290460f733a1db2614f514e8640337d025d8ce9084b2e64115a99a671", - "size": 8098 + "path": "en/api/typescript/beta/sessions/resources/update.md", + "sha256": "1305323434552ed2446baf1767e7817883299167179d076d53955825d5175c50", + "size": 6490 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/go/beta/skills/versions/retrieve.md", - "sha256": "ce8017b91a8e4c4be405ea148ccd66dd2435c3459403319af7b22ba7c91dcfe7", - "size": 8043 + "path": "en/api/typescript/beta/sessions/resources/retrieve.md", + "sha256": "02c1ac3442bd74b530571e47457c34cff4ea854dfef2168140665dec16a2b251", + "size": 6267 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/delete", "status": "success", - "path": "en/api/go/beta/skills/versions/delete.md", - "sha256": "112afe0a0c3a3a3478b9b9fceeb4ab5366f5ea04a889ba5ca7dbded27d491cf1", - "size": 7255 + "path": "en/api/typescript/beta/sessions/resources/delete.md", + "sha256": "44dfd1d967e7a9e56edae8a40243d2e63eda1fbc8d8dd63c6518cd099edddfd8", + "size": 3711 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/add", "status": "success", - "path": "en/api/go/beta/sessions/threads/list.md", - "sha256": "a6ae02ff15139c09591c3770a2ff9df8729478d85281038d9654f1d5465d5c30", - "size": 39116 + "path": "en/api/typescript/beta/sessions/resources/add.md", + "sha256": "c5e832ebb423a052af1ea9bde1147bb1962613ee7fc94a82c2ead1fc7b4db48f", + "size": 4174 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events", "status": "success", - "path": "en/api/go/beta/sessions/threads/retrieve.md", - "sha256": "a3957bfb8319f1373e3dff7781ac68f90a38ffb96c8268d1c847252e63873ec1", - "size": 37878 + "path": "en/api/typescript/beta/sessions/threads/events.md", + "sha256": "e31e58abd7b0c990edab3b0921c2bafb77e85cd633c17dcb2045140c5e156ffe", + "size": 202786 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/list", "status": "success", - "path": "en/api/go/beta/sessions/threads/events.md", - "sha256": "b9bbef0547498c88004316b902a5a74c38e65800fc0fae0299948918e536b707", - "size": 209068 + "path": "en/api/typescript/beta/sessions/threads/list.md", + "sha256": "6b216d902ed7dfd8b68a41e3a977fa504323e5332753462311ae60b4e5ef50f7", + "size": 34858 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/archive", "status": "success", - "path": "en/api/go/beta/sessions/threads/archive.md", - "sha256": "d72f14ad6d7ccf91eb6b4a13211ca65857c12ea3d88657da4117deb70822d168", - "size": 37914 + "path": "en/api/typescript/beta/sessions/threads/archive.md", + "sha256": "6a8a10e36c6103c66347a39998740ced1a0436290fda2e3cd5e127ea411b7c2f", + "size": 33940 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/go/beta/sessions/resources/update.md", - "sha256": "87c3efc609ea98971c45a28a7c966eaafbd37bc6c66d488a5a941669da1a5584", - "size": 9991 + "path": "en/api/typescript/beta/sessions/threads/retrieve.md", + "sha256": "fd00631aae5226f7067c6a8cb2708368d87239b7823e2f561da383a555c88fa9", + "size": 33923 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/list", "status": "success", - "path": "en/api/go/beta/sessions/resources/list.md", - "sha256": "924241a48acc2f91194abae885d0e9e9b8e0812607308cc2ec9dc5427253501f", - "size": 10281 + "path": "en/api/typescript/beta/sessions/events/list.md", + "sha256": "1699d065e0c6744ca0ffdba5af61cf6a031a6fb53d12c1beabff8f0ebc00321d", + "size": 102325 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/stream", "status": "success", - "path": "en/api/go/beta/sessions/resources/retrieve.md", - "sha256": "c924fee4794b1f5eaac29d1aa82bdf97e31e2b579582034829bb9a7d447cd918", - "size": 9731 + "path": "en/api/typescript/beta/sessions/events/stream.md", + "sha256": "c86fe3a998aef42a4f6279edb97ec83d14c689face92b033678ed0b28254c117", + "size": 102830 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/send", "status": "success", - "path": "en/api/go/beta/sessions/resources/add.md", - "sha256": "d14a41d1e6d5f57917b48e15c488a119a76b7ac89b33bf510bbda0dd7b660e4c", - "size": 7473 + "path": "en/api/typescript/beta/sessions/events/send.md", + "sha256": "8199569ac3249ed76c962663b4b5537a88c1e772cecb1f14b5a5296cf5a155f4", + "size": 26726 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/go/beta/sessions/resources/delete.md", - "sha256": "930e579af2d41b16d8f806d77f0e0062b7d724bcfb310367553c00742eccf4f3", - "size": 6991 + "path": "en/api/typescript/beta/sessions/threads/events/list.md", + "sha256": "e1cd0cc442d246349452256c3ac462aaf9fab0f800906cbe2ace776015f59145", + "size": 99890 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/go/beta/sessions/events/send.md", - "sha256": "ce9c1b7904cbf5919139522bf2b0c2b19236b0a4758a285ce209cb0441335e3a", - "size": 30904 + "path": "en/api/typescript/beta/sessions/threads/events/stream.md", + "sha256": "5cc7175ee4308ace05afb461319ff1606d23bf30fe273749e1cd4be99a1f339e", + "size": 103037 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/go/beta/sessions/events/list.md", - "sha256": "b06eca453de85a876322c61b1b49570a4446739eaf7ad3f417afd12d80e41423", - "size": 109458 + "path": "en/api/typescript/beta/tunnels/certificates/list.md", + "sha256": "239f2add479cdc08f845b19c346683b0bccdadf3f51e891ac4f18a93700cef54", + "size": 5321 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/go/beta/sessions/events/stream.md", - "sha256": "bc9058f017d4e188c6768b85e5d1c2c3e3cd9ea1bea26a835d4dcf583f53c7ab", - "size": 106103 + "path": "en/api/typescript/beta/tunnels/certificates/archive.md", + "sha256": "d754572e878acc7acd5cbb21583e1cf2c256241c58710fcc845a28737bca2ecb", + "size": 5085 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/go/beta/sessions/threads/events/list.md", - "sha256": "3ac99aa1b1edc664a7c29c10bdd40cdaa0924114b75a4dfa6c6379bcae6b9035", - "size": 102897 + "path": "en/api/typescript/beta/tunnels/certificates/retrieve.md", + "sha256": "4eb0996af50b7fcee2f06558e5aaec8c8080cfa96552c5ca2cfef2e9718c6d43", + "size": 4849 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/go/beta/sessions/threads/events/stream.md", - "sha256": "67238b54ae26b0a2d17fa5b1446408fea93de329e8529e41aa378dcc98a288e9", - "size": 106304 + "path": "en/api/typescript/beta/tunnels/certificates/create.md", + "sha256": "988a6ff1ee559c734f0e932a52465390fba46a8be0265daa9f9531dc6e61f3ba", + "size": 5095 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/list", "status": "success", - "path": "en/api/go/beta/tunnels/certificates/create.md", - "sha256": "32383af499ea25e2a05fa8f481ed8219cb35b990ce3b19fb37c7938482d6b3ec", - "size": 8318 + "path": "en/api/typescript/beta/skills/versions/list.md", + "sha256": "e4c2acd6e147c12cfaa2af62a790cd74ac5e66c776b0dfccc30313804699649c", + "size": 4910 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/go/beta/tunnels/certificates/list.md", - "sha256": "1b3f20bd833894fe0f8a417f7e10b14f3f6ec92703d5fb3d29c854eab0077363", - "size": 8512 + "path": "en/api/typescript/beta/skills/versions/retrieve.md", + "sha256": "86732de41e8f671457eebbb006a6c1f50122fff6701779564a0cc0b50f947f18", + "size": 4809 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/delete", "status": "success", - "path": "en/api/go/beta/tunnels/certificates/retrieve.md", - "sha256": "01f0e2a58b4f46cd73600306de1781fdc5bd227969a87da5c658fac68fd7e9a9", - "size": 8064 + "path": "en/api/typescript/beta/skills/versions/delete.md", + "sha256": "034a94979af2d4a90642409591277f895a7e893d6fc13261ac55efcd5dd49275", + "size": 3996 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/download", "status": "success", - "path": "en/api/go/beta/tunnels/certificates/archive.md", - "sha256": "c00405cd3770dce9a17e8118416a410370c7eeb4bffe9f9668fd7ed76d63b524", - "size": 8319 + "path": "en/api/typescript/beta/skills/versions/download.md", + "sha256": "5dcf01ad9e2f710c62b31df2b97da46e3f7331c964d601a09466357561170051", + "size": 3689 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/create", "status": "success", - "path": "en/api/go/beta/agents/versions/list.md", - "sha256": "6ee4b86dd3a68c87609e433d13180aa5031fee03e18ba22fcdb1013470570224", - "size": 34982 + "path": "en/api/typescript/beta/skills/versions/create.md", + "sha256": "1b5e34e7de9d3a86791110675be9291998c081088a67b49a4228c48281ffcbcb", + "size": 4720 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/list", "status": "success", - "path": "en/api/go/beta/vaults/credentials/create.md", - "sha256": "51278aaed14589694add98c4053f63ef7912bbe2c887f2558ad2cd4967ba96d1", - "size": 17212 + "path": "en/api/typescript/beta/environments/work/list.md", + "sha256": "4f17aeb87fef2f07fca3b177e67f5f2c39eee53faefdd56a5512d7175f5bcf1b", + "size": 5775 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/go/beta/vaults/credentials/update.md", - "sha256": "b44a70b8385da6a1f5837979421500ded5ed3743d538b6d3692cdbf568c6fa86", - "size": 16638 + "path": "en/api/typescript/beta/environments/work/heartbeat.md", + "sha256": "bf8a919ec9963c45fa9adf25edf112c41653a1803b03917cc8c55be7acf5d2a8", + "size": 4600 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/update", "status": "success", - "path": "en/api/go/beta/vaults/credentials/list.md", - "sha256": "bc8803a51a9d08bd4611036fe29b0216fd786efaf0817f7f068e56e95b0ffa59", - "size": 12126 + "path": "en/api/typescript/beta/environments/work/update.md", + "sha256": "fa2fb0fb853cc132f505ab25a750ced744e92db6ead5aa7e7bfb37ec206b28dd", + "size": 6025 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/retrieve", "status": "success", - "path": "en/api/go/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "f2cddf61d44cfc057f8d4e40292f96e0817abd773a454d730c449a492736f06a", - "size": 11057 + "path": "en/api/typescript/beta/environments/work/retrieve.md", + "sha256": "3bef78950cc8d033debd81caf6476c3155a24a511cce6c58eb7adb1f7dcc2c52", + "size": 5830 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/poll", "status": "success", - "path": "en/api/go/beta/vaults/credentials/retrieve.md", - "sha256": "f1c1d97698777613eefaaee165291b392a33c24f413a53271e8a1646e2ce37b6", - "size": 11629 + "path": "en/api/typescript/beta/environments/work/poll.md", + "sha256": "d549ad54802d214c973912cd81f89dcc638b751ecb8893ef9571f0c3f971fbe6", + "size": 5711 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/stop", "status": "success", - "path": "en/api/go/beta/vaults/credentials/delete.md", - "sha256": "161546b3e4f3f61c1783d66673187cb3aae1159183df4864d0852ba243d7a4c5", - "size": 7122 + "path": "en/api/typescript/beta/environments/work/stop.md", + "sha256": "f7bc06eacd8f418a6cd2da9c6afa747fe518c3f872f9585962fa6531bdfa357e", + "size": 5897 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/ack", "status": "success", - "path": "en/api/go/beta/vaults/credentials/archive.md", - "sha256": "973dc330138783eef99823c8debdabfb1d30c0e7fdf909b8b30b2eedd4b76e49", - "size": 11649 + "path": "en/api/typescript/beta/environments/work/ack.md", + "sha256": "227d9232c16ef826334599cfd95e56386cf2315c55d397fad3e50bd36c400208", + "size": 5511 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/stats", "status": "success", - "path": "en/api/go/beta/environments/work/update.md", - "sha256": "e7d143473e4b90173266640c70387a09fe099543c5b2a076e4562f411fa2c281", - "size": 9588 + "path": "en/api/typescript/beta/environments/work/stats.md", + "sha256": "069d0d706bf2f6aaf86cc16fa8a45e0860d54a6d07ca3099e1a6b711db61a2cc", + "size": 4248 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/versions/list", "status": "success", - "path": "en/api/go/beta/environments/work/list.md", - "sha256": "d3cf3c751b51836294f0031a6ff60a802b548216cf49e73abc1b9d50007ccbf4", - "size": 9191 + "path": "en/api/typescript/beta/agents/versions/list.md", + "sha256": "28c47fcd5bdd1f1edbf202901b60e97fa476218b2ec3528a61ba4e0628adb020", + "size": 31331 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/cancel", "status": "success", - "path": "en/api/go/beta/environments/work/stop.md", - "sha256": "db5e3baa48365ab4619cb3f005cf56e40b4fdd4e0afb2aa0a8eb4b1586c490d5", - "size": 9512 + "path": "en/api/typescript/beta/messages/batches/cancel.md", + "sha256": "d4f8264e1d4b2fc496bb59c527e564b85aa97a68e268deca22a3b43bffbf1c79", + "size": 7509 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/list", "status": "success", - "path": "en/api/go/beta/environments/work/retrieve.md", - "sha256": "6c718ab1146d0c1e50fb3d06cd0461cf38c384895728ac44fe67878086965c11", - "size": 9310 + "path": "en/api/typescript/beta/messages/batches/list.md", + "sha256": "27b736682f341d292299890416187aa68f1221c8479f51d1441af773265a4bf7", + "size": 7703 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/go/beta/environments/work/ack.md", - "sha256": "9c155dd8627a1f260752f245dcd9484520a08c79d1770680f3ccf7d7db2436ed", - "size": 8989 + "path": "en/api/typescript/beta/messages/batches/retrieve.md", + "sha256": "72cebb3d935e30a71c80ab8f4b5fa56dabf398a593478fa7cf0eac8a710fdbc8", + "size": 7203 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/results", "status": "success", - "path": "en/api/go/beta/environments/work/stats.md", - "sha256": "d8499fc2eb98a467a5fb9e2ea8657c50baca6f784be1ed669affd4128576d681", - "size": 7488 + "path": "en/api/typescript/beta/messages/batches/results.md", + "sha256": "3f2e65cb3486a7b593079e3ea5b86d7b03e14477886dc01fa539afdb443fdf8c", + "size": 156903 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/delete", "status": "success", - "path": "en/api/go/beta/environments/work/heartbeat.md", - "sha256": "3692a4dfc6d480cb542c50c69e36a70eac85591f32cd9c796bb23fa9d29ffaf7", - "size": 8341 + "path": "en/api/typescript/beta/messages/batches/delete.md", + "sha256": "78ec5657bcf4e85a0efd67d8b6dcf1707f52af3a54e97cbdbe9f6bbb31253663", + "size": 3949 }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/create", "status": "success", - "path": "en/api/go/beta/environments/work/poll.md", - "sha256": "6711b2aec508ec01202ea97d96c21ba01d3a8b8cc3825d3b207c7bddbb85d908", - "size": 9471 + "path": "en/api/typescript/beta/messages/batches/create.md", + "sha256": "fa2b386cd6ee9ea2b1d7f66a3cbf24eb9e74fb46d9eff92884ad5fea9fb78252", + "size": 174167 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/list", "status": "success", - "path": "en/api/cli/beta/sessions.md", - "sha256": "120957df5ee1e55dcf4ead8ff1354f093a3c4207dcae541ad1410e1af89768f8", - "size": 1196982 + "path": "en/api/typescript/beta/vaults/credentials/list.md", + "sha256": "547544ce99bff47c9a848d986fdf43cca18816b6d680c3055d5a3ddaf105645b", + "size": 8968 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/cli/beta/webhooks.md", - "sha256": "c9fdede1add0bda5dd09b8bd45d5346a05eb99296a41eb5c43fd7a27e288ab8e", - "size": 37705 + "path": "en/api/typescript/beta/vaults/credentials/archive.md", + "sha256": "96772b8b12140a3a29a1f8c1d51c3edbf711d93c0f8453131d353bfe590348e8", + "size": 8424 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/update", "status": "success", - "path": "en/api/cli/beta/skills.md", - "sha256": "669c8c2890e553457c8d4376f30ba93e58d84871d1c1568849cf53757c64cf8c", - "size": 23606 + "path": "en/api/typescript/beta/vaults/credentials/update.md", + "sha256": "0d73461f555888efbc083a5faef8899a26d387b53a7a70a6856dbd47108ddd2e", + "size": 13322 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/cli/beta/agents.md", - "sha256": "7a656b34ac7e0cbe35f713258210e437cde86aba5d2943b47bf9687b14154031", - "size": 410572 + "path": "en/api/typescript/beta/vaults/credentials/retrieve.md", + "sha256": "56cad22160b05700ec2a4d31534127514669aeb4653d936f9473ab483e5d8bfd", + "size": 8423 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/cli/beta/deployments.md", - "sha256": "a88388dc7208ab58e8054cdd0af5057a427c5ec71ad1b6a331422ba4028cd645", - "size": 190892 + "path": "en/api/typescript/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "56c0df8b9c1aba9d17eccaccb02b1de12ab05f2aada719383f395ea8bfbad504", + "size": 7187 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/cli/beta/deployment_runs.md", - "sha256": "7ccf879197326e2a01460a3533f97275cb99c5b256cbee887c224ad363379008", - "size": 28830 + "path": "en/api/typescript/beta/vaults/credentials/delete.md", + "sha256": "29f129bcfc640608989fe34a0328b5f5d6d4f820f0695cb23e3f5d98fdfc7535", + "size": 3848 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/create", "status": "success", - "path": "en/api/cli/beta/user_profiles.md", - "sha256": "32ac84df5b28ec210834fbcb69796ff5975b7148794474487bd0f2eaa3affb24", - "size": 45274 + "path": "en/api/typescript/beta/vaults/credentials/create.md", + "sha256": "2e3ef296b7b5bffdc288dd966389db666ae521f9743c5caa8f01abcf50cee7e3", + "size": 13762 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/models", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/cancel", "status": "success", - "path": "en/api/cli/beta/models.md", - "sha256": "262e9456eebb56fcf3ceb660183559400712c6ecba9879b09002f2bfcf8eb7d1", - "size": 46934 + "path": "en/api/typescript/messages/batches/cancel.md", + "sha256": "5e3fa4682a36c98833b368ec01b063eec5838dbd359e8d43a2bc39d4f7b9c3c2", + "size": 5353 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/list", "status": "success", - "path": "en/api/cli/beta/vaults.md", - "sha256": "4d8f5500ac97c83f196531d6d5a72e78bb11bc6c08b05ebcac9b8491ff84f3f7", - "size": 50207 + "path": "en/api/typescript/messages/batches/list.md", + "sha256": "9b99d48fa39b850f6e9475695438b9b659a772e7e3badf3faf29649284f11fc8", + "size": 5547 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/retrieve", "status": "success", - "path": "en/api/cli/beta/memory_stores.md", - "sha256": "01f5cde5abf83e2786c46b0cdead666b9d8ab030f8ef255d74f246d6806eb39e", - "size": 71427 + "path": "en/api/typescript/messages/batches/retrieve.md", + "sha256": "c6525f32b5eafb682fd0d5c0be579f4ed869e9e5db35bf468ca069ec133818ea", + "size": 5047 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/results", "status": "success", - "path": "en/api/cli/beta/tunnels.md", - "sha256": "a6505a8e3b10e44261bf779b15788a80c1c3cc4a5fd67c40923551e2d6e5ebf8", - "size": 25172 + "path": "en/api/typescript/messages/batches/results.md", + "sha256": "ba451f128d83a96fa7155eb3103f681ce7963e21031001292a231f44e712e7f8", + "size": 40024 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/delete", "status": "success", - "path": "en/api/cli/beta/environments.md", - "sha256": "11b0e93a93e9ccbce8b912af2e02d0e70a18deb4c9c48f27572d5b28b16a290e", - "size": 60825 + "path": "en/api/typescript/messages/batches/delete.md", + "sha256": "46fdfd0b33adef988d5799146b8c7abc9e63aa70ea38db05f199ab7a229d7567", + "size": 1797 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files", + "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/create", "status": "success", - "path": "en/api/cli/beta/files.md", - "sha256": "ec00adeb9fe8c4ded12ade8e60ca81045cff2820c6b3d5393840f1d26384a01d", - "size": 12411 + "path": "en/api/typescript/messages/batches/create.md", + "sha256": "eebf839d2c359a6dd73f836d71bc7d18eeb77ca6a7eb242010ec773e84a82457", + "size": 114400 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages", + "url": "https://platform.claude.com/docs/en/api/python/messages/count_tokens", "status": "success", - "path": "en/api/cli/beta/messages.md", - "sha256": "3a9cbf5cb4a21927dc2621b6dd14148ef59aebd5eecea6ba746ab4ad8c381f67", - "size": 2935296 + "path": "en/api/python/messages/count_tokens.md", + "sha256": "d923b7c8299d32b925601b5b8dc711a82f5b37284900c51a94de0fdce7745392", + "size": 96229 }, { - "url": "https://platform.claude.com/docs/en/api/cli/models/list", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches", "status": "success", - "path": "en/api/cli/models/list.md", - "sha256": "b33e822b4b85d34f6dab30b7419f43972a4323caa9e4b17635d6da820c217e0b", - "size": 12928 + "path": "en/api/python/messages/batches.md", + "sha256": "aadc56f5f638aaaa7a731f3554af04160b3d73bf24522ef9125141bb40cef0d1", + "size": 280747 }, { - "url": "https://platform.claude.com/docs/en/api/cli/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/messages/create", "status": "success", - "path": "en/api/cli/models/retrieve.md", - "sha256": "9fe2e7aad7d53c10ac5af92be59ce436d4970b6faf111e3f6f817d67b48f999c", - "size": 11058 + "path": "en/api/python/messages/create.md", + "sha256": "78721e0a29b117fcf5e37eeb67e9283b95bb06fb1441751dc1e942353096ade0", + "size": 138100 }, { - "url": "https://platform.claude.com/docs/en/api/cli/completions/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults", "status": "success", - "path": "en/api/cli/completions/create.md", - "sha256": "06d06560c4a36c8f222b3fe5e4f07c9bb2bf83360bd52357d2700f55e166c1eb", - "size": 8211 + "path": "en/api/python/beta/vaults.md", + "sha256": "b575d66efde8536febe452eaa0903150383763340e5b59cadff24894ae45477e", + "size": 84430 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs", "status": "success", - "path": "en/api/cli/messages/create.md", - "sha256": "03472b8f709bd3987b65dd44c296be44c09d83ac08761ec3a684fd67b1379cfe", - "size": 61454 + "path": "en/api/python/beta/deployment_runs.md", + "sha256": "d1239596c6f5759ed60592c80c10f967a22e557305b3bce0036fc663697b9d56", + "size": 32339 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/python/beta/webhooks", "status": "success", - "path": "en/api/cli/messages/count_tokens.md", - "sha256": "aa161c84f800e0e1002d1fea041ca7bf6bcbbd378b9bb455b80ef501f6613656", - "size": 8814 + "path": "en/api/python/beta/webhooks.md", + "sha256": "7be33dc2c44044b6345a3a14edc3b45b3105e172a291cd0fecf4234256d5de19", + "size": 36380 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches", + "url": "https://platform.claude.com/docs/en/api/python/beta/models", "status": "success", - "path": "en/api/cli/messages/batches.md", - "sha256": "fcb941fb279a94d84571d928acebb43d540432fc03fa52b52a330e831ed0b4c5", - "size": 163331 + "path": "en/api/python/beta/models.md", + "sha256": "09d72b51e358c511941391b956f3bbd0e087754b4a791e5e8e78151649ad5e82", + "size": 44340 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills", "status": "success", - "path": "en/api/cli/messages/batches/create.md", - "sha256": "cb1a4bd11289a1245d9bf71736f6fa418d8ec5c4b10a797d16872924c79291f3", - "size": 5174 + "path": "en/api/python/beta/skills.md", + "sha256": "97a0187f329427becec5c453e19abe1aca60cc355f6087f72bb392a6952d4276", + "size": 42154 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores", "status": "success", - "path": "en/api/cli/messages/batches/list.md", - "sha256": "19125d83ad70a6f6085e5167e2052cb8d738a3566f61df198f7ddaa988ba9087", - "size": 5518 + "path": "en/api/python/beta/memory_stores.md", + "sha256": "071deb37a4a02536cf0ca5bf38eab1b75db906bde5efe8516a57856aee39a0bb", + "size": 101172 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages", "status": "success", - "path": "en/api/cli/messages/batches/cancel.md", - "sha256": "b388420b49cd5bbe7430fe75bd1dbc5f1ee4b5914fe7db9c06bb9dcdc4ccd004", - "size": 4924 + "path": "en/api/python/beta/messages.md", + "sha256": "8da7512de5f4fe39ddc287ca54b93a3002a2654bcb41fd0ad1a0ebb67749f5b0", + "size": 2931560 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents", "status": "success", - "path": "en/api/cli/messages/batches/retrieve.md", - "sha256": "b111c11e3f83bb31e1bd35200739fbdca845a7008bd8a64fff0b44746b8c8f8d", - "size": 4616 + "path": "en/api/python/beta/agents.md", + "sha256": "ad57503e4b80a3d28f98a5a14495b3cde149895a875808e7bb37acab16141a8b", + "size": 451036 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions", "status": "success", - "path": "en/api/cli/messages/batches/results.md", - "sha256": "abedc8f68f5277703ef5ff5b67a8f310293d7d89f6539ff71d6441fd4c87eae9", - "size": 36613 + "path": "en/api/python/beta/sessions.md", + "sha256": "31a8242bb95e5144a8fb79f91894d0b1654ad1c29b9afc76867f37bb8493c808", + "size": 1170714 }, { - "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles", "status": "success", - "path": "en/api/cli/messages/batches/delete.md", - "sha256": "22c0d47301b6e5d99a2011d16ec197483a331e8acd537d49004041296abbc499", - "size": 1475 + "path": "en/api/python/beta/user_profiles.md", + "sha256": "372c7914915906ebf000a47b25656d26e431aeef32377f9fcb4d96c4b44db2ea", + "size": 66316 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/files", "status": "success", - "path": "en/api/cli/beta/environments/create.md", - "sha256": "4ccba80505e0f2a36856d33af468f6c18c808ce500868762519979dfad826dd2", - "size": 5343 + "path": "en/api/python/beta/files.md", + "sha256": "651f60cf6b868d41c7afd6e91593fc6136a714bb67c1c0dc478cb417e708ea07", + "size": 22826 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments", "status": "success", - "path": "en/api/cli/beta/environments/update.md", - "sha256": "7d6286beaaaf40e2bc49fbd280926f5ceb551a3535dacac2e8b68de99b178dd8", - "size": 5440 + "path": "en/api/python/beta/deployments.md", + "sha256": "4e39a0dd7753a98de6fcbe3ab885cb6c9c89767414e30e8612fa9ac98159aa0a", + "size": 218429 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels", "status": "success", - "path": "en/api/cli/beta/environments/list.md", - "sha256": "fb388e18ec683c878930062e016c8c471905e058dbe4e40d5f23e3e03520a949", - "size": 5696 + "path": "en/api/python/beta/tunnels.md", + "sha256": "15d978fa2ab78a1776f4b8066e77c79f9eb74e0e96c7e65c1c37702271cd433f", + "size": 45882 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments", "status": "success", - "path": "en/api/cli/beta/environments/retrieve.md", - "sha256": "d3f4c90279254e32b059aa1d9aaec3b90e7ffbbb9ef9f2db617bc69b4aa4345b", - "size": 4683 + "path": "en/api/python/beta/environments.md", + "sha256": "021ae566ba96ba1ff9d534cea1afc102a8b8540bfbf9b74bd6561a0087207842", + "size": 95159 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/python/models/list", "status": "success", - "path": "en/api/cli/beta/environments/delete.md", - "sha256": "fcafe14bbcf3676688caf4ebaee527c7053d126a4ddd2a14ae9bccf86c948210", - "size": 1300 + "path": "en/api/python/models/list.md", + "sha256": "4e69ccb5164826bcc8807b1bfd84b023d6b7529f1a86d947b80548332f449a7c", + "size": 13061 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/python/models/retrieve", "status": "success", - "path": "en/api/cli/beta/environments/work.md", - "sha256": "9553d9d8c442f8aa90dd1c9a56099595b9a42b81eb3210cab956f41f814ad350", - "size": 29982 + "path": "en/api/python/models/retrieve.md", + "sha256": "03c7308aa80bc4cfc9b032f39a4add04a6934b7068a2b1bd71b8339f1e9105e0", + "size": 11756 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/python/completions/create", "status": "success", - "path": "en/api/cli/beta/environments/archive.md", - "sha256": "dc854608f908ccf61fd1d78f831e26d36a2ecfcc48eaf3226db2593fdf05336a", - "size": 4749 + "path": "en/api/python/completions/create.md", + "sha256": "1c11acbf4a7c36e7c01e5c119417d5383e5e742e7d923c6d2870f4c4778a8edb", + "size": 13301 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/list", "status": "success", - "path": "en/api/cli/beta/deployment_runs/list.md", - "sha256": "e35f7e144d34d3927cf7a88c00f39edc0675a1e72894f8b16d1072bca1f64dc2", - "size": 9084 + "path": "en/api/python/beta/vaults/list.md", + "sha256": "4fff80f261ad12a851f14c4222c0e28ae900e39b1ad3fa7f59c50fe36d8247d3", + "size": 4471 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/archive", "status": "success", - "path": "en/api/cli/beta/deployment_runs/retrieve.md", - "sha256": "f1e3ad3e09096f9ae7cfd45ef65b520ba795c508d9f3948554fcaef45a5951f1", - "size": 7427 + "path": "en/api/python/beta/vaults/archive.md", + "sha256": "aa0dceca76baa404244dcaeb25bd318d245f9da30076250bfb7b855eaca66fdb", + "size": 4026 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/update", "status": "success", - "path": "en/api/cli/beta/vaults/create.md", - "sha256": "9d669784ab68caa3c042263d4c12e2428c29d851f3a9c14e53eb3b01d2bbb3ab", - "size": 2035 + "path": "en/api/python/beta/vaults/update.md", + "sha256": "335504fb6bf4ac5ccb07f9f5fb99691b936d8b75aaebd5cf0f49ff8b3e5f3f2b", + "size": 4298 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/retrieve", "status": "success", - "path": "en/api/cli/beta/vaults/update.md", - "sha256": "b51a2e2e12115267e93c7ddf9b7e2db9bc72e95eef927336b16555eb98cf1bc2", - "size": 2147 + "path": "en/api/python/beta/vaults/retrieve.md", + "sha256": "653d5b4fd564be0d871ad2962537967fc38a795ab8cb4b6d87c09c155a84055f", + "size": 4024 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/delete", "status": "success", - "path": "en/api/cli/beta/vaults/list.md", - "sha256": "0be2556a61a43a93ef065c075bf526d08b160059da0b1eb53b05618338b587d9", - "size": 2574 + "path": "en/api/python/beta/vaults/delete.md", + "sha256": "78e6599894bd1b7c6213896c87155a2de75e9fa813ac9af5fead4ec8c3c5972c", + "size": 3396 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/create", "status": "success", - "path": "en/api/cli/beta/vaults/retrieve.md", - "sha256": "14f0f8cefee33115f1793220a5d4e41c65ac405bcf79088c83a8f1e09046c5c9", - "size": 1881 + "path": "en/api/python/beta/vaults/create.md", + "sha256": "ff98d8a6ec6818fae5719eb290c96eda2d5621c1b90aa5e2d748d6ca3d322518", + "size": 4168 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials", "status": "success", - "path": "en/api/cli/beta/vaults/credentials.md", - "sha256": "adedc0cd0a43d0a31371010c38be3eebbeb10af49cec75bfea466d6720be3829", - "size": 73076 + "path": "en/api/python/beta/vaults/credentials.md", + "sha256": "099fa687c5e5eccec26550c5e3245ef07272a9bf282b39c6f40c3b9177792464", + "size": 93270 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/count_tokens", "status": "success", - "path": "en/api/cli/beta/vaults/delete.md", - "sha256": "208f0936d9b6533111a5b4b7c61556052e95f933a1b27a3eb0cbaf24a8918117", - "size": 1247 + "path": "en/api/python/beta/messages/count_tokens.md", + "sha256": "cc1326b33b6ebe7a1cad3de0f2aeae6015fa9961f17729c30f509d157f01bc6e", + "size": 144624 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches", "status": "success", - "path": "en/api/cli/beta/vaults/archive.md", - "sha256": "6d96648e442d3d47a74dac68f6fd9d485c5adcedae9e939733cabac58e4ed5f5", - "size": 1883 + "path": "en/api/python/beta/messages/batches.md", + "sha256": "3f9749637e6a8a024125e3aea420f46da52135f9e2c38f1e0cce9ea604f019bc", + "size": 800510 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/create", "status": "success", - "path": "en/api/cli/beta/user_profiles/create.md", - "sha256": "cc8575fe4ac8d4d3ffb56e2db7549207fd2055fa8d11563a5c6eaa4caa2f9d84", - "size": 8528 + "path": "en/api/python/beta/messages/create.md", + "sha256": "df00729fa4643b151fec7c231b0565f5feec183810bae67f60c37a387f94fae5", + "size": 306678 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs/list", "status": "success", - "path": "en/api/cli/beta/user_profiles/update.md", - "sha256": "7e719f19885911a838b65e7152200bd2cda1db3462d65835e9eaf371f2359c8c", - "size": 8381 + "path": "en/api/python/beta/deployment_runs/list.md", + "sha256": "77a02979b31b1b8ec560d4c3aa7dbb177fa18ca0335b236eb95a3bfc59fa973d", + "size": 10896 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/cli/beta/user_profiles/list.md", - "sha256": "8ef86b1767283b189d4cff9aadd9a0922e22cecf5037b804f4eabe1dce9d69e8", - "size": 7306 + "path": "en/api/python/beta/deployment_runs/retrieve.md", + "sha256": "985d87cbcef7c7b116db7a25c9cffbeb91ba3a058965db2fb3855d518bde6980", + "size": 9406 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/list", "status": "success", - "path": "en/api/cli/beta/user_profiles/create_enrollment_url.md", - "sha256": "6fc093254afcb5945e4d2015f3aacb3e774f3a3eedbb62b53a7ac906a9df4072", - "size": 1712 + "path": "en/api/python/beta/agents/list.md", + "sha256": "8273e9e35e01f72339337fc741df4831b191e9efc27d1fb36dba2d8ac0b967e4", + "size": 30276 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/archive", "status": "success", - "path": "en/api/cli/beta/user_profiles/retrieve.md", - "sha256": "f7dc08106a62e813a9158985b68752f4612cb5e06025186c6fd80cc6a21f2e44", - "size": 6642 + "path": "en/api/python/beta/agents/archive.md", + "sha256": "4d2322d001af1b6e322474cc35179009df40c8f2b3cc6388ecd5030581bd6c5b", + "size": 29392 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/update", "status": "success", - "path": "en/api/cli/beta/agents/create.md", - "sha256": "a4f01df4f5b91110c478599229baa06d569b21f0cebe2ee9fec9058e76512d26", - "size": 31851 + "path": "en/api/python/beta/agents/update.md", + "sha256": "3a2de7fd9358595ef1dd438dd1093c5cd71efbb59a1e8aa60fc3a193470596a4", + "size": 65003 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/retrieve", "status": "success", - "path": "en/api/cli/beta/agents/update.md", - "sha256": "166db44731787c55856ed762a1ebb558df524357cbe00a57a7e30f294f3d7b15", - "size": 32771 + "path": "en/api/python/beta/agents/retrieve.md", + "sha256": "4de4a4dbf2a094edafa8f0f361ec1765e0b28dcf3e4b7b995dfc28f3f5d939e8", + "size": 29523 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/versions", "status": "success", - "path": "en/api/cli/beta/agents/list.md", - "sha256": "9227f5e87355d0d65cd82c1ef03e973b448c11665f9ed2fd80cb3f7807c1e988", - "size": 31932 + "path": "en/api/python/beta/agents/versions.md", + "sha256": "719f33374c7921f9b18c3358aa6fbd3b83334968c3195be3006d12a9c9000b82", + "size": 30034 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/create", "status": "success", - "path": "en/api/cli/beta/agents/retrieve.md", - "sha256": "11ae529c871903cdf4bba847523d439dff51c7e41a52150eccdfae4cf7bce492", - "size": 30209 + "path": "en/api/python/beta/agents/create.md", + "sha256": "4ae747781600f7cd93215c868e24a8ffead47a2f5852b353b5089936f7008c21", + "size": 64042 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/list", "status": "success", - "path": "en/api/cli/beta/agents/versions.md", - "sha256": "b14109c12599447bd351687540fdf47e339ea5b92cedaf4ea92882787961dc5d", - "size": 31720 + "path": "en/api/python/beta/environments/list.md", + "sha256": "68e068efa7dff9dd88bdc3d6e80dc290fa1cf4f0ed4558a665d44b1f20d7e8d6", + "size": 7319 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/archive", "status": "success", - "path": "en/api/cli/beta/agents/archive.md", - "sha256": "10afc3f0cc9480018d92070e7148703e47396466233f50097e2352c395eaf716", - "size": 30074 + "path": "en/api/python/beta/environments/archive.md", + "sha256": "63a0496d757377e4965470bdea9b18447b3eaf6a33894a9c8e513ac00a875351", + "size": 6849 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work", "status": "success", - "path": "en/api/cli/beta/models/list.md", - "sha256": "7d91a3252c7a8a1c29baaa97ad6daa1243eab8b462f838adca4cc5d83c213d31", - "size": 13619 + "path": "en/api/python/beta/environments/work.md", + "sha256": "e0c9448a6506bf88190376184e9d204fece7ff774728087a8be064af3cffacee", + "size": 47793 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/update", "status": "success", - "path": "en/api/cli/beta/models/retrieve.md", - "sha256": "bc9eea3423dcbf1b40f937dbf24b217ab1f607450627ca05a6cbfa04722789a3", - "size": 11690 + "path": "en/api/python/beta/environments/update.md", + "sha256": "1e4f1f924f741e3dce762f4b1c24408f7f1adbd8b498e4beb45592f30e39b286", + "size": 9833 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/retrieve", "status": "success", - "path": "en/api/cli/beta/tunnels/create.md", - "sha256": "01f6dfe64346985be69fd4256a41b7f96d73a725a6f3fafd1bfea94419ebd054", - "size": 2347 + "path": "en/api/python/beta/environments/retrieve.md", + "sha256": "c498da560ffb90abe004348390d86145efd5abe4e9f4b223d6c6e924c4c2c795", + "size": 6783 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/delete", "status": "success", - "path": "en/api/cli/beta/tunnels/rotate_token.md", - "sha256": "ea6d83a6a8b2da96bd5dcf28188b03031cc324e2aeb3fc3fa3544e8d65c7b25e", - "size": 1974 + "path": "en/api/python/beta/environments/delete.md", + "sha256": "e831cb9f51c07392dd76d521a07ea7aeb5e0b0697d21a75cf02c6ce2fc37ecc3", + "size": 3488 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/create", "status": "success", - "path": "en/api/cli/beta/tunnels/list.md", - "sha256": "fe913f5afefa321503b0845f269369aab8c36934d8c22d3668c9456d5de706b8", - "size": 2859 + "path": "en/api/python/beta/environments/create.md", + "sha256": "f7a93f0ea595807a9b1fa5f99054e2b0595c6fb7121326af17f222695dab6781", + "size": 9714 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/python/beta/models/list", "status": "success", - "path": "en/api/cli/beta/tunnels/certificates.md", - "sha256": "b4db2d59e24427c3b16bdc9dabafd9f99a5a2f64074e8a6f82ca83b755c4bb00", - "size": 11839 + "path": "en/api/python/beta/models/list.md", + "sha256": "527876a448a5538508aadd2b0b581cbfc11585d05840b58ebab557b168ab2ce3", + "size": 13790 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/models/retrieve", "status": "success", - "path": "en/api/cli/beta/tunnels/retrieve.md", - "sha256": "d194fbc7748729d25da77e1c4288fdad7204cddc511a2ca3d64421aa2f6d788a", - "size": 2165 + "path": "en/api/python/beta/models/retrieve.md", + "sha256": "bcd91857f1e20b131886ad2ca64ed08bea2fd672223f3f4493fdfb294b969cfc", + "size": 12459 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/list", "status": "success", - "path": "en/api/cli/beta/tunnels/reveal_token.md", - "sha256": "c903dd32902376e823a63e43b47ad1a17d909d0559321f8cdbf97f62aac05ae2", - "size": 1877 + "path": "en/api/python/beta/user_profiles/list.md", + "sha256": "b43319d4256deeb540cfff8f1c68c05634697bed7099194b6e174acac7fe066f", + "size": 9988 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/update", "status": "success", - "path": "en/api/cli/beta/tunnels/archive.md", - "sha256": "be860956fbb3e0ef6a94bd26ce35314029fa420ba934caf98e1ccbf8391ca2ec", - "size": 2448 + "path": "en/api/python/beta/user_profiles/update.md", + "sha256": "f18f4d26230345205b9e30953100ebe80f066d01c6cd00826c400737895e05c1", + "size": 13093 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/cli/beta/sessions/create.md", - "sha256": "c1cefe83ec9868f8e2076fa5665e8a8c6fd4553685506217c5e523ae7ddae88c", - "size": 49573 + "path": "en/api/python/beta/user_profiles/retrieve.md", + "sha256": "d44df59bb43f30fdada09c5d346f11b49e842e2e54b236101c352e10667e3ca5", + "size": 8885 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/cli/beta/sessions/resources.md", - "sha256": "36d0935a07126ce2babf00c41914debb8b775b78ed9df4fa542b81843b0e9c7a", - "size": 21136 + "path": "en/api/python/beta/user_profiles/create_enrollment_url.md", + "sha256": "24de651c50157a11abfacaacb02b60e85596ba0a1c0686e5d4472177401789fa", + "size": 3875 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/create", "status": "success", - "path": "en/api/cli/beta/sessions/update.md", - "sha256": "2d27d017a2ca1f882d7ad702698d5f214bbd9961c44519e63f9f829e2b541633", - "size": 49270 + "path": "en/api/python/beta/user_profiles/create.md", + "sha256": "16ecf331c9b737804ef42494c5518deaacc6a3b5e705c83bf6ad2fd2eec6f0a7", + "size": 13226 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/list", "status": "success", - "path": "en/api/cli/beta/sessions/list.md", - "sha256": "4b6f59e997cfd210c2e44bd29c1f10bdcbd6753b01e5355506d0da919b1c0186", - "size": 52052 + "path": "en/api/python/beta/skills/list.md", + "sha256": "74ddd3a2256dff233226418ca6f19468ddac6464de668929acc8d49077eec9bf", + "size": 5562 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/retrieve", "status": "success", - "path": "en/api/cli/beta/sessions/threads.md", - "sha256": "8bd4e8ce912f962282b6ae30a8a715d75b6692d5100a16142bdbc44906bf2403", - "size": 482366 + "path": "en/api/python/beta/skills/retrieve.md", + "sha256": "333dcb8ebf5e42af68d53729002b0a50f9aab656f21db0b793aba9d616f1bad6", + "size": 5000 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/delete", "status": "success", - "path": "en/api/cli/beta/sessions/retrieve.md", - "sha256": "b9606e28743233437bc6e3a44d38dd2d856c021b0fe34b7327f9b923f652c64f", - "size": 48004 + "path": "en/api/python/beta/skills/delete.md", + "sha256": "0ed77d0adcaec2ed1deee0259a2f7a503c15b02e71209509150243e8f6d79f15", + "size": 3448 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions", "status": "success", - "path": "en/api/cli/beta/sessions/events.md", - "sha256": "cb3fa2222c401dd1efc4cee63b483f9d17892e8aab9b85d65287fd9b73773e81", - "size": 604489 + "path": "en/api/python/beta/skills/versions.md", + "sha256": "930dae1c60fbff261f799dc7f2a7983b92a0a2de936245af253900e726f73022", + "size": 22102 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/create", "status": "success", - "path": "en/api/cli/beta/sessions/delete.md", - "sha256": "2f3dccf59fa198b5db837444bebd0f3ffb2edbe7b26a7b7eb531c8fb7600346f", - "size": 1198 + "path": "en/api/python/beta/skills/create.md", + "sha256": "0422c74c6773b2f430126555c482db2a75e3ad94d467a4d1658a2c766f14fbd8", + "size": 5252 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/list", "status": "success", - "path": "en/api/cli/beta/sessions/archive.md", - "sha256": "fc1a60bb1b45e5364ab2b4933eacf288a391b09c5b1c1c2ea1b2657cf3e497d1", - "size": 48022 + "path": "en/api/python/beta/tunnels/list.md", + "sha256": "262dcd48a7211ed5eb171008431569ec5186751d27d7022f880dcd34d7e9feef", + "size": 4733 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/archive", "status": "success", - "path": "en/api/cli/beta/deployments/unpause.md", - "sha256": "5406d1bb89ff06946d5e35638188eb624e95281a9d681f7e665b3cc89cf2ded4", - "size": 17708 + "path": "en/api/python/beta/tunnels/archive.md", + "sha256": "d0fb6c1c8b1f31b0774872751ad02b1987f005b51ec6b24a62cd0392448560a1", + "size": 4556 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates", "status": "success", - "path": "en/api/cli/beta/deployments/create.md", - "sha256": "e156e016d6e4d0d97125c74352df45a2035ae8f055c98afefb4762c13ccc6135", - "size": 19561 + "path": "en/api/python/beta/tunnels/certificates.md", + "sha256": "efaee6b5fd9fd960ab57355f09c39a5093cd8047159e3bba744d87c333bb2343", + "size": 20181 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/retrieve", "status": "success", - "path": "en/api/cli/beta/deployments/update.md", - "sha256": "c49efb319189fce69f7a9e4536d82a2a49218bb0114d91d09a1361035ebd5b22", - "size": 19655 + "path": "en/api/python/beta/tunnels/retrieve.md", + "sha256": "d09a32db37c02bd529465f5c665d598f835fb62b88c5fba6b36644d7dcb03a23", + "size": 4273 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/cli/beta/deployments/list.md", - "sha256": "9c643a7f3ae2c0c978e94575f5d924e079a85af888e26ba01ecca5cfd331d959", - "size": 19288 + "path": "en/api/python/beta/tunnels/rotate_token.md", + "sha256": "1236f5f3ca0a6af6c0e6b581d42aec066a571136c2506c36d3245d7cc0f60db9", + "size": 4073 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/cli/beta/deployments/retrieve.md", - "sha256": "147d6306aa5319eac52ba9268ad44be63902a5840ed531c0e49d1ade46be4b75", - "size": 17679 + "path": "en/api/python/beta/tunnels/reveal_token.md", + "sha256": "14b9067891642b48853351751c4f08f190f34b1d8f0127f81803653f1ff906ef", + "size": 3980 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/create", "status": "success", - "path": "en/api/cli/beta/deployments/run.md", - "sha256": "d13e2244b05d452e2e1fde249d0edbcd1e6bb1cea1ea0852e4583c87bc178004", - "size": 7404 + "path": "en/api/python/beta/tunnels/create.md", + "sha256": "f444a943d3bb99bbbc1ae5753bb95beb0eb3d9c31fcec4862c142c3d887f047d", + "size": 4443 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/python/beta/files/list", "status": "success", - "path": "en/api/cli/beta/deployments/pause.md", - "sha256": "fd9a3e6f6ce6ac5e3bff1565068550b23127d2ecc10f16e3ca973f759d3cd47e", - "size": 17692 + "path": "en/api/python/beta/files/list.md", + "sha256": "8fd9c781948e5476ea541594d540989e0e0b2b1f7292bedb955cef4db9660c47", + "size": 5437 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/cli/beta/deployments/archive.md", - "sha256": "52c57ab49a246895892bfaf26a60c211d7152ffb5580d51e8e7995e0fe4419db", - "size": 17708 + "path": "en/api/python/beta/files/retrieve_metadata.md", + "sha256": "fe703ba4bdbf45b7a18a019c19be7a7d738c6f6f6eeebb7a9bc48017b66806a2", + "size": 4655 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/files/upload", "status": "success", - "path": "en/api/cli/beta/skills/create.md", - "sha256": "1df4080a26aeeda47e17c34089d45de2044f07ce64d7326c0ff4041276de5082", - "size": 3140 + "path": "en/api/python/beta/files/upload.md", + "sha256": "7934a365f3e0250785722faaf2dbcf524115f16d8f27f4002549e5ed8de70404", + "size": 5009 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/files/delete", "status": "success", - "path": "en/api/cli/beta/skills/list.md", - "sha256": "e03cc2600c9597105c27ee60cd08788047ceb336d58b4ebb308cf4250567a8cc", - "size": 3775 + "path": "en/api/python/beta/files/delete.md", + "sha256": "0d5c56cfe6aefa6301bfb23d12757984ed748edb451595608569c6bf1e9868c0", + "size": 3306 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/files/download", "status": "success", - "path": "en/api/cli/beta/skills/retrieve.md", - "sha256": "c71bcc1cda4bf2b6db05c6a7d618457eba83eb660b7df1a2ba58bb9457248276", - "size": 2884 + "path": "en/api/python/beta/files/download.md", + "sha256": "5a4fae71833b50e825520d824d6c9035210bcdbdefdd25a9a7ff26152ad5e81c", + "size": 3045 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/unpause", "status": "success", - "path": "en/api/cli/beta/skills/versions.md", - "sha256": "816beec131ea84fe66bb2198c0044416b10a7a950e815ea9a38c6cc28fae86c5", - "size": 11695 + "path": "en/api/python/beta/deployments/unpause.md", + "sha256": "0cd158625325a04d20152dcdd9856e3085528570a40e2fe5ebce6156579eb979", + "size": 19280 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/list", "status": "success", - "path": "en/api/cli/beta/skills/delete.md", - "sha256": "38343440f497c7a9016d79c91da531a65d87a47379095da8b43997c6adf6843a", - "size": 1312 + "path": "en/api/python/beta/deployments/list.md", + "sha256": "2163340dd0c1a936a1f95a55e2c8d6841744a413b06da922a66260123585bf1b", + "size": 20588 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/archive", "status": "success", - "path": "en/api/cli/beta/memory_stores/memory_versions.md", - "sha256": "7c65321d6ed061ae04b31abd4ac3119e02f88689e58bc28fb51ed09597824dc5", - "size": 36811 + "path": "en/api/python/beta/deployments/archive.md", + "sha256": "900a5711839432e911f1c17e0d88a33b66de5a1876754040cd4acdf4a09a9389", + "size": 19280 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/update", "status": "success", - "path": "en/api/cli/beta/memory_stores/create.md", - "sha256": "a0611244a787f7323e303fa91b9dcf1e983085868c09639f22acb47bced313ae", - "size": 4218 + "path": "en/api/python/beta/deployments/update.md", + "sha256": "1cfbfaec347f57f1b476196e6fecad8ee745173af10dc380674217990de43383", + "size": 30119 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/retrieve", "status": "success", - "path": "en/api/cli/beta/memory_stores/update.md", - "sha256": "467eaa86b6598fd4022d424810e1617304d2030ef79f32764c60816e49d1fca0", - "size": 4051 + "path": "en/api/python/beta/deployments/retrieve.md", + "sha256": "046d6e0f03fb62e6a388a06d337240bfdcc1979ffa9d1662a68b2682b076445f", + "size": 19251 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/run", "status": "success", - "path": "en/api/cli/beta/memory_stores/list.md", - "sha256": "e656259f70b49f5f3f81974478e22246f9b74e461e6f592246851af24be59e5c", - "size": 4237 + "path": "en/api/python/beta/deployments/run.md", + "sha256": "71f75859e91a4c9ee7f0bcdbc808b21959b11c43702d88dba26d9e3bb9c19193", + "size": 9379 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/pause", "status": "success", - "path": "en/api/cli/beta/memory_stores/retrieve.md", - "sha256": "2175cc3cb198b6f0b22ef2c617c999cdb7af9f78c2059be804113ee17c867d9e", - "size": 3257 + "path": "en/api/python/beta/deployments/pause.md", + "sha256": "a140fb561b4ea8a53d3e59cbaa95f6c65699b7ceca9b9abe97c4f759793f93ee", + "size": 19264 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/create", "status": "success", - "path": "en/api/cli/beta/memory_stores/delete.md", - "sha256": "a5a814ffaf88115b5e45b71d0b5ac25517364e367fb75bb45f5fa4afdae31581", - "size": 1532 + "path": "en/api/python/beta/deployments/create.md", + "sha256": "93102fd6f2aa5bd148a2daf09f8e67cd3f711cb224ec19bee9a5c502d1cb3516", + "size": 30147 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories.md", - "sha256": "98e894eefcf7a30b00ec774424d1ca0cfdbbde49e82d3ae71d18ae43073a01ef", - "size": 37453 + "path": "en/api/python/beta/sessions/events.md", + "sha256": "446ea33db867abcbe0277b8fd24278485d4c0ef0ffde6b6ce463fed6c029c0e7", + "size": 560438 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/list", "status": "success", - "path": "en/api/cli/beta/memory_stores/archive.md", - "sha256": "916665c4bda0102c58a3031166ce5d43f9d46dc1623c33b15dd2db04e78daa19", - "size": 3354 + "path": "en/api/python/beta/sessions/list.md", + "sha256": "fc482b18395be32aca4a69f94c271b7c54767ad980ceda90ebd0315586d8ae4f", + "size": 47832 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/archive", "status": "success", - "path": "en/api/cli/beta/files/download.md", - "sha256": "2d5351fb363576db620395a6102d124f4b123e3739ccacda231ad7ef1013b8a9", - "size": 923 + "path": "en/api/python/beta/sessions/archive.md", + "sha256": "ddca502859724a1e5c95cc25e727e95914e61f825fef44ab8f1b64bdf73e9e00", + "size": 44954 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/update", "status": "success", - "path": "en/api/cli/beta/files/list.md", - "sha256": "b132bace0aec284fb5c90947a0e666f6b3fdba320cc7b1da949569af48758db8", - "size": 3588 + "path": "en/api/python/beta/sessions/update.md", + "sha256": "a1f7ec36fc1e7eb6eb5a979b63cb0fc50464b51b7f7ba28aee9e08a7266cc388", + "size": 68558 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/retrieve", "status": "success", - "path": "en/api/cli/beta/files/upload.md", - "sha256": "950c65abebd6cb45b1d0d0303d99f0f8a3b85060b004db8c514fe8ca1b53a699", - "size": 2882 + "path": "en/api/python/beta/sessions/retrieve.md", + "sha256": "289d219f67c41055fc61c8cd36e3321ff3554a360585031e862bbf8cde7ef1e7", + "size": 44936 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources", "status": "success", - "path": "en/api/cli/beta/files/retrieve_metadata.md", - "sha256": "5f6eb08253f83f080128d0db41eb54e6f4cb0ff1fb6794dd1db28895d6e10ac7", - "size": 2520 + "path": "en/api/python/beta/sessions/resources.md", + "sha256": "e7b6ebf3c4dd1a16a0da03bdb7f854ae9ad29874f57d853216d35a46b48f86bd", + "size": 35597 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/delete", "status": "success", - "path": "en/api/cli/beta/files/delete.md", - "sha256": "fb3e11e605807ceef4c2176f4ac603b2723794821566314151d37ed455f83096", - "size": 1174 + "path": "en/api/python/beta/sessions/delete.md", + "sha256": "4c1daff18cdb7003e64adda3333c597347fa3e5ac6284d6430667209ec19fbe2", + "size": 3355 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads", "status": "success", - "path": "en/api/cli/beta/messages/create.md", - "sha256": "de8340aeaa162bf7975ff0a591282ef7237a623922e082c7466bf7ec8602b8aa", - "size": 217629 + "path": "en/api/python/beta/sessions/threads.md", + "sha256": "3c5e21f0556975e9d9c25836e69accbbd6ee8f4cffae0f1900165fca9e1448c2", + "size": 436253 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/create", "status": "success", - "path": "en/api/cli/beta/messages/count_tokens.md", - "sha256": "ba80cd1345eac7bf437ce0192c68ced12eea4022f95b42c2cacbb3c44dd9951e", - "size": 10532 + "path": "en/api/python/beta/sessions/create.md", + "sha256": "ae7c108d42a91ee2613ee237e0a1f0d6e3b793e29b97275b4d38dd89b10da899", + "size": 82736 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/list", "status": "success", - "path": "en/api/cli/beta/messages/batches.md", - "sha256": "5c7d64de17c3d0a83c8fbdf6f7d9add1470b1d5e62a8d96bcab58bc9bd1a48b7", - "size": 744593 + "path": "en/api/python/beta/memory_stores/list.md", + "sha256": "0b65b78739feafe9cbf3b648326bdfa16e0a91bc97581b9a4657aad6cb2196a7", + "size": 6141 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/cli/beta/messages/batches/create.md", - "sha256": "bce74f592896e0faea29eee7e4929f40d90d8aadf203b747d7cc1352ac286d20", - "size": 5325 + "path": "en/api/python/beta/memory_stores/memory_versions.md", + "sha256": "1641511d5dabfc93e57200159b56898dfbe0eecea4e8212daf2f80268e2afc92", + "size": 40965 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/archive", "status": "success", - "path": "en/api/cli/beta/messages/batches/list.md", - "sha256": "4229a6a7add01d69478ba1202c766ac611ad9a87a2ccfbfe35d59096dbd6b473", - "size": 5672 + "path": "en/api/python/beta/memory_stores/archive.md", + "sha256": "c671066a19a9d3893e3a8fd0f7500c7e4156875c203464c7a1ff582d77dfa1af", + "size": 5523 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/update", "status": "success", - "path": "en/api/cli/beta/messages/batches/cancel.md", - "sha256": "12fb7f02e5a0f127e7f90b3abc28ea67012c5d7f9a16a43922bdadb6967d5451", - "size": 5075 + "path": "en/api/python/beta/memory_stores/update.md", + "sha256": "887b4c728532ee3ea68e5a72df6eb806f61e7eda5ae90a69d43bb0a6c1e23e51", + "size": 6224 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/cli/beta/messages/batches/retrieve.md", - "sha256": "23f2641f9b081ffc1cf12eda4f7d90e3ba036cde8eebb31b06238aa4d3e72655", - "size": 4767 + "path": "en/api/python/beta/memory_stores/retrieve.md", + "sha256": "f8b39748d629bed30ad6bf2c74a7b0d012707ccea068323dd2c6a826a148f044", + "size": 5426 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/delete", "status": "success", - "path": "en/api/cli/beta/messages/batches/results.md", - "sha256": "e34b13d0eb393a0bfa041b27e703dc288ef440265418b346aeb985a1e2eb82bd", - "size": 184650 + "path": "en/api/python/beta/memory_stores/delete.md", + "sha256": "4a2d2216f27b3a22fa3a7c06939f9e012ce897acb9e95a66d681b196cbb86c2d", + "size": 3707 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/create", "status": "success", - "path": "en/api/cli/beta/messages/batches/delete.md", - "sha256": "62c08e9a0b1822a76eb28a40516183cf3296366cc4e5c9484fd8051896fc13d5", - "size": 1626 + "path": "en/api/python/beta/memory_stores/create.md", + "sha256": "5f3e873c9c21aa8b9e9c0c6d95b02b7fad6c96b3016fad70aa2b09882c2ba5c6", + "size": 6371 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories/create.md", - "sha256": "7a109117ef62c5de8981fe1f75ac95dbd1f41a1e94f0763e1f18da55c9bdcb60", - "size": 4750 + "path": "en/api/python/beta/memory_stores/memories.md", + "sha256": "71861024c9f876debce181bf7a3ea48b3594cfe485c0d21458f9a0fa76345d2f", + "size": 49826 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories/update.md", - "sha256": "5e8760f3765dfcf5e3e62104bf9b5363616219f00dff33c0196e22cd7304f155", - "size": 5124 + "path": "en/api/python/beta/memory_stores/memory_versions/redact.md", + "sha256": "9d825d1af5f99c87c5e9f4b3985f200e217aac333c28bbe04f643ccb0ffa17ec", + "size": 9505 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories/list.md", - "sha256": "a3b2981a06202c3494d0d023eca2af14e8d7aefcf4fa3951ce6149deb6931b17", - "size": 6664 + "path": "en/api/python/beta/memory_stores/memory_versions/list.md", + "sha256": "97e0670b4247bda068a04a2cddba0d4f489e8f68e3dd63aed43cb10e2665f162", + "size": 12125 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories/retrieve.md", - "sha256": "ed6ca8be8d73569adf3b12911d237ebb14f27385733af8b33db8b6498e796b4e", - "size": 4264 + "path": "en/api/python/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "9618ec243ee17322254f6ef6cc3b17b172c75d7754193a2731d4f9c17c89aeee", + "size": 10127 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/cli/beta/memory_stores/memories/delete.md", - "sha256": "8ef0f833b031853a39d30cc76d1690daba5eeed662938eba594a3e87ce247329", - "size": 2403 + "path": "en/api/python/beta/memory_stores/memories/list.md", + "sha256": "9dd032e5fc661f4b8abc42695b157fcc26e4b65894aeb25cf234beb4687943ba", + "size": 8711 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/cli/beta/memory_stores/memory_versions/list.md", - "sha256": "3f6c164ff9c787579a8ab88a347b98f4cde1dc1e262b53acda660c1f657a33ba", - "size": 9924 + "path": "en/api/python/beta/memory_stores/memories/update.md", + "sha256": "9c451b13f1bbfcb5e63c44a42433a59d955dc98c65ae426e55c7e09ced5b28db", + "size": 7947 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/cli/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "1f35beb6a40279aa1c23052d778c5a364d87c5ade79f18e248f02b2e4c23ab27", - "size": 8509 + "path": "en/api/python/beta/memory_stores/memories/retrieve.md", + "sha256": "546c436063d0245e291bac57a28f5a97e0fe08dc8a14a99a4f3d9a7958e258eb", + "size": 6697 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/cli/beta/memory_stores/memory_versions/redact.md", - "sha256": "853de71dfac51c3082357b15d18a7ba8f56c0f3abb0ec1da4dc3fcf1fecc619c", - "size": 8200 + "path": "en/api/python/beta/memory_stores/memories/delete.md", + "sha256": "6ff57c14e18f65e2faf72a4533953d57d751003b152528a0767c25c2cc6a83c4", + "size": 4557 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/cli/beta/skills/versions/create.md", - "sha256": "a817820864a052a85a52dcf90d321e74fef95d807516a175dbdc5b162a243e04", - "size": 2396 + "path": "en/api/python/beta/memory_stores/memories/create.md", + "sha256": "284b2497dcf247ab519582e064adc8ca4eb0183ea8e5b52b58ac4cfc42de6a72", + "size": 7195 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/list", "status": "success", - "path": "en/api/cli/beta/skills/versions/download.md", - "sha256": "31e27f79e9d2afb50d4e7d62066aca25609ad63ee5db2e6d2aa74a85c748ac91", - "size": 1374 + "path": "en/api/python/beta/sessions/resources/list.md", + "sha256": "b317470cf4acb499b75d7d34493e66390cec2574d4b6f80e79473703a4f46520", + "size": 6494 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/update", "status": "success", - "path": "en/api/cli/beta/skills/versions/list.md", - "sha256": "18c3f54776b541cd4611ce1adcd4f788a6332a988b72582195bba4e84bfcba61", - "size": 2865 + "path": "en/api/python/beta/sessions/resources/update.md", + "sha256": "20851458e7a0e3947d48c53e64008a52d14d788596af116b97a46b4483b1accb", + "size": 6168 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/cli/beta/skills/versions/retrieve.md", - "sha256": "03f707ccaf033507dc314928cf0d79580b8cd9e081ad02f82edc7bd2723e3b76", - "size": 2506 + "path": "en/api/python/beta/sessions/resources/retrieve.md", + "sha256": "d5cf365cd9b68c262d16225f7a34475c5e1491f2f32155f47b8cfbaa359dfac0", + "size": 5949 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/delete", "status": "success", - "path": "en/api/cli/beta/skills/versions/delete.md", - "sha256": "01c99eb3d1d6af29a06749927f3e9089c899d9d700c3366f8247472bafa3bc15", - "size": 1667 + "path": "en/api/python/beta/sessions/resources/delete.md", + "sha256": "97dc406f370f11861502fd6a309a620f1e3457b3963a7430dc48d2792c872678", + "size": 3552 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/add", "status": "success", - "path": "en/api/cli/beta/sessions/threads/list.md", - "sha256": "0b36f7d3b02fae854555bec19a1902a9a71e61d504e9f5351ab4f62aae824124", - "size": 35944 + "path": "en/api/python/beta/sessions/resources/add.md", + "sha256": "a5a0e866121da372f8ee5fcdc347f1badb4be5af5a3b76ed60777eb98e6198c5", + "size": 4012 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events", "status": "success", - "path": "en/api/cli/beta/sessions/threads/retrieve.md", - "sha256": "52a909e2bca74ee68b7ce3d59ad3ff88457baf852f4aade5d9b25602c37ed5b0", - "size": 34091 + "path": "en/api/python/beta/sessions/threads/events.md", + "sha256": "c0b86565256c5166770256f806848a300e8b7df13b75d8393c64d412cce83600", + "size": 193336 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/list", "status": "success", - "path": "en/api/cli/beta/sessions/threads/events.md", - "sha256": "fb0fb4885ec9042df002c6e8dbee73f04e10af9592917efb729991216ba28cdb", - "size": 215988 + "path": "en/api/python/beta/sessions/threads/list.md", + "sha256": "2ef82ce6a6992baa2bacc38e580fb657026ff6e94defb641a269ef5eeccc0905", + "size": 33383 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/archive", "status": "success", - "path": "en/api/cli/beta/sessions/threads/archive.md", - "sha256": "0b6fdf583c501b63b2dde3042233b91200ed76e8a689ef9375e470b97cbe2519", - "size": 34109 + "path": "en/api/python/beta/sessions/threads/archive.md", + "sha256": "534cdbccad5f92bbd030f1dbd05df72e61659b47a86c72d60f67f08e20b5459c", + "size": 32552 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/cli/beta/sessions/resources/update.md", - "sha256": "29686d6daeba5e81c3f0105a2522b38fc003bc0ebcb5a2f7e5ca82b5275cbe26", - "size": 4263 + "path": "en/api/python/beta/sessions/threads/retrieve.md", + "sha256": "60e8dfdce9023973e46a29d46505ba2ae270155adf37cec585e7f94e5b8a41e4", + "size": 32534 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/list", "status": "success", - "path": "en/api/cli/beta/sessions/resources/list.md", - "sha256": "db76dd22fed048008c84f0cb9d85ed563a39775fed72531657c39b14da559ed1", - "size": 4805 + "path": "en/api/python/beta/sessions/events/list.md", + "sha256": "7a1785d7d8c82c8f2192e2ef7025252104ddf0bc0a783cf1d94d52a67a3974bd", + "size": 97592 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/stream", "status": "success", - "path": "en/api/cli/beta/sessions/resources/retrieve.md", - "sha256": "d985e7b204668d1deb37ed2528516a530455bebd942cf75d7f15ecfbead76daa", - "size": 4033 + "path": "en/api/python/beta/sessions/events/stream.md", + "sha256": "e00c14a4326c4c017fc529dc22812f753ec76d395302e127e4c1ad600a93a831", + "size": 98126 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/send", "status": "success", - "path": "en/api/cli/beta/sessions/resources/add.md", - "sha256": "56b3df2890d874b9a72c336c62c05b409cd0a318e307550a8a17098a7e035a71", - "size": 1863 + "path": "en/api/python/beta/sessions/events/send.md", + "sha256": "510cff8a32eaf6272e4387e95dca2f365548d42b4105ab4cb5420cc74bc8927b", + "size": 25017 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/cli/beta/sessions/resources/delete.md", - "sha256": "3bde61a29b0739cfb1983faa82dc866569cb25d2432911a6782a03c3533adda7", - "size": 1376 + "path": "en/api/python/beta/sessions/threads/events/list.md", + "sha256": "75f972f8f2fa77b5297a9ec1cf3db0d5753d027c19bbbb1e9c0eeb56b9ac7b99", + "size": 95164 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/cli/beta/sessions/events/send.md", - "sha256": "08cf5a9452895c58efa9bb3c2b000e10cd9a2dbf962c8b279e500a7156077c0a", - "size": 13958 + "path": "en/api/python/beta/sessions/threads/events/stream.md", + "sha256": "0ef891533d1b13e6e840a6bbcd0cd9e2c62d168dcdc6622edec387c8a8dd2162", + "size": 98309 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/cli/beta/sessions/events/list.md", - "sha256": "29d00eaf02933693757ff9512201a93358a64856e6b61f84e390f3badd844e7c", - "size": 109063 + "path": "en/api/python/beta/tunnels/certificates/list.md", + "sha256": "317be5180d8b6098c8103b417abe0287f0ffa8a4fdd014487f33f29aef641861", + "size": 5102 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/cli/beta/sessions/events/stream.md", - "sha256": "9fee1c9170cd76261b7b15250d7f981f6f6539f565db262b30d0e1ccb08760f0", - "size": 107885 + "path": "en/api/python/beta/tunnels/certificates/archive.md", + "sha256": "becec1be399d270e0740e189431219c52613160ec9986408b9d1466420d10b39", + "size": 4923 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/cli/beta/sessions/threads/events/list.md", - "sha256": "242d056d1909ddf7679762d3616d3ed8ce7c84d266cae3c40835dbaba2481c64", - "size": 108054 + "path": "en/api/python/beta/tunnels/certificates/retrieve.md", + "sha256": "b151ebe72cff63b11978b1480964dcf3e90de48462cae5e8ea19de486457da6b", + "size": 4686 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/cli/beta/sessions/threads/events/stream.md", - "sha256": "0562c3ff3113ed747d027e6fa9456073d36e1e3233d36baf0ceb4b7e1fe18536", - "size": 108068 + "path": "en/api/python/beta/tunnels/certificates/create.md", + "sha256": "e436ab7dc5546260c1d62c1935f44d2a099e780d6aecd31c75ef1378e072317d", + "size": 4931 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/list", "status": "success", - "path": "en/api/cli/beta/tunnels/certificates/create.md", - "sha256": "a2f2fd8f4d8196b71cfd12715232b611e5fd4d7e2c66c28586b2c6f9cbaa5373", - "size": 2791 + "path": "en/api/python/beta/skills/versions/list.md", + "sha256": "ed68648bec840def10eded2f5ff2e8429d719f3fc84d6f9cda764c3b4394c43c", + "size": 4686 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/cli/beta/tunnels/certificates/list.md", - "sha256": "e3d394dd2f3c85afbca59b5be8aefc29137626f17e20bbd7e3598c8004ba5ab3", - "size": 3203 + "path": "en/api/python/beta/skills/versions/retrieve.md", + "sha256": "e31816a6c36d67760c53c7c6273b7503251d048bf5003cd7ce46d3e4462705a4", + "size": 4630 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/delete", "status": "success", - "path": "en/api/cli/beta/tunnels/certificates/retrieve.md", - "sha256": "0bd406317b91376c452c518b1df2ade60fc0c57e623e3a7aed1d4c15644a849b", - "size": 2541 + "path": "en/api/python/beta/skills/versions/delete.md", + "sha256": "d65ccd076fd3945871146b3c800e5fc39627367800b94ea7cbc25a24f777755b", + "size": 3828 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/download", "status": "success", - "path": "en/api/cli/beta/tunnels/certificates/archive.md", - "sha256": "743fbf139513366a9c41de11e197c5cbd3f53ad33859df85731e6d6db6d8e5fd", - "size": 2778 + "path": "en/api/python/beta/skills/versions/download.md", + "sha256": "4535586a9c9df9ca8d5e2d14a909c7df5a62fdbc8c6683b32b72fe582cc32e7e", + "size": 3492 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/create", "status": "success", - "path": "en/api/cli/beta/agents/versions/list.md", - "sha256": "a815bd807579c95506c28b273e53daf00ef5f2e9b9548ebef7f0542f5a906bce", - "size": 31719 + "path": "en/api/python/beta/skills/versions/create.md", + "sha256": "600d200925ad50053715e4b310a014eb853baac20a4d39fb90ea63ddc8831d05", + "size": 4531 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/list", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/create.md", - "sha256": "a7c01211c070a77801aae2a238f9e029cd140af75d277cf16e2175d31f2b631d", - "size": 6512 + "path": "en/api/python/beta/environments/work/list.md", + "sha256": "ba3e9a5ea49eeab85cd70579d0eb3e429c41e286eccb6ef492aab449d53695df", + "size": 5566 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/update.md", - "sha256": "7fe209bfe607a8a7385290e1c21d48fbde7af105106c818438e5cd51e0d18153", - "size": 6628 + "path": "en/api/python/beta/environments/work/heartbeat.md", + "sha256": "20ad3f4c9d7ab9b589bb4bad46a3cc3ce29f71cb8c691b6ed1c42662701b7ad9", + "size": 4428 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/update", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/list.md", - "sha256": "9bf2a9c947c667689ac9e4475c36a901d3ba537fa79cbf226748586e18300430", - "size": 6907 + "path": "en/api/python/beta/environments/work/update.md", + "sha256": "920d5a4c6f7d6f5cc3e4d23cbe81618d9767acf222d3f33f8d56007ff134bc42", + "size": 5856 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/retrieve", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "a389a392bcff0c25b74bb99f055fb3e63d6a4b7c60062cf6936634827efb45b6", - "size": 5034 + "path": "en/api/python/beta/environments/work/retrieve.md", + "sha256": "5d0602730407c21b735b78a0b5536bf2b92345ff1167642403eb3c5f7dd47353", + "size": 5667 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/poll", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/retrieve.md", - "sha256": "45f3ba1bee4c0b2d6bb274e427a9437485372e9a0d3787a875f34525c48c6c08", - "size": 6072 + "path": "en/api/python/beta/environments/work/poll.md", + "sha256": "44da95bdb5a15075bc4e81deee89c0f6aa114f3eaf853dae9dbc86ef4e454aa2", + "size": 5801 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/stop", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/delete.md", - "sha256": "3ad0fe8ade52e21bed65f7cf5416f852f3ea65a98fa8a638f5efe9f89893af4c", - "size": 1520 + "path": "en/api/python/beta/environments/work/stop.md", + "sha256": "401fb35f7341d8c5629919072406fed4fbbde87bc61535a1e1dbe89644ffcedf", + "size": 5758 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/ack", "status": "success", - "path": "en/api/cli/beta/vaults/credentials/archive.md", - "sha256": "2895f8704922e6aa634efed1a5f6ca01894444fa561367be4621c5fe660f0289", - "size": 6074 + "path": "en/api/python/beta/environments/work/ack.md", + "sha256": "1d0e700e6ebc4df4bcfcd3d8e9213ac731e2921dee0ba8e336b1e11a3ff707cc", + "size": 5353 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/stats", "status": "success", - "path": "en/api/cli/beta/environments/work/update.md", - "sha256": "ece6e7e6e0d577319ca5b113ed6202a94896de294df2afb1e059e82a283067c4", - "size": 3654 + "path": "en/api/python/beta/environments/work/stats.md", + "sha256": "ccf9244fbe17c90fbbc1e0a9ddef32e9a71f0c771867abec2199093fb67b26c2", + "size": 4101 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/python/beta/agents/versions/list", "status": "success", - "path": "en/api/cli/beta/environments/work/list.md", - "sha256": "3886a008af273e24b289047b4a524b675cec77849f09e0821a79e04a587d4246", - "size": 3394 + "path": "en/api/python/beta/agents/versions/list.md", + "sha256": "00c1f9cdd8d167000929150b0dbd8e5d7c2340a89a50f3d14d35932cf3954b90", + "size": 30033 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/cancel", "status": "success", - "path": "en/api/cli/beta/environments/work/stop.md", - "sha256": "51d3c0e4b8b00afe39e150d3a1f79f013a4ee2d16de070c284507d1caf76a3b3", - "size": 3554 + "path": "en/api/python/beta/messages/batches/cancel.md", + "sha256": "963e6f6d743b9099a268738a41c209080f8c1b3a4eb8dd52a3173cba6bab9fb8", + "size": 7372 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/list", "status": "success", - "path": "en/api/cli/beta/environments/work/retrieve.md", - "sha256": "7373d973da1b73c94aab8c5a01e2a138ad2b6497531db9beeff756e057a9fa55", - "size": 3477 + "path": "en/api/python/beta/messages/batches/list.md", + "sha256": "c07d7c727308625b018e484d94b66b539d73f52c45e031e9fb2979546781e2f6", + "size": 7496 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/cli/beta/environments/work/ack.md", - "sha256": "347d7f3248309a90c16eab13bb98dba36bbc6775a16138949e857d25642a34d7", - "size": 3159 + "path": "en/api/python/beta/messages/batches/retrieve.md", + "sha256": "536b3fbec0bdf47e298eef1de0c459b1a684bdfe1bbfb5799159d9dfc9e62b16", + "size": 7064 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/results", "status": "success", - "path": "en/api/cli/beta/environments/work/stats.md", - "sha256": "8a299d0e8e08334644ba66d4b12a32d742fe53f4689f7eef8b582858faec4553", - "size": 1887 + "path": "en/api/python/beta/messages/batches/results.md", + "sha256": "e3a713dc38d9a7151fadd3e8f87b25dfa770a2a9d25320f47b7b7ff3a74e51c9", + "size": 156695 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/delete", "status": "success", - "path": "en/api/cli/beta/environments/work/heartbeat.md", - "sha256": "e09c6c9b61eeac10a1353ce5089e945740b51acdbaa03d79bbe5a320fec761c2", - "size": 2231 + "path": "en/api/python/beta/messages/batches/delete.md", + "sha256": "200661c32484b5ab2abd525176347aa4e828a63d4ff45abc3627cbbaab03ed13", + "size": 3803 }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/create", "status": "success", - "path": "en/api/cli/beta/environments/work/poll.md", - "sha256": "5648b8288bb8f6a7b52b9bc688bd2ccab0e5ad1b36f48579b07397fc089465b5", - "size": 3608 + "path": "en/api/python/beta/messages/batches/create.md", + "sha256": "6059545e8195fe9af79df4bc855c603afcd8dfdc911a72208a2dd6265f5408dd", + "size": 168271 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/list", "status": "success", - "path": "en/api/php/beta/sessions.md", - "sha256": "75a4c852b975096975c7996e7d44d45485475746d934999f07d9c51c9874d05e", - "size": 199270 + "path": "en/api/python/beta/vaults/credentials/list.md", + "sha256": "f24c35f1db5a22673c05bc9748f0637a0a173fb0d30ceb0ecf774988018ddd02", + "size": 8381 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/php/beta/webhooks.md", - "sha256": "dbcac219db91f6509c0d8e83006f4783c03ae49910c4408c62d16969e61ee9e3", - "size": 24024 + "path": "en/api/python/beta/vaults/credentials/archive.md", + "sha256": "9b5fcb7e7cfbafebab0154b8e75780111c1dd569c31beb366d2126fe3bc66c46", + "size": 7916 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/update", "status": "success", - "path": "en/api/php/beta/skills.md", - "sha256": "27c6e353c26e00d70d0f79d8d6ee45c836a88548f0cff61aebc6069d9582ceba", - "size": 24186 + "path": "en/api/python/beta/vaults/credentials/update.md", + "sha256": "6ead5224c33c846309464afaeca8d8a9315e5fe6ead3e285a2bc544e9ed5c04a", + "size": 12551 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/php/beta/agents.md", - "sha256": "7e856e1e50ce125cd06930f1efa91fd701fded8ce2e2829cda58fdfef9b4d17f", - "size": 82093 + "path": "en/api/python/beta/vaults/credentials/retrieve.md", + "sha256": "40dfb057dc2bdc3657a59e4ebc28b86f881a8e66de6b4df28e5d3e6d83648164", + "size": 7914 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/php/beta/deployments.md", - "sha256": "8b1577bc23ab7cff4ddffc1d21456d3800fca7e7c0deef3ea608e40ece53442b", - "size": 56347 + "path": "en/api/python/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "86378590bd62dd2ac459fd777c1be5a6324ade47b6e5e9e16e86418c4e92430a", + "size": 7035 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/php/beta/deployment_runs.md", - "sha256": "30ca8d8ede447c111c6ebe9ae443927e60bf2c2b3f04587824cab28ef17961ac", - "size": 12099 + "path": "en/api/python/beta/vaults/credentials/delete.md", + "sha256": "d9313e8a379abc6c8a34149f260ed35881fd96bacb87e5f2b3f32ca94a38cd4b", + "size": 3685 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/create", "status": "success", - "path": "en/api/php/beta/user_profiles.md", - "sha256": "76d188b844ba0f266b45d1e7687f01d40f70a464659161e06c7267a30d9f6efe", - "size": 34412 + "path": "en/api/python/beta/vaults/credentials/create.md", + "sha256": "7748fe01ff212f8ca028c243e590e36c508dde39b1eddfad2a20a99da508a995", + "size": 12891 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/models", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/cancel", "status": "success", - "path": "en/api/php/beta/models.md", - "sha256": "5d324e60a3f02da0adddb0ea5b19a7b220efe328543016efdbe34baa63ced970", - "size": 19754 + "path": "en/api/python/messages/batches/cancel.md", + "sha256": "2c6dfa35934fe1d7d2d15fad2f50fb8dcacb057624b35eeef6664c0a09be6b3b", + "size": 5321 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/list", "status": "success", - "path": "en/api/php/beta/vaults.md", - "sha256": "5e69359511d34eca20138c416a9459cc94fab1b8d2b1d5a002214c83dfb8c89a", - "size": 33535 + "path": "en/api/python/messages/batches/list.md", + "sha256": "8ed1db0a6767cb02ffb6cd6ba09290c0fafa516b783e3edf130a9938c73d43c8", + "size": 5455 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/retrieve", "status": "success", - "path": "en/api/php/beta/memory_stores.md", - "sha256": "9ea799b88955a11c59404e24d2f09bacd12b06b2f3cf962bd87e47e3da930f17", - "size": 62356 + "path": "en/api/python/messages/batches/retrieve.md", + "sha256": "b41e490112e56042477095dda97d1a6e848b1ad3c940189d5fc96b4e6ab125fa", + "size": 5013 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/results", "status": "success", - "path": "en/api/php/beta/tunnels.md", - "sha256": "15f6e16f7d5a0666ccad4a0b0cdeeb11c1ba1271aaea9d21f1964914e6e54181", - "size": 27635 + "path": "en/api/python/messages/batches/results.md", + "sha256": "b6f955943f0d3c001dd02748169e7a9aeb822c80a751e958681055da2e614d4e", + "size": 39456 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/delete", "status": "success", - "path": "en/api/php/beta/environments.md", - "sha256": "4b62c673c51dadcdb1d55b2185f42f45a58d15870e696af825670cff1a639607", - "size": 48099 + "path": "en/api/python/messages/batches/delete.md", + "sha256": "0301eadc5ae4c3f4eb9222fb8bb2d9f5c5c3bc93aeba9f9ec4dd231898b7b318", + "size": 1756 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files", + "url": "https://platform.claude.com/docs/en/api/python/messages/batches/create", "status": "success", - "path": "en/api/php/beta/files.md", - "sha256": "c1af05fbbe4f931a2fbad8e1c3d2c0d0bd7fbd7dfaa1c5c59ba64984bf85216f", - "size": 12793 + "path": "en/api/python/messages/batches/create.md", + "sha256": "08fa876004eca5831202efb71d8503b77761ac29869c89894c22958b81169693", + "size": 111023 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/count_tokens", "status": "success", - "path": "en/api/php/beta/messages.md", - "sha256": "654a11c714bec71fd18a411f610f237e28d0b8f22887a4a165993147c4ee0bc6", - "size": 382514 + "path": "en/api/ruby/messages/count_tokens.md", + "sha256": "ea84100825c108e4c5864ddd396dae3122e689a4cd33f57b9bd99ea0fbd4dec6", + "size": 91467 }, { - "url": "https://platform.claude.com/docs/en/api/php/models/list", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches", "status": "success", - "path": "en/api/php/models/list.md", - "sha256": "35c543e97cb8025665ab969f35a9e762acf147ce73a23d330ddc9a6543e2943d", - "size": 6626 + "path": "en/api/ruby/messages/batches.md", + "sha256": "f1856dd2c0ea3d2b92d73eff263766f211e0a1ab6794ef377359274373d718f4", + "size": 261787 }, { - "url": "https://platform.claude.com/docs/en/api/php/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/create", "status": "success", - "path": "en/api/php/models/retrieve.md", - "sha256": "5b079e7634857b2a8969ea2d41b393a71b0c65f00246207afb97372060ed4364", - "size": 5307 + "path": "en/api/ruby/messages/create.md", + "sha256": "5cb70022f63685b6ee9feeb16615b2dac95b69adfa542a9402c8e600e0b9b3cd", + "size": 132095 }, { - "url": "https://platform.claude.com/docs/en/api/php/completions/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults", "status": "success", - "path": "en/api/php/completions/create.md", - "sha256": "e47f61069eca3851f391ce940b1ccbfde33f0958d25ed5c4ddceb8f5a25201d2", - "size": 13298 + "path": "en/api/ruby/beta/vaults.md", + "sha256": "1029ec93fa6544fffc7c7fdd594d699fde011869fd710a996ec4d25c409d1f50", + "size": 84621 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs", "status": "success", - "path": "en/api/php/messages/create.md", - "sha256": "69dac11e95523150daf511473595808bfebdb933ea5e154dcabe06b62381cf0d", - "size": 21465 + "path": "en/api/ruby/beta/deployment_runs.md", + "sha256": "244b660b0896de6ce4841797bb318986b09caaa1092cdccb642e6046064280ba", + "size": 31884 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/webhooks", "status": "success", - "path": "en/api/php/messages/count_tokens.md", - "sha256": "fd336a881f669b186e59846d87f698bc4f4072133f1462547f4c58516adb7a60", - "size": 10455 + "path": "en/api/ruby/beta/webhooks.md", + "sha256": "0c6b70312b9a543599c89bee6d1dea7d94154a752306664acc97c1145b5a88f5", + "size": 36683 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/models", "status": "success", - "path": "en/api/php/messages/batches.md", - "sha256": "c4215b4f52c0e8a2a67d9a8cffa23f19684078158bbc0c2f9f6fed9785f2b8d7", - "size": 26892 + "path": "en/api/ruby/beta/models.md", + "sha256": "249f01d9538754657258756ae17de2b7cb6949123a908f2550dda5aa2643ea26", + "size": 43509 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills", "status": "success", - "path": "en/api/php/messages/batches/create.md", - "sha256": "c89ed0f723f16958aa4e461228128f38068b9c81a11318141c5a3c21ae9c27bf", - "size": 6764 + "path": "en/api/ruby/beta/skills.md", + "sha256": "06e44ac8e0eb45f3a12b233de5c498193d71d1904950b035e61b7544d158d002", + "size": 41131 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores", "status": "success", - "path": "en/api/php/messages/batches/list.md", - "sha256": "6dd8f7bf735f417253dafcf9b8c8ea8822d75d7322525d430ffd0f67a53241df", - "size": 4399 + "path": "en/api/ruby/beta/memory_stores.md", + "sha256": "9d902187515c8b6563e16f447939c24a128f1315955ef7790ac7cb57b952b5c8", + "size": 99464 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages", "status": "success", - "path": "en/api/php/messages/batches/cancel.md", - "sha256": "911022ce5cf4e7f201d12ea0ed3402ff12ca36f21ab7b1dc4aba19fbcfffe544", - "size": 4189 + "path": "en/api/ruby/beta/messages.md", + "sha256": "dcc59da0df2228d7bc85b26b60515f7b92fbe9c48d8a3a0c981960dcb191cb13", + "size": 2955237 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents", "status": "success", - "path": "en/api/php/messages/batches/retrieve.md", - "sha256": "354d5a124a51a4eed1a12534f2e701e194bb5f7874b70bdb3bbd3b0101331c47", - "size": 3881 + "path": "en/api/ruby/beta/agents.md", + "sha256": "606d6b6426352a745f6fb74e70470de5d76f64688317c4f3d690f4cbd6e9c876", + "size": 458754 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions", "status": "success", - "path": "en/api/php/messages/batches/results.md", - "sha256": "84d8fa8e00d89ef1784794f2c22f856495cc8422f974204de01bdb83e64144c9", - "size": 2153 + "path": "en/api/ruby/beta/sessions.md", + "sha256": "5c307ed87f43686af0355912be6939a9d62ade6c75c117d3b28add7c32b9b94d", + "size": 1197613 }, { - "url": "https://platform.claude.com/docs/en/api/php/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles", "status": "success", - "path": "en/api/php/messages/batches/delete.md", - "sha256": "8a2680b484a8ce099c9691f30f103c8e7134d643c94e8937fdf6fe0a59e39e16", - "size": 1734 + "path": "en/api/ruby/beta/user_profiles.md", + "sha256": "de2498df707abb1942aa814f91992cd774b87516f0c9bc88f31808fc91361b1f", + "size": 64367 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files", "status": "success", - "path": "en/api/php/beta/environments/create.md", - "sha256": "e3c21d55d6493be90698d86f001ad86e19c55d2a0a6937a40b6e0d39db30fcca", - "size": 4341 + "path": "en/api/ruby/beta/files.md", + "sha256": "d7c20c116b9a8604f1ae63b8e14a9612069a2a4ac4f918ff33a7bf92f711e05f", + "size": 22105 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments", "status": "success", - "path": "en/api/php/beta/environments/update.md", - "sha256": "b2c46bd4995adf69ecffa10cdd393735e1c2365c48e437eefa6e73b15ef825fe", - "size": 4455 + "path": "en/api/ruby/beta/deployments.md", + "sha256": "6a95fb2cc1d38f2f8038320d6470dbdaa92bdf20695c67a5e1748d8b86b767e8", + "size": 218846 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels", "status": "success", - "path": "en/api/php/beta/environments/list.md", - "sha256": "52e90f37a5010ab9aa2c93ecef36b5d1b1c29e07412ce5bc4b87c3f2b5020155", - "size": 3742 + "path": "en/api/ruby/beta/tunnels.md", + "sha256": "9b4df61bc2f97859328d88afe1a29faed18e276d0b738afda27fdc61bed087b9", + "size": 44947 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments", "status": "success", - "path": "en/api/php/beta/environments/retrieve.md", - "sha256": "de0710eb4547add4da69943f09a15696b3a06ad67906732ebf808b6b374a9b95", - "size": 3144 + "path": "en/api/ruby/beta/environments.md", + "sha256": "4a6d3e91fe29ccb467c40cc91fb10b4d3102d5337c6ebe12d55364040abf32bc", + "size": 92590 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/models/list", "status": "success", - "path": "en/api/php/beta/environments/delete.md", - "sha256": "87dfb9c885c03581d91f8a556ab961704c57a6e3ffbb8987b676ba321cd9c28f", - "size": 1645 + "path": "en/api/ruby/models/list.md", + "sha256": "038f0dc01a62ac3f01a289127915baf4390492503c31c1a5a87595b970f38523", + "size": 12770 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/ruby/models/retrieve", "status": "success", - "path": "en/api/php/beta/environments/work.md", - "sha256": "72d5538323207a9bc20407cd4a807bad55e4318bf979942a58e04cda37f90262", - "size": 27049 + "path": "en/api/ruby/models/retrieve.md", + "sha256": "c088a09f8e5e040477fe9c217265ae6da1c2feea5801b62bcb6ba6eee416747b", + "size": 11533 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/completions/create", "status": "success", - "path": "en/api/php/beta/environments/archive.md", - "sha256": "cdf8f1114a837716cea1d31db85e71752d1d104a077976a5f23f91a2429abb71", - "size": 3210 + "path": "en/api/ruby/completions/create.md", + "sha256": "0ebdff12a0e9a1d5c7d40fc127aead32d32032a7c69d86e7635cda331bfc4828", + "size": 12965 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/list", "status": "success", - "path": "en/api/php/beta/deployment_runs/list.md", - "sha256": "56da5c10c1b12708126bcc0e2e540a7f08a2c1cbbf99187b02f3909230624af9", - "size": 4517 + "path": "en/api/ruby/beta/vaults/list.md", + "sha256": "81bf1577a4e6fec822601e948c337c552ca584c53ecd692f5478dbc2b6eed105", + "size": 4357 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/archive", "status": "success", - "path": "en/api/php/beta/deployment_runs/retrieve.md", - "sha256": "6b2027b5e8bdcc76a78211d8f9de4d9310d9286695e29eb0293c51dcb800f56a", - "size": 2695 + "path": "en/api/ruby/beta/vaults/archive.md", + "sha256": "f8d29db1e3fe0a16059b7e888bbbfbcda5f8b810686a3ecccf8af9d92dd77c56", + "size": 3950 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/update", "status": "success", - "path": "en/api/php/beta/vaults/create.md", - "sha256": "a886fdffa08df0b1d82886d0d77ee843118a51995ad3b48b3d2b189e46e833ce", - "size": 2350 + "path": "en/api/ruby/beta/vaults/update.md", + "sha256": "b222d27767ce86629706f5028ac37b451bb624239b1c4bd2683603c91b0c034f", + "size": 4201 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/retrieve", "status": "success", - "path": "en/api/php/beta/vaults/update.md", - "sha256": "9978558d9f339cd03887fd46c84ac80900dfbb860bb54be37f01238579dec806", - "size": 2501 + "path": "en/api/ruby/beta/vaults/retrieve.md", + "sha256": "7b1d0446eaf05811a93600137e9336b16012a46398c3a4f96438a4eb0e8d4026", + "size": 3948 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/delete", "status": "success", - "path": "en/api/php/beta/vaults/list.md", - "sha256": "a8a13ad08c50c4ed9ed5003e4f18c29a243d2fe08a243d877f5c70e179ed0928", - "size": 2647 + "path": "en/api/ruby/beta/vaults/delete.md", + "sha256": "632e80fa91e7d721b4a6f2e9bd11929d267d592d32860b5780e379d9b9bdfefd", + "size": 3333 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/create", "status": "success", - "path": "en/api/php/beta/vaults/retrieve.md", - "sha256": "fb1796d2327d0a322ed7a8b3f0cd33a77288902efeb7ede589d3a4ed5c12f851", - "size": 2133 + "path": "en/api/ruby/beta/vaults/create.md", + "sha256": "00f901db95a9b530ed9775e479dbf1cdca1209e697f94cc6721fd57cb709169f", + "size": 4098 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials", "status": "success", - "path": "en/api/php/beta/vaults/credentials.md", - "sha256": "9bd4538d11d884e98c7143c75a4d4c7eab9d2febe975d68a1627b08465697086", - "size": 33043 + "path": "en/api/ruby/beta/vaults/credentials.md", + "sha256": "84ab161e585a8565841a96ff0aeb7c9af7af50adea73a561d17765d07be21e1e", + "size": 94250 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/count_tokens", "status": "success", - "path": "en/api/php/beta/vaults/delete.md", - "sha256": "fd906ef67a5d5653a433b07fb825898faf354ca03ee39f6a797ca8db6c6cd5c5", - "size": 1604 + "path": "en/api/ruby/beta/messages/count_tokens.md", + "sha256": "52f89bf71abe5297b7877e5d93cc244ec7119796bb1a99ad667f81c7a1661c10", + "size": 140287 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches", "status": "success", - "path": "en/api/php/beta/vaults/archive.md", - "sha256": "2df977e274ada045734c9ee629fbcc79023f57fed14b33fa84b9c1e245c4534b", - "size": 2135 + "path": "en/api/ruby/beta/messages/batches.md", + "sha256": "22465e133ee28377dac437120ea2a1a7d7847458a424c70c3df6c821421eee0e", + "size": 763514 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/create", "status": "success", - "path": "en/api/php/beta/user_profiles/create.md", - "sha256": "5cc2d1c4dbf3878d9943392b36c6649373f5e29a919adfcf4a6e3c3d58df2af1", - "size": 6920 + "path": "en/api/ruby/beta/messages/create.md", + "sha256": "878349c3599135fbe6d887eb8d0e5672c18bfaac86c0db8674708cce2ae73239", + "size": 296457 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs/list", "status": "success", - "path": "en/api/php/beta/user_profiles/update.md", - "sha256": "fa1331701b0c32f4a0547185ff302ae36caa901919902d195bea7d4b46578c80", - "size": 6785 + "path": "en/api/ruby/beta/deployment_runs/list.md", + "sha256": "7d2d06b1579f7df714d41622f08e4d44b1b8243c50806c6241d02f448fc738f2", + "size": 10654 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/php/beta/user_profiles/list.md", - "sha256": "5581110b185c48c55e3f1e652d555fd519b723ca4005c7232ea35196191d0893", - "size": 5176 + "path": "en/api/ruby/beta/deployment_runs/retrieve.md", + "sha256": "07b8ef0739ba6b22d9e09e99ee93cf584a8aa73eca6600474f1a0efbea2b0fd1", + "size": 9314 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/list", "status": "success", - "path": "en/api/php/beta/user_profiles/create_enrollment_url.md", - "sha256": "b0b2f3156977a6ebe7b5610d53a76fbc7ab9fe96334ad364e93b2fb072898f21", - "size": 1973 + "path": "en/api/ruby/beta/agents/list.md", + "sha256": "eadf58253940f828326ff7af7f4ef4c74a332986d3b0793c82b9879876584f40", + "size": 30706 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/archive", "status": "success", - "path": "en/api/php/beta/user_profiles/retrieve.md", - "sha256": "f96408e32c4a15fbd065bbebba9514844a5ca8113cb28144a05e1e5ab3321f47", - "size": 4488 + "path": "en/api/ruby/beta/agents/archive.md", + "sha256": "9e6e85ab1c0eb7ff3df5f372dceba77c73ed43e65ca70c9f3d01a66cd12c9b84", + "size": 29910 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/update", "status": "success", - "path": "en/api/php/beta/agents/create.md", - "sha256": "5caeb67b97cb9bf97ba889d0c8afdac2a2be23bd481d91a2efaec3a4670de6a8", - "size": 7328 + "path": "en/api/ruby/beta/agents/update.md", + "sha256": "edf54e1b66bf79584f2bf6f9a5c0c1031a8cff4bf648e30d496a41922d6fa69e", + "size": 65973 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/retrieve", "status": "success", - "path": "en/api/php/beta/agents/update.md", - "sha256": "0206b3c2da1eda7927812163f41c968fc6959abf358b7d2745f9524a01b0ea13", - "size": 8405 + "path": "en/api/ruby/beta/agents/retrieve.md", + "sha256": "b89f2ddef43cd28eb6cca4557e9221021bccc90cb7253a4aad973af5a62c8a1d", + "size": 30035 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/versions", "status": "success", - "path": "en/api/php/beta/agents/list.md", - "sha256": "5ddfd0c0c1c83525fce1263d702b0b4edde405c3c9531a477fdddaf4b98bb702", - "size": 5573 + "path": "en/api/ruby/beta/agents/versions.md", + "sha256": "c1f563fcea3e452f61e056f3ad4c6030fc16f2f6e8a07fc76a13d82e54b73c7d", + "size": 30515 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/create", "status": "success", - "path": "en/api/php/beta/agents/retrieve.md", - "sha256": "f085adbc70ae0b8c3fd2eb96592079636d0af81d9367ae3cfa2eb8cae7d0f4a5", - "size": 4644 + "path": "en/api/ruby/beta/agents/create.md", + "sha256": "731501dfc4f35c869547c9628ad7f4734be11e71f740deaaa6514b99c119dfb4", + "size": 65124 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/list", "status": "success", - "path": "en/api/php/beta/agents/versions.md", - "sha256": "8f1946edb531f8c8d10c31d21db6bd8a6196b06d1445f390a389e05c289231e7", - "size": 5167 + "path": "en/api/ruby/beta/environments/list.md", + "sha256": "c0e9cca02f183ad57a329c748eef6a412597bf46b2c6eb45a5c191f3f27c8fad", + "size": 7148 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/archive", "status": "success", - "path": "en/api/php/beta/agents/archive.md", - "sha256": "296afe4d9ec0c42bbc7b4270a2b1715514d4ce1f99eeef34017f7d0c43a4c992", - "size": 4503 + "path": "en/api/ruby/beta/environments/archive.md", + "sha256": "d2ce8454b150c0a53c43445a1a3707b70e517307b38e335c68d1695f5b9ea3e2", + "size": 6739 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work", "status": "success", - "path": "en/api/php/beta/models/list.md", - "sha256": "98cae1eab274bb72c7050f3dcc5f0df6538722489451c3790b6f1e6ff358bf39", - "size": 6880 + "path": "en/api/ruby/beta/environments/work.md", + "sha256": "8f4d5a9f5c98a072bd1ff7e540ce7d38994bc552b2c5c86db4619e76ffce0af7", + "size": 46367 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/update", "status": "success", - "path": "en/api/php/beta/models/retrieve.md", - "sha256": "d41041b58f942e7c578090eada831af33ad16736c3de6238d96f48d791cfd880", - "size": 5533 + "path": "en/api/ruby/beta/environments/update.md", + "sha256": "ca5ac58bafa26c6cb729e7bd149cf8ac4f50ac3de22e33a8d050bd11d57f4ae9", + "size": 9551 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/retrieve", "status": "success", - "path": "en/api/php/beta/tunnels/create.md", - "sha256": "6d3c228ca1ae96b8de5199119cb15fd13d64514aa8c401571fdfac4f33aea287", - "size": 2637 + "path": "en/api/ruby/beta/environments/retrieve.md", + "sha256": "aeecb41cbf10d47c9207e9d913929ff622056b9bbe66eda384782fcdf960279a", + "size": 6673 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/delete", "status": "success", - "path": "en/api/php/beta/tunnels/rotate_token.md", - "sha256": "2c646679f3111ecb05363f23c033351ff839f93c86b3c3e4cc857a5a0c3c7068", - "size": 2318 + "path": "en/api/ruby/beta/environments/delete.md", + "sha256": "f868919727118c2898d4af374be308ad574a42a7c2b9fb5234c9cfe6c8385d09", + "size": 3385 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/create", "status": "success", - "path": "en/api/php/beta/tunnels/list.md", - "sha256": "0aa85265444fec25fa5e0c4e8b785c93d180eecda0d8e580f61a4208218a9a7c", - "size": 2979 + "path": "en/api/ruby/beta/environments/create.md", + "sha256": "61407dbafe5832fa42cfb77ea968dfe796b5e7d5146e7d824c61126dafb1d339", + "size": 9465 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/models/list", "status": "success", - "path": "en/api/php/beta/tunnels/certificates.md", - "sha256": "8f799c96f9213e5d182e0574caf4be3c98c1a3bac727f6ee83160d5c5d42b382", - "size": 12633 + "path": "en/api/ruby/beta/models/list.md", + "sha256": "a09168931a4d56f730de185dda9d3434f1e4a3fe156f9898672d4816749e88ad", + "size": 13483 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/models/retrieve", "status": "success", - "path": "en/api/php/beta/tunnels/retrieve.md", - "sha256": "927c3fbef23d61ffcfa63da5fcc8c9642fddd4656683331ec43365a540b9c486", - "size": 2452 + "path": "en/api/ruby/beta/models/retrieve.md", + "sha256": "75a5121d194b933573b39b5965a70eda3cfef50eb1d35ea592c70c83f5582c1e", + "size": 12220 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/list", "status": "success", - "path": "en/api/php/beta/tunnels/reveal_token.md", - "sha256": "eabb7aae045d3fc4c487847db3428500c6354f5b539057f3b366b9c2022e3604", - "size": 2206 + "path": "en/api/ruby/beta/user_profiles/list.md", + "sha256": "8422648c752db4cdaec8e698b3f1aef170057eb770588ef5825b8c7ec00e1d82", + "size": 9694 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/update", "status": "success", - "path": "en/api/php/beta/tunnels/archive.md", - "sha256": "aaaffa6c9be755a89371415dd982e44b783ffa49054268a2a28423ffa086c55c", - "size": 2735 + "path": "en/api/ruby/beta/user_profiles/update.md", + "sha256": "5da1187daebe18b50607ccbb0288fa8bf6d7db7fd50ddf419e9e06f7c5fc8e78", + "size": 12685 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/php/beta/sessions/create.md", - "sha256": "8dc774b8f3aa0091ac9072663a812a74e4f8400f668bd5b5f47056b425c273a3", - "size": 9695 + "path": "en/api/ruby/beta/user_profiles/retrieve.md", + "sha256": "cd2b857962ef7248654dce3ffcae75c5c614994abda04e40ffe6bfcb7dadb421", + "size": 8654 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/php/beta/sessions/resources.md", - "sha256": "ed9cb796cd35c9f73a855cee017bb80d5b9471b3a1897a2b930f30049956d213", - "size": 18197 + "path": "en/api/ruby/beta/user_profiles/create_enrollment_url.md", + "sha256": "780ffd7f0e57928eedcba54f935d6b33bb762a932644a66de34d94ec185b5319", + "size": 3793 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/create", "status": "success", - "path": "en/api/php/beta/sessions/update.md", - "sha256": "7e6c3235a26fb54dc5e307ce81863758fea3e334f8de651ec9e91c4255e673bf", - "size": 9984 + "path": "en/api/ruby/beta/user_profiles/create.md", + "sha256": "2ca0b0a74e52370b1dbda070b7bb88ef216ab6c9ec078b00efaacc1e227a5370", + "size": 12836 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/list", "status": "success", - "path": "en/api/php/beta/sessions/list.md", - "sha256": "aa58d32e8cc6d60a0db7ef646240a5dfbe6b1f2dbfd4a83e2c7c2c44e825c132", - "size": 10737 + "path": "en/api/ruby/beta/skills/list.md", + "sha256": "c3ab43d0dffad3da3dc2f3a31985ea903b6094ff8b1168bf8b4da98a66ef85e3", + "size": 5417 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/retrieve", "status": "success", - "path": "en/api/php/beta/sessions/threads.md", - "sha256": "c086307a486a5bc8d8f4567cf295b8d30e264ecb012a6e3d41eea572a5ab4ef7", - "size": 90768 + "path": "en/api/ruby/beta/skills/retrieve.md", + "sha256": "c88997903905eeb7c3c42539361adc0d057e755b44e0a1c0aba5569e7c94b0f9", + "size": 4901 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/delete", "status": "success", - "path": "en/api/php/beta/sessions/retrieve.md", - "sha256": "fe31de60ee8b2e319234865b5cac17ea5c1c9eb4b929cf3ec6332cfa55023015", - "size": 7706 + "path": "en/api/ruby/beta/skills/delete.md", + "sha256": "3fda8745b9aaf677d39920297058cb330e9f2db5948d7f3977c224fd0304ec12", + "size": 3357 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions", "status": "success", - "path": "en/api/php/beta/sessions/events.md", - "sha256": "4c019ed077c5bc7758941f1271407609dcf656d091e43cda51e6b1a35d25c3ee", - "size": 142866 + "path": "en/api/ruby/beta/skills/versions.md", + "sha256": "59112068a50af88f30ec9f5e2f858f2a8412f26041635805ebdc77d7e1bf10c3", + "size": 21517 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/create", "status": "success", - "path": "en/api/php/beta/sessions/delete.md", - "sha256": "604a18585dbe2912eefe16a5d8162c12eced2b6964cf1b3e62cc3f2b0e833d5d", - "size": 1532 + "path": "en/api/ruby/beta/skills/create.md", + "sha256": "4bbc60a9e52289d34e2975a2a37bee41fdbb20eb1e71270fa1f0be0e43b9a471", + "size": 5160 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/list", "status": "success", - "path": "en/api/php/beta/sessions/archive.md", - "sha256": "771b9a68f61dc38c490f0f06a7d9cf2dc9fee1df8f162a9903cf1492190f1f52", - "size": 7724 + "path": "en/api/ruby/beta/tunnels/list.md", + "sha256": "7f099f045991efa1dfd903485ac7928f4dc9178398bf9c2055b2c89649e6a31d", + "size": 4612 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/archive", "status": "success", - "path": "en/api/php/beta/deployments/unpause.md", - "sha256": "c12e7f69495075a619d072aa22f71fc6078a2d41eea48be220185237b3b7ba83", - "size": 4680 + "path": "en/api/ruby/beta/tunnels/archive.md", + "sha256": "53d828eb554a29865a0996a53d177f74df51a91831783238ba05dcc6fbbc5e3d", + "size": 4470 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates", "status": "success", - "path": "en/api/php/beta/deployments/create.md", - "sha256": "5c9a9ab3fdda4378746b5991e4d8562171099e8a5bb5e5b8320ae5f53d01092a", - "size": 7163 + "path": "en/api/ruby/beta/tunnels/certificates.md", + "sha256": "adcb908975ccc62c14635577b3a3c26379bac8fb8ef914be9b4fc339f52302fd", + "size": 19737 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/retrieve", "status": "success", - "path": "en/api/php/beta/deployments/update.md", - "sha256": "60edff9967f095b9228a0fafd8ec9b29a6114c74436713f2f3e75f6fa6421c73", - "size": 7471 + "path": "en/api/ruby/beta/tunnels/retrieve.md", + "sha256": "48fa5f16dcdebbf5457c51c34f596c016ce9413ba8db5a6e7d0c7bbd9bab8c25", + "size": 4187 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/php/beta/deployments/list.md", - "sha256": "d8df23c3bcefcab4dd5c69732975b32b255eaf69e389b54d424bcf255b169bb8", - "size": 6110 + "path": "en/api/ruby/beta/tunnels/rotate_token.md", + "sha256": "f7d1c962675efd2aba3ee4e77d119815b0708f25ef854613c4e83eadf6d84e68", + "size": 4005 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/php/beta/deployments/retrieve.md", - "sha256": "ea0cc82261c32a5138523e60a5ff721567ee35a9414443d2bc089b035c7834d6", - "size": 4651 + "path": "en/api/ruby/beta/tunnels/reveal_token.md", + "sha256": "091f65da22277d9abd8dba97d873a3e49273827fdd06f119a05da996ec93dd8f", + "size": 3919 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/create", "status": "success", - "path": "en/api/php/beta/deployments/run.md", - "sha256": "2c036ed2d98410214e7dc083ae004d2e2fd80d8919f04feb2756ade491c6796a", - "size": 2676 + "path": "en/api/ruby/beta/tunnels/create.md", + "sha256": "2f12e1ad3fbf51b8030777c02e8317621143eaca18fa13c3e088a0cb234d9636", + "size": 4362 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/list", "status": "success", - "path": "en/api/php/beta/deployments/pause.md", - "sha256": "05b2b2b247e5ebf5631a601140e54179e4459bc0c1da74b5028be5596ac71fd2", - "size": 4664 + "path": "en/api/ruby/beta/files/list.md", + "sha256": "58f950d36d30011e36bf9bbd4611b5994acaeb427f4384d684a289f8cc48169a", + "size": 5263 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/php/beta/deployments/archive.md", - "sha256": "1521f1ca9e8168c5f87c6c49c0bfa28bb62ecab7988c707782290e51cc63a595", - "size": 4680 + "path": "en/api/ruby/beta/files/retrieve_metadata.md", + "sha256": "595c0baba6c0f1fd3f586f8827972addbc89fd3a1b52bfda191c277aa2667142", + "size": 4538 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/upload", "status": "success", - "path": "en/api/php/beta/skills/create.md", - "sha256": "dc0a667f57be734a1e9d50d07d9720b3d18d8833c86667e51e1d435d525425ab", - "size": 3119 + "path": "en/api/ruby/beta/files/upload.md", + "sha256": "e2217cad36d4e7b6d03b3136827b3b4c7c4518ed5741a24ded01f02a5cd1b1f1", + "size": 4902 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/delete", "status": "success", - "path": "en/api/php/beta/skills/list.md", - "sha256": "4dc4b51c0a5ce7a7ecdcf8d7b71baefeae2d9affd5d97afd450c87d1d604898f", - "size": 3308 + "path": "en/api/ruby/beta/files/delete.md", + "sha256": "e7f93b2e477cb7b712a2acd0308100ae9ba721c62c09f39efbf54d13e857d722", + "size": 3207 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/download", "status": "success", - "path": "en/api/php/beta/skills/retrieve.md", - "sha256": "6d967a8532c8b697a7bdcd40c251d8a9b24085e02e7c5e9dd7238362ca09f61c", - "size": 2698 + "path": "en/api/ruby/beta/files/download.md", + "sha256": "badbb85a68f6f92c9d3668d90c0ae620dd5f5586702340349e2f3c538f6bfab7", + "size": 2926 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/unpause", "status": "success", - "path": "en/api/php/beta/skills/versions.md", - "sha256": "91fcfa98c1470157b78830ffc61c6b5fcd12dbeec5b24666a3430f5887dfa967", - "size": 13224 + "path": "en/api/ruby/beta/deployments/unpause.md", + "sha256": "2a764e75bfcd0569cb991a2fe7fbf166eece465e93fa3116f18efa7b58684c3b", + "size": 19201 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/list", "status": "success", - "path": "en/api/php/beta/skills/delete.md", - "sha256": "40b43a2b21e6326b0a41a929ae63c25ed9f1287cf82f0688876769da1e6125d5", - "size": 1679 + "path": "en/api/ruby/beta/deployments/list.md", + "sha256": "c32a8151ed24b5ebc874643ba65efd4e0a77692223492614ffe6e77d08fc9159", + "size": 20407 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/archive", "status": "success", - "path": "en/api/php/beta/memory_stores/memory_versions.md", - "sha256": "17753008bfc123a7ef48b6c1be2afae0f6f540458abdb3011f583a04c68b1806", - "size": 22676 + "path": "en/api/ruby/beta/deployments/archive.md", + "sha256": "f0cd835f6fb26cd2cc963fbee9f51b049a9791d843946528108eef5bec5f7ee5", + "size": 19201 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/update", "status": "success", - "path": "en/api/php/beta/memory_stores/create.md", - "sha256": "76a119d3e84c85fdc133c930757df4276e5ee099a3f44f6a89ab660bcf977f92", - "size": 4441 + "path": "en/api/ruby/beta/deployments/update.md", + "sha256": "84b2e1654a48edabf7750bdae8135c170fc6feceee68ec46117dbc0a6d5e2726", + "size": 30300 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/retrieve", "status": "success", - "path": "en/api/php/beta/memory_stores/update.md", - "sha256": "4bac1560093f42ac048d03635d906177ec584f3812059bc7309dc51be0cecd14", - "size": 4289 + "path": "en/api/ruby/beta/deployments/retrieve.md", + "sha256": "3402268e7ca9e2091f9d4cc834e6a14f0efb0b346d8f0818206aaf2dd4c7ff52", + "size": 19172 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/run", "status": "success", - "path": "en/api/php/beta/memory_stores/list.md", - "sha256": "a69b21081555227f1fb4d9f6afc1837e80c6852cc84cb4db9bb3592d6d8779ab", - "size": 4312 + "path": "en/api/ruby/beta/deployments/run.md", + "sha256": "5a174aa9983abeb21d91f9bc1650d44aa836abd63ebb7fa2b7cfd7428c714902", + "size": 9291 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/pause", "status": "success", - "path": "en/api/php/beta/memory_stores/retrieve.md", - "sha256": "3811f58a14586c7159a77e13da640f63b94ef5494518c3993f9711d52628ed7d", - "size": 3400 + "path": "en/api/ruby/beta/deployments/pause.md", + "sha256": "e71ac36950ac1fc60cf21c62915049f0e9e6b6a5e3aa9602af614ee5db9cbbae", + "size": 19185 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/create", "status": "success", - "path": "en/api/php/beta/memory_stores/delete.md", - "sha256": "9ba6980345fadf9025692d706e39944044febd11da3dab8f74036a5a6b4014fa", - "size": 1880 + "path": "en/api/ruby/beta/deployments/create.md", + "sha256": "f472cacba35e0fe2fc271fd5675ff52900af82f6e75d6f4206cb87f7a35fb672", + "size": 30245 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events", "status": "success", - "path": "en/api/php/beta/memory_stores/memories.md", - "sha256": "6f540a7db6aa4ac6f98dea951023b6a89a9805ea693efd4f1676b1b84da929df", - "size": 29982 + "path": "en/api/ruby/beta/sessions/events.md", + "sha256": "97e848ae74e3ca623437b5a5d1dcf230dc9d05ad387a14565651d4496d07885c", + "size": 576962 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/list", "status": "success", - "path": "en/api/php/beta/memory_stores/archive.md", - "sha256": "f14a3b143c3990cfab9fca90bdb8c617346b3cab80e992c840247b9f9a2236c1", - "size": 3497 + "path": "en/api/ruby/beta/sessions/list.md", + "sha256": "eb0c6bcd183739845c309e692a6f31781d9df9c698721b7c45f4ae0bc937dc57", + "size": 48362 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/archive", "status": "success", - "path": "en/api/php/beta/files/download.md", - "sha256": "b0ab13a50a19654b2c377be1bc6d3d387f701d2d8e2a403495163fbe652be6bb", - "size": 1250 + "path": "en/api/ruby/beta/sessions/archive.md", + "sha256": "11678bd5bb09cf8f59110b18bd04bf85427f7bef7c41380750a4f93c66a95935", + "size": 45694 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/update", "status": "success", - "path": "en/api/php/beta/files/list.md", - "sha256": "70236c2a8bd9a32c855e0672cc952fd547598e3e09bfa56426abf6c5e4cc2420", - "size": 3446 + "path": "en/api/ruby/beta/sessions/update.md", + "sha256": "6d7eaa7b0ec9abb15d5487ffa56d440b28e9c35aaddcb70c89a601a72be5a929", + "size": 69664 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/retrieve", "status": "success", - "path": "en/api/php/beta/files/upload.md", - "sha256": "e1bf023984793213b88a8339b871bde3e23f95a33337134d679cbc5a5ecc5621", - "size": 3026 + "path": "en/api/ruby/beta/sessions/retrieve.md", + "sha256": "d0ea683b46927d85c268c1f4c3a9b7390846da5cd81d1fd380f94c1bef3fb145", + "size": 45676 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources", "status": "success", - "path": "en/api/php/beta/files/retrieve_metadata.md", - "sha256": "3232b216a10cb135f81452bd8cce74f237c8bfa6882ce2692325548311dcc2cc", - "size": 2574 + "path": "en/api/ruby/beta/sessions/resources.md", + "sha256": "df0b50c105a735c12c036daa007622b9db542cbbb8c5a4666382913c3bb9fa8d", + "size": 35628 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/delete", "status": "success", - "path": "en/api/php/beta/files/delete.md", - "sha256": "ee1e2538d14376e89432b21104f421b91e7f0725ee0bc3b54c3ab50e006ff5ca", - "size": 1520 + "path": "en/api/ruby/beta/sessions/delete.md", + "sha256": "6249c169aeffd0c47b21ed129794d1efcb1dba807066d6cc2e63162af9f00c9a", + "size": 3290 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads", "status": "success", - "path": "en/api/php/beta/messages/create.md", - "sha256": "94b71605f97f9082d04fe33a920d1de3086a05f97cd919d5cc197da999cb4842", - "size": 31030 + "path": "en/api/ruby/beta/sessions/threads.md", + "sha256": "3f284eb14a02a14366098d26dde8d9e3af3fb193cee16c4af6dd434acee53de4", + "size": 447667 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/create", "status": "success", - "path": "en/api/php/beta/messages/count_tokens.md", - "sha256": "979ebdeb155d148c36b30ca74cafcb1ac468f2bdb82ff8333846df7d2de92225", - "size": 13482 + "path": "en/api/ruby/beta/sessions/create.md", + "sha256": "d3b9ce0759998b169242a933ef9ecad3a38f0f573bf1b0c96d46144142712c9b", + "size": 84408 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/list", "status": "success", - "path": "en/api/php/beta/messages/batches.md", - "sha256": "164fe9cdaaf69f7824acc6ae5134103b57f1146f7d1eb508a1a8c29e0a3bc397", - "size": 30087 + "path": "en/api/ruby/beta/memory_stores/list.md", + "sha256": "3aa251dddaff84ef8bd548f83bc125abb33f9c43ebb598c2290ebea3b6bfa923", + "size": 5978 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/php/beta/messages/batches/create.md", - "sha256": "025bd31a90e144da21df22b8f5ee479141e1845cdb8fbec1342a09c706e75f3c", - "size": 8567 + "path": "en/api/ruby/beta/memory_stores/memory_versions.md", + "sha256": "e7fbb903fa94e06264720bc7757e1bd76d794a9d24f1bda1c89fafe20fb56144", + "size": 40255 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/archive", "status": "success", - "path": "en/api/php/beta/messages/batches/list.md", - "sha256": "39310ce74a57608662dc517111424530c2abc91657e6a5f427c35c3e418a72e0", - "size": 4659 + "path": "en/api/ruby/beta/memory_stores/archive.md", + "sha256": "eb96e3347b50639e4998cd2042688df0360ab440ec7ebe7b6345bc4b169fdf3a", + "size": 5441 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/update", "status": "success", - "path": "en/api/php/beta/messages/batches/cancel.md", - "sha256": "6e2b22c5c809e5dff85e6a305735da0d9411313330fbc80654aaa152aef1e997", - "size": 4460 + "path": "en/api/ruby/beta/memory_stores/update.md", + "sha256": "943be6a5908ae7f760c4b3d38760e3d1d8cfdc088264e3220fcf66616808939a", + "size": 6114 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/php/beta/messages/batches/retrieve.md", - "sha256": "69ef30966238cdbdd759ff19e8132475e7fe0751354a821cfaad8957ef0e5c41", - "size": 4152 + "path": "en/api/ruby/beta/memory_stores/retrieve.md", + "sha256": "f026989d345a0fd5a63b1b32fd38d38e6983f9b8f4824e8f018d97d6de512917", + "size": 5344 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/delete", "status": "success", - "path": "en/api/php/beta/messages/batches/results.md", - "sha256": "71664e0a56f46cd3e063214da5060bce7a73234f57426a38889db5e38aae2497", - "size": 2436 + "path": "en/api/ruby/beta/memory_stores/delete.md", + "sha256": "807fc6ae812f768ef5b6ae99834b8884eb69dd51ba3cf1ef1944e54fc554e367", + "size": 3637 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/create", "status": "success", - "path": "en/api/php/beta/messages/batches/delete.md", - "sha256": "f0c1c3d506b2639c2bb308631c35660ef2e9186546804cf33277684347c47b58", - "size": 2005 + "path": "en/api/ruby/beta/memory_stores/create.md", + "sha256": "15cd48a7e6f583ad01e63a2b000999b42aaeeee346e4311ea522ecca78eb39a4", + "size": 6293 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories", "status": "success", - "path": "en/api/php/beta/memory_stores/memories/create.md", - "sha256": "0b9c1a30bcbe67618063e0d6a5873fbe69129b8324195afba098952c1cac9ffd", - "size": 4677 + "path": "en/api/ruby/beta/memory_stores/memories.md", + "sha256": "de310d013039260db50d58ec25bd9ff47aca1040a9cdcfa703219a13dcb1e6b2", + "size": 48615 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/php/beta/memory_stores/memories/update.md", - "sha256": "ee26b99f0ea6ff0f5f9bb55087c5c204d9ef1e2caae405c8c6e5b24cd9e23af5", - "size": 5255 + "path": "en/api/ruby/beta/memory_stores/memory_versions/redact.md", + "sha256": "aec28f8120ce9f6c4ec3525edfdfb74835eb01995557c536ab8a457c89c2a375", + "size": 9339 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/php/beta/memory_stores/memories/list.md", - "sha256": "ccce8c19d80fd54e500f34dea7baf2932d8a7c294579fc1beff0333ac19570a7", - "size": 5673 + "path": "en/api/ruby/beta/memory_stores/memory_versions/list.md", + "sha256": "e3461d311a1ce03bff9200088964d013c0a7ef46456ea71deb6f73c3ebb881f8", + "size": 11813 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/php/beta/memory_stores/memories/retrieve.md", - "sha256": "adf044082b62dff399533ee377675fb09ccb6cdbc0505bfd8c4b7ed8dc3fb214", - "size": 4216 + "path": "en/api/ruby/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "3cd59cbea14747a5d4e5e965fa7b54dcc271f1eedff6c926d5b9264c4afc78c6", + "size": 9949 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/php/beta/memory_stores/memories/delete.md", - "sha256": "cc38c93da1e511bab458eb52098d8aa03091b705bd5d3b0f697cc131aab825f2", - "size": 2236 + "path": "en/api/ruby/beta/memory_stores/memories/list.md", + "sha256": "e70ecabcb012924b9f4f4edb464103df1c9935cc9567843dd79954aa91125b25", + "size": 8620 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/php/beta/memory_stores/memory_versions/list.md", - "sha256": "2bf94f2038a6354cf3792a9a7d21218ac5fa259bb0847e67020645702dc556e7", - "size": 7450 + "path": "en/api/ruby/beta/memory_stores/memories/update.md", + "sha256": "9e96b9fcd061dd89bebc7dae0292d474afec7d118a8bfca73b8bd503fa0b9571", + "size": 7822 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/php/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "dc8c308ef6962b50ee2ff678f325d62db7fe165d8cc7c7985b0388b18fe6a14e", - "size": 5440 + "path": "en/api/ruby/beta/memory_stores/memories/retrieve.md", + "sha256": "f3f8c3590a6e647f27d62310c139b1bbda1aa4f5a89487cda1f1bf1bdbe7f1fa", + "size": 6618 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/php/beta/memory_stores/memory_versions/redact.md", - "sha256": "b0d65caeb996d9e554d27b5ca950267ad2bbfdee766b4f8f58083151bf8707c2", - "size": 4990 + "path": "en/api/ruby/beta/memory_stores/memories/delete.md", + "sha256": "17b9a73b0a37980893e258b69e4f4842fee14414bbc285a63955ff603a054b4d", + "size": 4480 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/php/beta/skills/versions/create.md", - "sha256": "3cfa1c0386348a809ddec2c7047f04a0edcc3992f13bac4f9330708a12c51aa1", - "size": 2850 + "path": "en/api/ruby/beta/memory_stores/memories/create.md", + "sha256": "023367c27e803b46220653416925f6eb87f1a29c843828395787055f531df27e", + "size": 7100 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/list", "status": "success", - "path": "en/api/php/beta/skills/versions/download.md", - "sha256": "b4dcb8720cede8f1b2e20eb2eae060366702324335a18f6ad517224facf24e0f", - "size": 1717 + "path": "en/api/ruby/beta/sessions/resources/list.md", + "sha256": "bf93b44708d0a1392fef98dfee4b47b1e45aa26b4510379e9e7ddf68dcf73bcf", + "size": 6469 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/update", "status": "success", - "path": "en/api/php/beta/skills/versions/list.md", - "sha256": "4bf7daa8cad8c1e543d3c4a73f28852e91744adc77361e2457e7aae371b41ec6", - "size": 2900 + "path": "en/api/ruby/beta/sessions/resources/update.md", + "sha256": "941ee2657efa1adbf26073fa6c5ae1701b5a5f23e65bc9905e32aef37499852b", + "size": 6187 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/php/beta/skills/versions/retrieve.md", - "sha256": "03603cab7e6f8a95fc3e658b613dbca5943fb8479361a951f4c4adf668c6e6a9", - "size": 2855 + "path": "en/api/ruby/beta/sessions/resources/retrieve.md", + "sha256": "12da017135bad34366bfcf1648073be80ccda46ec220e9fcc05436c618a32d46", + "size": 5966 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/delete", "status": "success", - "path": "en/api/php/beta/skills/versions/delete.md", - "sha256": "617f3150c186d0c6361ecac118117db36fbff1ee82a425b09767b43a26f3cc52", - "size": 2062 + "path": "en/api/ruby/beta/sessions/resources/delete.md", + "sha256": "0f1533b9653b82821670ce236ed50a3f92df14bbef318a3bd4fc93d2625dbdb3", + "size": 3492 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/add", "status": "success", - "path": "en/api/php/beta/sessions/threads/list.md", - "sha256": "75daea1205c95749dae96da78f0d1ee3b947a7f5c4fd9c3b1aa1eee465ff6a23", - "size": 5631 + "path": "en/api/ruby/beta/sessions/resources/add.md", + "sha256": "aceaedd692e7423d1af4ddcb06b5827161e384945879dd566ab67994de5ec9f7", + "size": 3932 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events", "status": "success", - "path": "en/api/php/beta/sessions/threads/retrieve.md", - "sha256": "19f0e30a41d2eaae94a922ee4930d2c334900c541b1142015607007969ceef3d", - "size": 4680 + "path": "en/api/ruby/beta/sessions/threads/events.md", + "sha256": "e0df956027ae424c450aae97a184295a2e972b3d74677d6d3854ce3d88bc01e7", + "size": 198859 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/list", "status": "success", - "path": "en/api/php/beta/sessions/threads/events.md", - "sha256": "530d7a34e24c9f99b9b25d3613c4bc6c6f10cd8336c8b2c011d1499efe5f6af2", - "size": 49585 + "path": "en/api/ruby/beta/sessions/threads/list.md", + "sha256": "713b8c1b8cb0ac2a9c983cf8f389b77c0164fa7283bfb4de16654ded0855acb7", + "size": 33969 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/archive", "status": "success", - "path": "en/api/php/beta/sessions/threads/archive.md", - "sha256": "3c5f955d38e69bd483bd9c9b741728ffb234b013d17675b808aff18be52302aa", - "size": 4698 + "path": "en/api/ruby/beta/sessions/threads/archive.md", + "sha256": "e87411266201a34ec0fe56fbde3ccbb7ca1ba01f82cd3e93d3f03de258c8a173", + "size": 33195 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/php/beta/sessions/resources/update.md", - "sha256": "d591af9f07f6dc66ef2d406d4996d3d0349b607adf29215b112665c80e1fce3f", - "size": 3680 + "path": "en/api/ruby/beta/sessions/threads/retrieve.md", + "sha256": "3a09d547efb0f157f84d86af9bf01e6b325a64b3a8a9924040b694b66b18e60b", + "size": 33177 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/list", "status": "success", - "path": "en/api/php/beta/sessions/resources/list.md", - "sha256": "dc6068308eafd38ae597c820094821df4bb55c95028e01fd31b65abd5f82854d", - "size": 4034 + "path": "en/api/ruby/beta/sessions/events/list.md", + "sha256": "3bb8f00dd6cf5e6e2f7a0edd8cb4a658656a02f4be83fc823d576bf8f851cf61", + "size": 100241 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/stream", "status": "success", - "path": "en/api/php/beta/sessions/resources/retrieve.md", - "sha256": "6481addabcb5049b3e0f8dcedaf834e88643a9c3561223f512e2be52f8263da6", - "size": 3455 + "path": "en/api/ruby/beta/sessions/events/stream.md", + "sha256": "c319462f01ac0f4c53a283e22c31870ee9a425a4fedcc2ecb54e96beed8255e3", + "size": 100890 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/send", "status": "success", - "path": "en/api/php/beta/sessions/resources/add.md", - "sha256": "0d94c0c85e2e75a08eba7f9f260e423f68c6d05466b3f14f8ae1143df5356c35", - "size": 2217 + "path": "en/api/ruby/beta/sessions/events/send.md", + "sha256": "2f4c520dceb0d6dff1f1649832e82a2e1282ee2ab39b2da4af631d40a4179a79", + "size": 25629 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/php/beta/sessions/resources/delete.md", - "sha256": "8276732c26b432b16e47ec09ed1dcb5ab3691794c40f52fb9179a90495e93b06", - "size": 1766 + "path": "en/api/ruby/beta/sessions/threads/events/list.md", + "sha256": "28c6dfa4060adc57cb972e2d84777e8f502c7fdd1f8764314371e5a3dbd981f9", + "size": 97914 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/php/beta/sessions/events/send.md", - "sha256": "d485d4900e6322b7ba893f057997ce0087312f44319e6e4abb1409dcdbfe41e5", - "size": 2014 + "path": "en/api/ruby/beta/sessions/threads/events/stream.md", + "sha256": "9fab6001f9e73671c7626633f963cb05fb43033a3e428686686fd8605f7ab593", + "size": 101080 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/php/beta/sessions/events/list.md", - "sha256": "5dce181ea701c6bf93fd262b2482437ee4c19d16b098cfb70c96a7db5d45d760", - "size": 25607 + "path": "en/api/ruby/beta/tunnels/certificates/list.md", + "sha256": "73ab9e76d954dd65e1e9fe25458db1b9b8216ba730ba0ac5836bc03ce5c15ce8", + "size": 4965 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/php/beta/sessions/events/stream.md", - "sha256": "2ca7b772b7f25cba70c32b7e7f32d574bbbdd2abdcf1704d01819f1aa5e3a0ad", - "size": 25376 + "path": "en/api/ruby/beta/tunnels/certificates/archive.md", + "sha256": "07fcb2a8ccd2f60a3b63b3883d73dd6b85b775d727c44cd921927eb2f00a5610", + "size": 4828 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/php/beta/sessions/threads/events/list.md", - "sha256": "06b4b28d7147897a7170c3ca2c1f0cc75e8676004ff9b2dba0d7b75ae72bddc5", - "size": 24130 + "path": "en/api/ruby/beta/tunnels/certificates/retrieve.md", + "sha256": "6210bdd9b6414a9bcce618d18d977ce3bbe3d982ba774d8515d40115e95ac4b2", + "size": 4591 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/php/beta/sessions/threads/events/stream.md", - "sha256": "f538e8d2c1b42395ab20f5a8f530a0159dcaeaf2b17378b9a8c7fde1fe083d61", - "size": 25589 + "path": "en/api/ruby/beta/tunnels/certificates/create.md", + "sha256": "059523435498b3c3808eada8ced46a6bb8d62cc30e628194399de441fe6ec46c", + "size": 4841 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/list", "status": "success", - "path": "en/api/php/beta/tunnels/certificates/create.md", - "sha256": "4a100173d84a78630e4fa6316f460ca8764fd19ab4332747e58a8e23c6397c71", - "size": 3058 + "path": "en/api/ruby/beta/skills/versions/list.md", + "sha256": "6c0d043c88828f6cfdc0e1095261f10f738973e0aa961598e872f4fd771bc929", + "size": 4550 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/php/beta/tunnels/certificates/list.md", - "sha256": "4bdc96111adfd5e8f5825cbe666abdc74a7757e72629722596949fd6b741b0e5", - "size": 3289 + "path": "en/api/ruby/beta/skills/versions/retrieve.md", + "sha256": "019148c3f1ab7f525fa3b0e3facfdab570db490d81f4f50ed634da8939981efa", + "size": 4545 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/delete", "status": "success", - "path": "en/api/php/beta/tunnels/certificates/retrieve.md", - "sha256": "a1871f3d782d8c6232d85920f44b28613926c627c5f481e5f23971c7daaea8ad", - "size": 2821 + "path": "en/api/ruby/beta/skills/versions/delete.md", + "sha256": "b0ebc38affd383b77b0a9a54ab533c496b3e335a72782f19394bdebcf22c0601", + "size": 3730 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/download", "status": "success", - "path": "en/api/php/beta/tunnels/certificates/archive.md", - "sha256": "194be18da7d6dbd9a44f5b1814e3f51c41c33c229a0064e301bd0f23479ee482", - "size": 3058 + "path": "en/api/ruby/beta/skills/versions/download.md", + "sha256": "6821db1bac4a1f3b88553d0d0036ac4049b8f9852ebc81e58aad2f24a8da5fd1", + "size": 3373 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/create", "status": "success", - "path": "en/api/php/beta/agents/versions/list.md", - "sha256": "b15106002bb47ace76e2f600698156ea43485f23310704c15ebe0e4e7d8f9573", - "size": 5166 + "path": "en/api/ruby/beta/skills/versions/create.md", + "sha256": "c4c60b7b7276ec65304883f2c3d601d4e0f67bf5bd7aa0d42e6d379af5b3587a", + "size": 4449 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/list", "status": "success", - "path": "en/api/php/beta/vaults/credentials/create.md", - "sha256": "2a6e1f2f94c66bf22479c16ba14bb6cf5f6ac16a0bb7238f0b0f8eb05e6412fb", - "size": 3207 + "path": "en/api/ruby/beta/environments/work/list.md", + "sha256": "c5cc8431557bc196d98ca142613c02b2cf7e0fd11c0473cc1b8737e40d67af7f", + "size": 5384 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/php/beta/vaults/credentials/update.md", - "sha256": "e5c0d8a5ce7d872ddfc3bff711592ec8f1340a00bdc81031bf2228285a5ed9e6", - "size": 3616 + "path": "en/api/ruby/beta/environments/work/heartbeat.md", + "sha256": "97976e8201a7ab898a04a84ee328ca0b7bd4ae5e8260d1ef60efdd4b6b7eb5e9", + "size": 4309 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/update", "status": "success", - "path": "en/api/php/beta/vaults/credentials/list.md", - "sha256": "6b7870c10422960095e3523bd21fa61f14b9b6c6637fde13996dcebc6a788dbd", - "size": 3269 + "path": "en/api/ruby/beta/environments/work/update.md", + "sha256": "0ef71280608d2ecbd9abab9dcd12ba6d94cd07e950d709425c25babc6cfcaadc", + "size": 5723 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/retrieve", "status": "success", - "path": "en/api/php/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "3b1b3fca6112665a0a32937779c0b9e4ee8a4075b813928703e549d2e9186353", - "size": 3178 + "path": "en/api/ruby/beta/environments/work/retrieve.md", + "sha256": "96aba425f1c4b3889dbcb83b001a656408bff1c9d353b90f07ccf5f5e7034e8c", + "size": 5535 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/poll", "status": "success", - "path": "en/api/php/beta/vaults/credentials/retrieve.md", - "sha256": "cc88303cd4490e5ae3c9d58bc5585c9a2000e71783ee9aeb5d043e786cdf69e3", - "size": 2750 + "path": "en/api/ruby/beta/environments/work/poll.md", + "sha256": "512d291d73052d6579090f7481324459f30b6fc6ce8646bf6b1fa1f9e85aea06", + "size": 5650 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/stop", "status": "success", - "path": "en/api/php/beta/vaults/credentials/delete.md", - "sha256": "5cf405e9fed9cc24eb4ba505e9440947b1f443fdb60a3e5b9c4703733cba6bb5", - "size": 1894 + "path": "en/api/ruby/beta/environments/work/stop.md", + "sha256": "2f6562dc8df427d46910fdab4d906125ad244e1863ce9df143c76941d0ebac7e", + "size": 5598 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/ack", "status": "success", - "path": "en/api/php/beta/vaults/credentials/archive.md", - "sha256": "25b09b5364612e77f3112ba969f8508cb8d76696174b2688d9f6b53609aebf3f", - "size": 2752 + "path": "en/api/ruby/beta/environments/work/ack.md", + "sha256": "197b5058446de4c7197e15b95f30b40ed5356e0e10897fed5a2ffee8e450e59b", + "size": 5228 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/stats", "status": "success", - "path": "en/api/php/beta/environments/work/update.md", - "sha256": "6f6c248d97652e76b2c897f22eb210f0173c5adf0b1d812d2003b9fbe67842a1", - "size": 3573 + "path": "en/api/ruby/beta/environments/work/stats.md", + "sha256": "ab24dc5fa7a96b59fc113b090c3c11bf86af95fdfedcb2ad724f29e3681d9959", + "size": 3974 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/versions/list", "status": "success", - "path": "en/api/php/beta/environments/work/list.md", - "sha256": "2de14e1592c311cc1689e9ef64e18b175bb7a2178a2919a70a14d45be82aaeb3", - "size": 3164 + "path": "en/api/ruby/beta/agents/versions/list.md", + "sha256": "6f7e4d76c8ca87b46070195e59c422ba221272278c8aeea78afd1b0ae9fb9e97", + "size": 30514 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/cancel", "status": "success", - "path": "en/api/php/beta/environments/work/stop.md", - "sha256": "0e89bfffb4fe6cb0d7a3e4290290ded92ea2f7a73804a1f6120a17836a100efb", - "size": 3474 + "path": "en/api/ruby/beta/messages/batches/cancel.md", + "sha256": "889b6fd3dd1561efa5169d6100b324e0b0702564e5591d40733a9e2c300b9006", + "size": 7131 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/list", "status": "success", - "path": "en/api/php/beta/environments/work/retrieve.md", - "sha256": "3a581532aa1a52af93b84af81bdf9e47549a7b92749efcd088856d59b0c968d7", - "size": 3356 + "path": "en/api/ruby/beta/messages/batches/list.md", + "sha256": "535c73d635f30d0185617b947abb6137e72add1651f315c708f5fd4dc688fe0a", + "size": 7217 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/php/beta/environments/work/ack.md", - "sha256": "463062dccc9c63dac028ed95e61de20ba33366e58ada16ea9ab4ed1a45503322", - "size": 2970 + "path": "en/api/ruby/beta/messages/batches/retrieve.md", + "sha256": "3dd77daebe17dc832338851c07ff48ef72580b63a87a058e7b2600f1685202e4", + "size": 6823 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/results", "status": "success", - "path": "en/api/php/beta/environments/work/stats.md", - "sha256": "50e189daafcc5be37cad8c27329693d5c8d7855f4c417f25b738ffcbf3c4929b", - "size": 2151 + "path": "en/api/ruby/beta/messages/batches/results.md", + "sha256": "b8eb17940450229273126adc26bf9a838f09891089585227e9b36fbbe7c8cd01", + "size": 148325 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/delete", "status": "success", - "path": "en/api/php/beta/environments/work/heartbeat.md", - "sha256": "a1f1482f8e1691617ef1a153ac0ff66a4bebb3b7672a8365b2ab1eddd358d69d", - "size": 2525 + "path": "en/api/ruby/beta/messages/batches/delete.md", + "sha256": "e106b4b8b37bdfc942f3b44c24b86d6392a874c9a0c30f65697393664a7e0253", + "size": 3694 }, { - "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/create", "status": "success", - "path": "en/api/php/beta/environments/work/poll.md", - "sha256": "d34dd88380b48cc0987f4991b6072b51d17ea823e27784959b53142fa4f982b5", - "size": 3504 + "path": "en/api/ruby/beta/messages/batches/create.md", + "sha256": "3f7fd32cd01564811db1d16b1c2b302f5528b6cb7183329823ec671c8e628599", + "size": 165114 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/list", "status": "success", - "path": "en/api/csharp/beta/sessions.md", - "sha256": "16c8a7a755ece87f7ff1dcd276e0dc98576bcda0d2b8065d5c8a6477d4372f72", - "size": 1209227 + "path": "en/api/ruby/beta/vaults/credentials/list.md", + "sha256": "03a3d3b5c0137b8aa4805e2382cabd7902d4b29423693f5af8eaa7e4c2e446a1", + "size": 8508 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/csharp/beta/webhooks.md", - "sha256": "fae41b78ecb934e38c33fbd98e8dc9249370dac743d07b87ce48260dc5274031", - "size": 41445 + "path": "en/api/ruby/beta/vaults/credentials/archive.md", + "sha256": "47b4d8ab16f048b0f5bdf6fef9ef1ea66dba68b75d5a1b01947d585116d3d3c8", + "size": 8093 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/update", "status": "success", - "path": "en/api/csharp/beta/skills.md", - "sha256": "6bdfc3e9da6320ced64155b305e184ceeb59dbfe5082859fd13676938e472e4e", - "size": 55544 + "path": "en/api/ruby/beta/vaults/credentials/update.md", + "sha256": "bd3c0c957efbb1b92c5f0fdef22e5d31d39c96f293a71ac63a7433e685607160", + "size": 12699 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/csharp/beta/agents.md", - "sha256": "86c1f368d97eab55118bf7d5d1cce0355937bbd272cb5b91ea3eb9e81a59a39e", - "size": 456147 + "path": "en/api/ruby/beta/vaults/credentials/retrieve.md", + "sha256": "ea40e519e35c5117b3d92ab28ea6af13329bc4ed89d172f6f1b704c6326d217e", + "size": 8091 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/csharp/beta/deployments.md", - "sha256": "4e78938ac00ce96c4beb17f776221791a5acba8c8539198f3703e99f24d5e06c", - "size": 226348 + "path": "en/api/ruby/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "e4b026f29f825fd9aef4234cac6f2b4d82d8e690e50f551edfc532c8a6220c82", + "size": 6898 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/csharp/beta/deployment_runs.md", - "sha256": "3a62f8846d2e97457f31850aaacb22fd19d3bfefae6aa63218b536de378023b1", - "size": 34310 + "path": "en/api/ruby/beta/vaults/credentials/delete.md", + "sha256": "da1a680bd0f06d6807a6ed113b7b82c55d560aee69a48dd3cfefb1ae12c3248c", + "size": 3623 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/create", "status": "success", - "path": "en/api/csharp/beta/user_profiles.md", - "sha256": "34f161d039d5b79d391b29b359c8bb20b1a26c62b0b32c89b46153962cac21c5", - "size": 72291 + "path": "en/api/ruby/beta/vaults/credentials/create.md", + "sha256": "3f73f7927bb106b76d4772a751a047164ae8c6f9aaac67d5e33d312588af1832", + "size": 13151 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/models", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/cancel", "status": "success", - "path": "en/api/csharp/beta/models.md", - "sha256": "01b2a3bb46b48ad2999bd06d9b5a8fff2f728939425c598484be49533dc24ae2", - "size": 48379 + "path": "en/api/ruby/messages/batches/cancel.md", + "sha256": "f6f4be4ef805eb638926a719b3c415628bb091dd3b43185bd198333750838383", + "size": 5030 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/list", "status": "success", - "path": "en/api/csharp/beta/vaults.md", - "sha256": "5bc5b4fb968c58b920df81d8d89e5ecfb6162ade1ffee1beb20089306d015b54", - "size": 104221 + "path": "en/api/ruby/messages/batches/list.md", + "sha256": "4d1de6dacf278bd9f8d34bb025d16f4685371ace5771829ada90396e26dd31e4", + "size": 5126 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/retrieve", "status": "success", - "path": "en/api/csharp/beta/memory_stores.md", - "sha256": "995163d8e7951c22d6cb6491682cb1aa2a6dfc74e97778a8514da310b2ddab80", - "size": 119588 + "path": "en/api/ruby/messages/batches/retrieve.md", + "sha256": "f78e3197b9660b1e95750de381ef235dc8ab5e4a59b82edff64b159bb2d0700a", + "size": 4722 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/results", "status": "success", - "path": "en/api/csharp/beta/tunnels.md", - "sha256": "6a3234c685113bd70dcdf8236c8553ff4d3e6a7ed21ad6a0dcad31cc607dcb8b", - "size": 60952 + "path": "en/api/ruby/messages/batches/results.md", + "sha256": "d7228969287054ea5eee9b8d04ab5506f9f7e2d5d28ddf4ae5b34a7325e11893", + "size": 35751 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/delete", "status": "success", - "path": "en/api/csharp/beta/environments.md", - "sha256": "c98bebefbca76d24ee2538304ee5850e7a3ba2bd95f8ecf56246ba0877326f55", - "size": 116969 + "path": "en/api/ruby/messages/batches/delete.md", + "sha256": "9b9980d90ddc834c06d4e25e83b4ea1ea0864befb1136082c9a30d362cedbe45", + "size": 1597 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files", + "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/create", "status": "success", - "path": "en/api/csharp/beta/files.md", - "sha256": "e80ed9616149bcb82ec5be67286eac4dbb5501c8a9d795971e1e77d67aa7630e", - "size": 29995 + "path": "en/api/ruby/messages/batches/create.md", + "sha256": "e4447c3bb5659d881df539d87a673c5d66be164f77b98056c37f0609f1da36c1", + "size": 107452 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages", + "url": "https://platform.claude.com/docs/en/api/go/messages/count_tokens", "status": "success", - "path": "en/api/csharp/beta/messages.md", - "sha256": "546a98791e7c2a05d9e87738f9e6efc86faba6410339c6a7dbe0f2cb9e41753f", - "size": 2895422 + "path": "en/api/go/messages/count_tokens.md", + "sha256": "aa72785efbcb407a9fd665cb59c154f605620a1abe8fd6f9457e277f14f73a76", + "size": 102009 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/models/list", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches", "status": "success", - "path": "en/api/csharp/models/list.md", - "sha256": "da0897a68831ee7658aef4b90e7c35a99d8e37a3e3c245f4506326cac01a3415", - "size": 14726 + "path": "en/api/go/messages/batches.md", + "sha256": "843abf4e23d0bb459bf655738808b361bb2f9b891af372bee21545f733d9cd70", + "size": 314143 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/messages/create", "status": "success", - "path": "en/api/csharp/models/retrieve.md", - "sha256": "29f014286ff068f26c0e7703b7b82ef25d254608d8c40aa2011ee7bd45c15752", - "size": 13424 + "path": "en/api/go/messages/create.md", + "sha256": "0c991fec5ebbc17bbed386a936639866a00083f9782f2b8975118bf3d9feac57", + "size": 147919 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/completions/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults", "status": "success", - "path": "en/api/csharp/completions/create.md", - "sha256": "82d0bfc05ea5550b68db168de9460263db209f9fc9f316561c19252c0ea84c9e", - "size": 13301 + "path": "en/api/go/beta/vaults.md", + "sha256": "42f16c012095cb8eca06e1f68f06838c0c67fb52c2e7bd24d6b6801747464573", + "size": 131975 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs", "status": "success", - "path": "en/api/csharp/messages/create.md", - "sha256": "1717473feeeb9bdaf398688894b10c3a6d1fb4bfaad80ca74d3e2c36c015a92e", - "size": 132591 + "path": "en/api/go/beta/deployment_runs.md", + "sha256": "d3a8edc81a60afa0213f9a7d8099ee191901030ab92c03fac6ccd26ebe01dd5f", + "size": 40126 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/go/beta/webhooks", "status": "success", - "path": "en/api/csharp/messages/count_tokens.md", - "sha256": "b060690e7ad61640aa21b08d81b87b8669eeecc50c40088733d8863527e638e7", - "size": 91087 + "path": "en/api/go/beta/webhooks.md", + "sha256": "5b988bdf08ee34bb9ccf18329e24224d196c9666c4662c1d30f208b73465e55c", + "size": 34918 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches", + "url": "https://platform.claude.com/docs/en/api/go/beta/models", "status": "success", - "path": "en/api/csharp/messages/batches.md", - "sha256": "560469408c5db9433d76f74b4b3008e56e5bf368a3389aef8c80c1c34b844d62", - "size": 285144 + "path": "en/api/go/beta/models.md", + "sha256": "a72a08a75790e72abe3f8279c5bee0e39354ebbf9f682df02a7d3d194d4bc1a7", + "size": 51843 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills", "status": "success", - "path": "en/api/csharp/messages/batches/create.md", - "sha256": "1b0a623f8ad88c562346ecc116ba426970ec92f8331651ef51eae10928a0b485", - "size": 118449 + "path": "en/api/go/beta/skills.md", + "sha256": "9271e3c1377b417d4479afb75c82b0e73dd22e532d1f903cabceed805a83ec69", + "size": 73876 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores", "status": "success", - "path": "en/api/csharp/messages/batches/list.md", - "sha256": "191ef019a3925f84b277d5bee45db43f6cac25e7d2f8450da52de2b4a99ba22a", - "size": 5459 + "path": "en/api/go/beta/memory_stores.md", + "sha256": "66e5a690d5725360aa35c7b28fa624944bc3f58f9f583ed9aa06cd38f48432af", + "size": 147520 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages", "status": "success", - "path": "en/api/csharp/messages/batches/cancel.md", - "sha256": "de5f009da45b697a43dfd4cd625adc99cae3128e58e61dbbe7e718f5c40bfd52", - "size": 5323 + "path": "en/api/go/beta/messages.md", + "sha256": "5faf350ee670fa8f9941db99b00758a060d2236ef25f192b4f73337b1ade98a8", + "size": 3237694 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents", "status": "success", - "path": "en/api/csharp/messages/batches/retrieve.md", - "sha256": "584887ff149dba037b40545ab5cf6178c800c6b5e4dba3395f9e8fb39ee61f9f", - "size": 5019 + "path": "en/api/go/beta/agents.md", + "sha256": "c5185fb85e36c81bb14661e9d367ebca249f7d0813f05f5cd05298a2047bd993", + "size": 483295 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions", "status": "success", - "path": "en/api/csharp/messages/batches/results.md", - "sha256": "9a1e2825acaf13564af0da68715d12d79c25acc82e90754de3049a8c29a9f543", - "size": 38680 + "path": "en/api/go/beta/sessions.md", + "sha256": "205646698cb5654f45b6372043c3e559879578355a7a59c2b6d297b13892d0df", + "size": 1283663 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles", "status": "success", - "path": "en/api/csharp/messages/batches/delete.md", - "sha256": "6f0b992dd2c2946d0adf772e502637f0e37255d2c6683544f94e66cf8d32d200", - "size": 1739 + "path": "en/api/go/beta/user_profiles.md", + "sha256": "d35e2dc0f9ca98985fb5bc0eb9070f115548de8278b1c6ee87d795436e54109a", + "size": 93482 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/files", "status": "success", - "path": "en/api/csharp/beta/environments/create.md", - "sha256": "23d4740eed0a4aeb245dc14d90e6cd5f71ad9ca842a6de39de86c4ccf7e31e17", - "size": 11346 + "path": "en/api/go/beta/files.md", + "sha256": "dd7b3b0823ec0c1ddd63ead1e2ee672777dcaf974c8fb5d8ce1da8c7d6e2e65d", + "size": 39803 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments", "status": "success", - "path": "en/api/csharp/beta/environments/update.md", - "sha256": "e8a1f6babf5a7ccdebbadad6e93a219746a44e6ad2c97dbabf2cb456cc3a7a52", - "size": 11436 + "path": "en/api/go/beta/deployments.md", + "sha256": "105348968d6c36e9ca17e7c265c98886ad5e4375d20df5beb9ed30efa3c0f89d", + "size": 262856 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels", "status": "success", - "path": "en/api/csharp/beta/environments/list.md", - "sha256": "1c36e667da7840c0226cc15e6ba57ecad6c915eb562dda968dfe5dcb8450b039", - "size": 8914 + "path": "en/api/go/beta/tunnels.md", + "sha256": "08f31889d17586ac011bccbb7a90073c549dc22df79df58c2a6ed77c5c878799", + "size": 79807 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments", "status": "success", - "path": "en/api/csharp/beta/environments/retrieve.md", - "sha256": "8475e23968eab89462bffd06ac9c59573c3bf08ffe7101541cf213eef18791b9", - "size": 8410 + "path": "en/api/go/beta/environments.md", + "sha256": "b10e086e1ace0c3aa65402f61a34a1257a25eb7b8530347f797cc3b15d821468", + "size": 145521 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/go/models/list", "status": "success", - "path": "en/api/csharp/beta/environments/delete.md", - "sha256": "b044924905677babaad6d7e9ac373fcab58e5d11926e3a75d79379db79841af9", - "size": 4895 + "path": "en/api/go/models/list.md", + "sha256": "491aff5cd0c8b3bba1ece323600bbadb27e611c2698c5bde524a25d11dedc872", + "size": 16777 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/go/models/retrieve", "status": "success", - "path": "en/api/csharp/beta/environments/work.md", - "sha256": "8fbc3d5750f8c826624f0dee4f6288c4c85a05d51ce978d6e24f01607cbc1edb", - "size": 60092 + "path": "en/api/go/models/retrieve.md", + "sha256": "ee02a750907e1a5494cc8001ad657a01c8547a13c1cf505abd1f0f1cacae30c1", + "size": 15276 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/go/completions/create", "status": "success", - "path": "en/api/csharp/beta/environments/archive.md", - "sha256": "5a392d849090bf1a566f3079337bad0a555486ffcf061c7b55460e590e3ff051", - "size": 8474 + "path": "en/api/go/completions/create.md", + "sha256": "c450725666bb03e3fee92dc4f31e99bf54af25745a3c21dd38e293b7e3d64179", + "size": 14387 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/list", "status": "success", - "path": "en/api/csharp/beta/deployment_runs/list.md", - "sha256": "3355411fc6dd06142d31e7e5401004ab8e84659b1e7a24e67cc6b6885d69ddb5", - "size": 11940 + "path": "en/api/go/beta/vaults/list.md", + "sha256": "de8faf0583b40ca46429638bacc8e0cfb5809b2c5e5e58df6c9f7c9d56c760f6", + "size": 7892 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/archive", "status": "success", - "path": "en/api/csharp/beta/deployment_runs/retrieve.md", - "sha256": "83927fda9a9c928b2c85d17c268f32b93f3b351b06d9b0fd1f8b2ce3e7bae6ba", - "size": 10703 + "path": "en/api/go/beta/vaults/archive.md", + "sha256": "035b28e99fe8b134b831d4c07a1a93b0639411f42b20e5d3b849cfa192ef4341", + "size": 7425 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/update", "status": "success", - "path": "en/api/csharp/beta/vaults/create.md", - "sha256": "7c852115e9824488e6cf89d54763ff75913fe226ead1c93b477db885834381bb", - "size": 5704 + "path": "en/api/go/beta/vaults/update.md", + "sha256": "30b2e7623ed78f08584291ff82fa119367352d8bdddaff9929521f4cde220638", + "size": 7713 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/retrieve", "status": "success", - "path": "en/api/csharp/beta/vaults/update.md", - "sha256": "83251d6ce1449a3c26fd8863eaf6cb512f50f5d4b680f4c11dec0b856934180b", - "size": 5815 + "path": "en/api/go/beta/vaults/retrieve.md", + "sha256": "4fe6b0243bb5d4ea1dd616c0fb4e48b67047259e3d9901ad946e83eeb1ca86e3", + "size": 7407 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/delete", "status": "success", - "path": "en/api/csharp/beta/vaults/list.md", - "sha256": "59cca73c7c1fb06382f990a93392b6523eff31788154ebaa023dc264277fabe6", - "size": 5969 + "path": "en/api/go/beta/vaults/delete.md", + "sha256": "c75acca5d0d98190466ae0f1c632e7f7191d6426d2f5ce59e2bc649253faa452", + "size": 6813 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/create", "status": "success", - "path": "en/api/csharp/beta/vaults/retrieve.md", - "sha256": "66c799ec3a02f786024788bec2f01cbf3473e0f1200f8aae2d0fa381ea633871", - "size": 5542 + "path": "en/api/go/beta/vaults/create.md", + "sha256": "7eca182f3489e73e324c2266115adc34285e42f38fc5096c26df48e23bab201e", + "size": 7574 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials.md", - "sha256": "c326940b027fe07f5bd7d73b39dcad387e6dd1bfe11c7290d65dabe058d515d4", - "size": 103661 + "path": "en/api/go/beta/vaults/credentials.md", + "sha256": "d1d50a56460bec1aead5d655b0c2bbcf932b7d4168ac602d39902266b8e108d4", + "size": 123176 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/count_tokens", "status": "success", - "path": "en/api/csharp/beta/vaults/delete.md", - "sha256": "c839b96a492b50b14ca28cca67dcc765cb210b180e1b76d601e0d9be7181d669", - "size": 4831 + "path": "en/api/go/beta/messages/count_tokens.md", + "sha256": "8b137b9eb4b29e455201edc12f6d9dcb8d403c21393773e863e4af0a2238ef60", + "size": 157951 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches", "status": "success", - "path": "en/api/csharp/beta/vaults/archive.md", - "sha256": "12acdc59e7ad131a160d31a28b84de177dc83c33f35e0beacc98966f310b7ea3", - "size": 5542 + "path": "en/api/go/beta/messages/batches.md", + "sha256": "d34f259aab75827c096a7849178cd3cccfa13e56e86148ad4d51239a4f086bff", + "size": 902013 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/create", "status": "success", - "path": "en/api/csharp/beta/user_profiles/create.md", - "sha256": "bc21c92803368f897354b4622b196878636cae942cb1b66d301b67f6863f5e00", - "size": 12555 + "path": "en/api/go/beta/messages/create.md", + "sha256": "c12118b87b7aa570943598e519ad1afe3e88c46d3424d18d5ba83dbbc1f3a52c", + "size": 332033 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs/list", "status": "success", - "path": "en/api/csharp/beta/user_profiles/update.md", - "sha256": "59d065ba5a61548b9e1f703fc06c6a2fd3146189d8185bb192098da5683bfa4b", - "size": 12421 + "path": "en/api/go/beta/deployment_runs/list.md", + "sha256": "882e67ad04b6ea66d70428c5c530dbfd6322065ad3e69046450974c5e0d96983", + "size": 14416 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/csharp/beta/user_profiles/list.md", - "sha256": "d8f93d2fd2dd62a6d817547eb1067c469dd91d52745d30fbe227e82d70e90d39", - "size": 11480 + "path": "en/api/go/beta/deployment_runs/retrieve.md", + "sha256": "aa223f554c46d788e50e8c55679bdbbeeca514805ec2ee16347dcba2ec6b7172", + "size": 13048 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/list", "status": "success", - "path": "en/api/csharp/beta/user_profiles/create_enrollment_url.md", - "sha256": "baa4e03d6f59af9299438eaa729cb94e4b46ab0ec02cee38547ba4b73020915e", - "size": 5343 + "path": "en/api/go/beta/agents/list.md", + "sha256": "ed604ca07b5fcab2d91421b4b7658fe428377a48dca7b8cf06aceda30f6b27a0", + "size": 35221 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/archive", "status": "success", - "path": "en/api/csharp/beta/user_profiles/retrieve.md", - "sha256": "76fe8dba7bebed4f7c4a655a5f09a6eed7fd65b1bebafd756a267518cd59d106", - "size": 10377 + "path": "en/api/go/beta/agents/archive.md", + "sha256": "4dcb8c52f2a826d727f558230055986a94f1b18fbacaf9cd4bc99c3b7a477c36", + "size": 34317 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/update", "status": "success", - "path": "en/api/csharp/beta/agents/create.md", - "sha256": "2f72750d1a418b5dd05163fc0b3852bcf0214380ccfcfe271fde3445a7d699b3", - "size": 61856 + "path": "en/api/go/beta/agents/update.md", + "sha256": "e69c109c3cf2de11afdcc00ebb7046c05a25347730eb32aab27354a38a9c5a1c", + "size": 66164 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/retrieve", "status": "success", - "path": "en/api/csharp/beta/agents/update.md", - "sha256": "49a81f870fe267aa40aa75e34395ab4525639327d66e936ffc7739c70d21dd7f", - "size": 62722 + "path": "en/api/go/beta/agents/retrieve.md", + "sha256": "e64b5164416019d20f9822b3a1ec3889e4fedaedcc03048af65a88d83ec3c320", + "size": 34451 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/versions", "status": "success", - "path": "en/api/csharp/beta/agents/list.md", - "sha256": "f8fec189a3d228ec47ae4a1852791e216f801656f11a9dcf70ee006dad5d0b8c", - "size": 32613 + "path": "en/api/go/beta/agents/versions.md", + "sha256": "138feb2b0760b060f32aacb9b8bef667346ce67c094e5d094ab1588fa84c01b6", + "size": 34983 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/create", "status": "success", - "path": "en/api/csharp/beta/agents/retrieve.md", - "sha256": "fd999c50548e7a6d6ef6a23f3ec1a2760b47d343ccede13e0aec30e561c1e856", - "size": 31901 + "path": "en/api/go/beta/agents/create.md", + "sha256": "2ad9144ddc1723b340473992fd8379d1759b36545690e2ba4a6d923997cf850b", + "size": 65240 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/list", "status": "success", - "path": "en/api/csharp/beta/agents/versions.md", - "sha256": "d69717215a57d0e8dffde2062c07dd0efd79cc1ba71f6167ec1462f5d43e16d4", - "size": 32427 + "path": "en/api/go/beta/environments/list.md", + "sha256": "a3c32db64cac6f207b4a98e54fae806bddbab2257b4e8043405b8243b110a3c8", + "size": 10779 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/archive", "status": "success", - "path": "en/api/csharp/beta/agents/archive.md", - "sha256": "d5f7b3bfac5597fd484f857a2f310f6ba47fba9d5734476d74b6d5cce760ea51", - "size": 31773 + "path": "en/api/go/beta/environments/archive.md", + "sha256": "0acf843a086bbdfd678e10ce1d1596ae4be67edb375b422f6be6463f0385fdd2", + "size": 10312 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work", "status": "success", - "path": "en/api/csharp/beta/models/list.md", - "sha256": "f5be33c94110911b82d94021914e31e0bdd6988dfbe11c2aae1ca6bb36cf7852", - "size": 15478 + "path": "en/api/go/beta/environments/work.md", + "sha256": "7bd9e6bcda89b1b8166e457400d1c8636157b5da6aeec60fff67620298b03aea", + "size": 78023 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/update", "status": "success", - "path": "en/api/csharp/beta/models/retrieve.md", - "sha256": "222410e0da07705fc47d2eddd553e6f3ae3b153828de2fc2b1b199ca0293f47e", - "size": 14152 + "path": "en/api/go/beta/environments/update.md", + "sha256": "240aae6a2717cb303dd95a80522d3a09e0647ee953c1e0a87935080406606bcf", + "size": 13538 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/retrieve", "status": "success", - "path": "en/api/csharp/beta/tunnels/create.md", - "sha256": "aa9f0fc9891ac2fa199b3c8749847c93c9b92bcc5df9214f94e55957f8b32bd0", - "size": 5923 + "path": "en/api/go/beta/environments/retrieve.md", + "sha256": "7138191dda6b4df9aaf324d9dd8d7534051aa1d4108d999e72c223f2ba4b678e", + "size": 10230 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/delete", "status": "success", - "path": "en/api/csharp/beta/tunnels/rotate_token.md", - "sha256": "098728ed3523207c5d66b0d76370a09e45e2bd5ca44b20c719390526c529d33e", - "size": 5543 + "path": "en/api/go/beta/environments/delete.md", + "sha256": "1ba0cc12486127f6f79eb33ec44fc7ba25f2f8c8d4711195779e7c60142b6904", + "size": 6907 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/create", "status": "success", - "path": "en/api/csharp/beta/tunnels/list.md", - "sha256": "7e9204b9f2e572149f8782e6c145c1d68cce32fa154cd1268c8318e134ab3077", - "size": 6215 + "path": "en/api/go/beta/environments/create.md", + "sha256": "9e1a2489a6ae321aa52d228f2c8f491177369febaad109d474b4297a39f95fb0", + "size": 13399 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/go/beta/models/list", "status": "success", - "path": "en/api/csharp/beta/tunnels/certificates.md", - "sha256": "a7f7e266b0f4e69fe973edaada8142e79bd987aea722a7165775c2970aa1ca72", - "size": 26362 + "path": "en/api/go/beta/models/list.md", + "sha256": "78bb76ab123c1e75a9e6730d0670542802ebfadcac9daf33e5da90cd64eb9895", + "size": 17577 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/models/retrieve", "status": "success", - "path": "en/api/csharp/beta/tunnels/retrieve.md", - "sha256": "99025b8014f173fdf68a8cac19e7b7a702e73d584ef3b20d3933ae4fbcb7414e", - "size": 5761 + "path": "en/api/go/beta/models/retrieve.md", + "sha256": "dec7ef68c6b738ef752bdd37cb41f8bf1d90cc8cff78418a6006ca17183f66ac", + "size": 16024 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/list", "status": "success", - "path": "en/api/csharp/beta/tunnels/reveal_token.md", - "sha256": "257e99eb64100f78937492109a57f231edd0ce27944270a3eddc3d4bd37f66fd", - "size": 5451 + "path": "en/api/go/beta/user_profiles/list.md", + "sha256": "efdfa8b7e6e10268c963095d91cdeed1c50d40e45ae095fe3a90ed2807993c9c", + "size": 14762 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/update", "status": "success", - "path": "en/api/csharp/beta/tunnels/archive.md", - "sha256": "7a86bf4abc6d6902fa99a7d5c9ed0f312341d3fcb78074154f70967f8f64f681", - "size": 6042 + "path": "en/api/go/beta/user_profiles/update.md", + "sha256": "69f836df36b244e06d80460faac4db3528de8c37a8dcd76c0acc31425f490f82", + "size": 15597 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/csharp/beta/sessions/create.md", - "sha256": "b9f740ad1d395ed5e0363dee08f341559ea6424ad09d24dfeadd5de296f63ea4", - "size": 88036 + "path": "en/api/go/beta/user_profiles/retrieve.md", + "sha256": "c48bce501c19748c94bd25b02eb37ea64c936b322edba54409c7f0eed9ffa087", + "size": 13282 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/csharp/beta/sessions/resources.md", - "sha256": "4aaa3727e4cb5b9e6a2d3fd1bd526d4f57676bc8ac5eb184fd97474a00f6be59", - "size": 39038 + "path": "en/api/go/beta/user_profiles/create_enrollment_url.md", + "sha256": "75fcbca946eddfb42ed56f7d2a655d59e36f978e8a9fe6a89600b2bcafc57a17", + "size": 7294 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/user_profiles/create", "status": "success", - "path": "en/api/csharp/beta/sessions/update.md", - "sha256": "f4f85e2bb05b0dbc83415dfa9174551c8ef47bab4c4b059dc3037e338dcf0e76", - "size": 49015 + "path": "en/api/go/beta/user_profiles/create.md", + "sha256": "539547317b2d75999fbe4dd59abffdbbde65fa4068a53b81faf1a53e3c09b0f7", + "size": 15716 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/list", "status": "success", - "path": "en/api/csharp/beta/sessions/list.md", - "sha256": "955e002bcb615e44cffaae16e70862f3bcf14d770221f1e58c0996328b07dad8", - "size": 50500 + "path": "en/api/go/beta/skills/list.md", + "sha256": "82a2519f44c0b1cbfa9ea07216f12c473944b70ed5fc1e016fa85dfa4fd8113a", + "size": 9164 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/retrieve", "status": "success", - "path": "en/api/csharp/beta/sessions/threads.md", - "sha256": "6279e550258e07af8863179ba902fb6429dcf98ad39a737b6ed7b8ee1cb7f2b9", - "size": 453590 + "path": "en/api/go/beta/skills/retrieve.md", + "sha256": "c178b950ca190d4361ad4752921c2df0763bbff01684415ee205f317ff3536f6", + "size": 8563 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/delete", "status": "success", - "path": "en/api/csharp/beta/sessions/retrieve.md", - "sha256": "e5656f431c4b52a21a3fe386b12da67be477b2cf09bbba65adbec97ff9da8e63", - "size": 47707 + "path": "en/api/go/beta/skills/delete.md", + "sha256": "e615c1277d154a250810f2b8a17337aac2d0e68f93b53309041dd3d21cf17e3a", + "size": 6848 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions", "status": "success", - "path": "en/api/csharp/beta/sessions/events.md", - "sha256": "96194b0a99fbaac3ff54422beb04cc64ec7ffce62b341fe30cd195b103b8fffc", - "size": 578125 + "path": "en/api/go/beta/skills/versions.md", + "sha256": "b066b1571452517c27816d37c94abe3d70d04c5144896141292e9c7894a5dc48", + "size": 39234 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/create", "status": "success", - "path": "en/api/csharp/beta/sessions/delete.md", - "sha256": "dd1317a2ef30e3a56dd1ea565d48af61e5c15464f149500ec5bbd668a8622d63", - "size": 4790 + "path": "en/api/go/beta/skills/create.md", + "sha256": "829d7e6fae88fbb7bba809d976c2fc9a7f9298e14477517c8b95650c33659e29", + "size": 8899 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/list", "status": "success", - "path": "en/api/csharp/beta/sessions/archive.md", - "sha256": "3506821ef136b88442d48ce03020d80a43b1a5759cb09fb5c0266fa819e1d474", - "size": 47723 + "path": "en/api/go/beta/tunnels/list.md", + "sha256": "673932031fe21cb2836d489e26c67ca6c48d6a4711ef35bf4bb64b33fa5ad4b7", + "size": 8133 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/archive", "status": "success", - "path": "en/api/csharp/beta/deployments/unpause.md", - "sha256": "b739b5c3ef6f6708a51b7a9ac87cb95c86527c2773957eadb6100ed7aa1bcbee", - "size": 20652 + "path": "en/api/go/beta/tunnels/archive.md", + "sha256": "0b57b3589af6d4a1f2c9c1318a6e788f8afddd1b35c13075b147c5b409e3f475", + "size": 7933 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates", "status": "success", - "path": "en/api/csharp/beta/deployments/create.md", - "sha256": "40e5abee87c266ccda9c85112cfbf42543648f990ecfdcb1116d59dbe0c67823", - "size": 30940 + "path": "en/api/go/beta/tunnels/certificates.md", + "sha256": "7fa6465fa1733a35f468e236936f95df44350728d1cc20c910109d86e9416ddd", + "size": 33717 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/retrieve", "status": "success", - "path": "en/api/csharp/beta/deployments/update.md", - "sha256": "ad5dd30ec2c26aeb1a24bc053993cca302d54893a7466d882a225c2326a98e46", - "size": 30590 + "path": "en/api/go/beta/tunnels/retrieve.md", + "sha256": "f0c76587ca03657967941fa908964fc7ece3b9fd3d894024cec804a1198b3614", + "size": 7634 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/csharp/beta/deployments/list.md", - "sha256": "38a9613fd9d50e0636c8522ce7012f6387307d2e473814975b5947bb8536d900", - "size": 21638 + "path": "en/api/go/beta/tunnels/rotate_token.md", + "sha256": "6a53b13d10d8b948cb21b70d68494970724a9b1e228d14bf23ab057da9b86cf9", + "size": 7505 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/csharp/beta/deployments/retrieve.md", - "sha256": "51809e3d8064ee4dd414f7e4956133b5186bb4042435fb1dcd69d499aed85ce5", - "size": 20625 + "path": "en/api/go/beta/tunnels/reveal_token.md", + "sha256": "1f304285c4378d2d4044bbe1197aa37bbdf05cea04904b6ed76ebdd4d5eb11fd", + "size": 7390 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/create", "status": "success", - "path": "en/api/csharp/beta/deployments/run.md", - "sha256": "88e8f8b55d7d83c61ddc7681d9234cc7469246c0fe1c5f0eeff71cd0a1a3b5e0", - "size": 10665 + "path": "en/api/go/beta/tunnels/create.md", + "sha256": "766b65268ddf5a11dcea0b1547909e75650fe07dc16064316b731b38cf8fd320", + "size": 7832 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/go/beta/files/list", "status": "success", - "path": "en/api/csharp/beta/deployments/pause.md", - "sha256": "90ba68d0070642deb0b730da0116164d482fdc8303fb33bad2728afa0e4771fb", - "size": 20632 + "path": "en/api/go/beta/files/list.md", + "sha256": "db52d7b4db21445f417a3c42d0b50a15defaea82aa9a6650f95b25558ffa607c", + "size": 8827 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/csharp/beta/deployments/archive.md", - "sha256": "b55810b63972f07032316ffe7dbb35213b584aa261b21aaba08a1216f57f6ebb", - "size": 20652 + "path": "en/api/go/beta/files/retrieve_metadata.md", + "sha256": "3d82d15c396827cd1cd014601ae7436d51004d5cd5697b32acd257baea747fee", + "size": 8031 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/files/upload", "status": "success", - "path": "en/api/csharp/beta/skills/create.md", - "sha256": "44f1db8d55748087d1218005eed8239add7ee17f78620a86575cf82055d4365f", - "size": 6812 + "path": "en/api/go/beta/files/upload.md", + "sha256": "e03c14672bcb4c95542c6f637dd723a81deb5c44007dd58652807575d34ffeb3", + "size": 8459 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/files/delete", "status": "success", - "path": "en/api/csharp/beta/skills/list.md", - "sha256": "e2b7ab8f6e1fe77d398b95145db83fca11b10402d41d43c8908ac1c30c52ae03", - "size": 7045 + "path": "en/api/go/beta/files/delete.md", + "sha256": "7bd50a4c19db511714546f1892afd8b269cabd0c4b09f63de0cba8976f07f50d", + "size": 6712 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/files/download", "status": "success", - "path": "en/api/csharp/beta/skills/retrieve.md", - "sha256": "55c85f93fc314c3a2d9c70a65c3ea90fdb863607d3794825f3e7c67e7578841a", - "size": 6488 + "path": "en/api/go/beta/files/download.md", + "sha256": "b799b5875b3d602fa930063a75312312e9ba67b752be0c60ad20ab35e0571307", + "size": 6435 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/unpause", "status": "success", - "path": "en/api/csharp/beta/skills/versions.md", - "sha256": "ceb40c98784228827b96616f376229e80a6f26f9930dff277bb2c035cca9ec26", - "size": 29521 + "path": "en/api/go/beta/deployments/unpause.md", + "sha256": "955cc2e6f00b4d5fb5b4c914cacc6e14be73c45de762d4d62d2ed7583516b034", + "size": 24213 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/list", "status": "success", - "path": "en/api/csharp/beta/skills/delete.md", - "sha256": "db9b66061bf132b92d474bc069f0c1b5735b303e21be3072870b4101fa2d355e", - "size": 4873 + "path": "en/api/go/beta/deployments/list.md", + "sha256": "cdd89b361eef1a5d3f76f468ca9ed59b0413c08ca19a46f2dae2ee676267a413", + "size": 25292 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/archive", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memory_versions.md", - "sha256": "6d11ec82fe20c2176f7672d08257c2efb95e2dcc7537437ac6e482a51dcf72b1", - "size": 44296 + "path": "en/api/go/beta/deployments/archive.md", + "sha256": "95a0ade5cc1040e46723dfc0e5d685d98616b57aa5b993952a4a31e58b233a8f", + "size": 24213 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/update", "status": "success", - "path": "en/api/csharp/beta/memory_stores/create.md", - "sha256": "649904b6ff8a7af8d1bcb2ae65691882c2f1c1c3cf43535013cf87bea7e5a204", - "size": 7932 + "path": "en/api/go/beta/deployments/update.md", + "sha256": "c268656bbe1c29ec35aa03f5e4a16e1226f688f6051d9a298bd374c5871b4e83", + "size": 35184 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/retrieve", "status": "success", - "path": "en/api/csharp/beta/memory_stores/update.md", - "sha256": "86c72cbb003925a81cf3ef4c168e49baf069a276eb903348aea56a64577bc7b8", - "size": 7757 + "path": "en/api/go/beta/deployments/retrieve.md", + "sha256": "f3f2755cdeee6ceb931add3425f15e69d8d7ff3e8a3253c63f5a0ba8bb0c7d9d", + "size": 24168 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/run", "status": "success", - "path": "en/api/csharp/beta/memory_stores/list.md", - "sha256": "14288e39a68cccc35c891ab527aa828a653c748848a50fac6eabdcd84ad2106d", - "size": 7634 + "path": "en/api/go/beta/deployments/run.md", + "sha256": "e0f6d8ad18d3ebe4cafbe3c77f66b0049f501686657d2485cac9f7a5fe70b73c", + "size": 13031 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/pause", "status": "success", - "path": "en/api/csharp/beta/memory_stores/retrieve.md", - "sha256": "ae6a6311a0605663c8ec416803e11d0a9a4487160ddab97630683f6ffc226873", - "size": 6954 + "path": "en/api/go/beta/deployments/pause.md", + "sha256": "9d75105171c8ad649253a2b8df169da28aa68c289d17f1e911881380ac981f96", + "size": 24193 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/deployments/create", "status": "success", - "path": "en/api/csharp/beta/memory_stores/delete.md", - "sha256": "62fc07d18b282d1b5740802eee5bc0846079e216a38bd5e1658d7bfabd1d6a8d", - "size": 5142 + "path": "en/api/go/beta/deployments/create.md", + "sha256": "5db2350aaf9838a4cd82c33eefd0a5443043bb48480f8311065a28d73c55c48a", + "size": 35632 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories.md", - "sha256": "bd9e46aece79297e79f509c51e6f4bd9d1ab1d372e0ed68a1fc7bdb5d1316e12", - "size": 55199 + "path": "en/api/go/beta/sessions/events.md", + "sha256": "e144e6a6c65d0daac53897843fe401549b362b29c75f66ec82a08d00dd135abb", + "size": 609476 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/list", "status": "success", - "path": "en/api/csharp/beta/memory_stores/archive.md", - "sha256": "4e7545e8ed9e1fa39c739ef6240d2d47e59f47b2a8b7f0503884956216a584a6", - "size": 7051 + "path": "en/api/go/beta/sessions/list.md", + "sha256": "923e9ce9aa5aba3af4103cf6395b7d2df4c45b043cfb5ec29737f9dae060ef5c", + "size": 54032 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/archive", "status": "success", - "path": "en/api/csharp/beta/files/download.md", - "sha256": "5007ddaa427a2616238ac9c6e8b04030dc6b35c07ab9972dea3096ad05976a08", - "size": 4401 + "path": "en/api/go/beta/sessions/archive.md", + "sha256": "af2a363bddb9fb48f3a4c0f0647a1505e34ba632d0d9268f502dbcd65375ba5f", + "size": 50684 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/update", "status": "success", - "path": "en/api/csharp/beta/files/list.md", - "sha256": "44bde625ce8056c5b4f22a3e1208b091fb94ffd423ea30dc023a0d169c36919b", - "size": 6883 + "path": "en/api/go/beta/sessions/update.md", + "sha256": "cc8a5ec32e45b3ecae9b6826bd7541a140f9733831dd8dc99cd3ea9ac851256d", + "size": 52014 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/retrieve", "status": "success", - "path": "en/api/csharp/beta/files/upload.md", - "sha256": "d12e885a23be028a0c3b02ffd27c52ffa18ad61048c892e5a839107ac97c21f9", - "size": 6516 + "path": "en/api/go/beta/sessions/retrieve.md", + "sha256": "4ac049e9e58a2052e66d221fff0dfe046e10948e47bbf6ee71df94576f897da0", + "size": 50650 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources", "status": "success", - "path": "en/api/csharp/beta/files/retrieve_metadata.md", - "sha256": "aff83f513128ef4efa643148cddf8b165844064c166244f4dd794c53ee080792", - "size": 6133 + "path": "en/api/go/beta/sessions/resources.md", + "sha256": "811bdf89d642e65282a4fa0c940e1ab4d1a339f9e8dc46ae1f28b88d54a89878", + "size": 49702 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/delete", "status": "success", - "path": "en/api/csharp/beta/files/delete.md", - "sha256": "82ebad618d1e8afff02cf668d168e9df6c45f1689a2e2c2cd9173bd8f3085fd2", - "size": 4694 + "path": "en/api/go/beta/sessions/delete.md", + "sha256": "dc3f4be1eaefb01c531f6bca1ffaad01490b91d4b2963cd681103607ce8839cf", + "size": 6774 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads", "status": "success", - "path": "en/api/csharp/beta/messages/create.md", - "sha256": "5623a5bab6e5bc2389ce74f3b3f322a321064e1cae787a9f0fa5dca505cc68b1", - "size": 297777 + "path": "en/api/go/beta/sessions/threads.md", + "sha256": "9024a040f15e25d01c10fd0bcc343c7761c62da9178bb60c54b7d376c6cb0fb5", + "size": 476490 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/create", "status": "success", - "path": "en/api/csharp/beta/messages/count_tokens.md", - "sha256": "261a469873a14944385b82a28e74ff9c7041ad9dbfe35c35fbcac83752a7d298", - "size": 141138 + "path": "en/api/go/beta/sessions/create.md", + "sha256": "a8f489f6598e99801ded768c13a4234267c8a52b76b6b09ba744ea3a018a63ea", + "size": 93260 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/list", "status": "success", - "path": "en/api/csharp/beta/messages/batches.md", - "sha256": "3821cd6f7b63bbc413d7195abbe78d224ec76fac710fb730aa21d9a9558e7404", - "size": 804824 + "path": "en/api/go/beta/memory_stores/list.md", + "sha256": "9160e1e3b5f945511274fb43aba0649f5f7e24af0e0a1ef32ee3e33be2cffd84", + "size": 9568 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/csharp/beta/messages/batches/create.md", - "sha256": "7aebdb37b8ece1b846b8786f82e7f2de6af07b70caf20f0992bb3cc9a7d24c5c", - "size": 181060 + "path": "en/api/go/beta/memory_stores/memory_versions.md", + "sha256": "fe03ef334779fd0c14ef278373a0167aa257cbce81b1f584052c348703d2a86b", + "size": 51624 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/archive", "status": "success", - "path": "en/api/csharp/beta/messages/batches/list.md", - "sha256": "03e1a50a8d095927685d448c23ba04f47231ab0356f0eb4ba4d7cd3948b93579", - "size": 8928 + "path": "en/api/go/beta/memory_stores/archive.md", + "sha256": "441960ad1f79baeae764a72c4a71095eabcf2293eda9c8f9cee30428a4b50dff", + "size": 8919 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/update", "status": "success", - "path": "en/api/csharp/beta/messages/batches/cancel.md", - "sha256": "f515f1b514f30b30af537bca172191ad8fe76e516be8e823cce89f80aaed0798", - "size": 8804 + "path": "en/api/go/beta/memory_stores/update.md", + "sha256": "9652b8c3e26638a6439aa95dffda9c416c75f198ab8039c04b2a7212117fce97", + "size": 9659 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/csharp/beta/messages/batches/retrieve.md", - "sha256": "9796a7a30a0e7cc2533e91865bb3b0bfd4ba3c43c385f57c03df9515dd988c8e", - "size": 8500 + "path": "en/api/go/beta/memory_stores/retrieve.md", + "sha256": "3eac3fea68f0723d0fdb295ba73d6db03febd1c3d05c958569e802213fbeea99", + "size": 8806 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/delete", "status": "success", - "path": "en/api/csharp/beta/messages/batches/results.md", - "sha256": "89fc98e2a4efa8fc756fd9416af8d95c5ea150a52c73d2b384f45bf9d16c4897", - "size": 154172 + "path": "en/api/go/beta/memory_stores/delete.md", + "sha256": "0e27c20fb44e375e06210bfb6f2179d1a32ceb1ff034fa3d9f6ed955077ad591", + "size": 7122 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/create", "status": "success", - "path": "en/api/csharp/beta/messages/batches/delete.md", - "sha256": "6e1ca29566a8231fd27d043ccb0f0ca2279f5fb68d7fce92bf53015f89b22bc1", - "size": 5216 + "path": "en/api/go/beta/memory_stores/create.md", + "sha256": "a8a7f072cedb877d24504b22de6a8519b588912d40918a14efbe02ddf033f023", + "size": 9805 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories/create.md", - "sha256": "cb4eb913392599a877c5737d5d272d4239dbc87df8e9b1afc2e362341f7548cc", - "size": 8432 + "path": "en/api/go/beta/memory_stores/memories.md", + "sha256": "782cef54e9868be68623f3875466e4b322c98953a46b56f1aa09d6dc18a228fe", + "size": 65630 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories/update.md", - "sha256": "f09c181d68ef15020e8b035a3418286fbca9b8ac2fd02679adc165112b76ae1b", - "size": 8791 + "path": "en/api/go/beta/memory_stores/memory_versions/redact.md", + "sha256": "727f5b346a3c516121719ddd345ce16dd391ad72f2cae9810db49b5a5539c17d", + "size": 13219 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories/list.md", - "sha256": "bc23a02fd3e74f157795146119bdc802a3df270e7d96c4ad2df276d9e54589f0", - "size": 9903 + "path": "en/api/go/beta/memory_stores/memory_versions/list.md", + "sha256": "dc8cf7684e188937bfbd866f71568892b3cf10b06cbac9c21d1e548f5cf5a13f", + "size": 15119 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories/retrieve.md", - "sha256": "b80d6a0298cfb3b22c2f0998ff841ecc52b59f78cfa51aa927ee1472e70637e8", - "size": 7928 + "path": "en/api/go/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "2009cacc1d2839d170228d719b059b0cb424cfd89a94ecdbf9a56b15df197b1d", + "size": 13525 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memories/delete.md", - "sha256": "53c4e58a66d8d92e3f68815bea969a7d15aa504f4344d9e71eaae95d7b4c5f79", - "size": 6015 + "path": "en/api/go/beta/memory_stores/memories/list.md", + "sha256": "ea597f0db989dbd9782686fd520653aa76d84f03cc80b5cd6e968111acf7ece0", + "size": 11900 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memory_versions/list.md", - "sha256": "74b042199f4489972123b8aa9c2d53a9d3b0ace66fdd44253b983d58d49bb080", - "size": 12757 + "path": "en/api/go/beta/memory_stores/memories/update.md", + "sha256": "600a005b196652e9b1b081c1e97389998799d3231009005991e4533efe91ab32", + "size": 10749 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "d0e93a3573b9c9666ba55456358add7bd40e11786b56f39571e841d229df983b", - "size": 11310 + "path": "en/api/go/beta/memory_stores/memories/retrieve.md", + "sha256": "d5087e3c56e2438d703993bb1365718ebf2e6344b3f37f44317b7293dbe87857", + "size": 9814 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/csharp/beta/memory_stores/memory_versions/redact.md", - "sha256": "01bf4e5ffd25a373a33fd11b63ae0dfcdb768451906452f764660c5b138a1a39", - "size": 10993 + "path": "en/api/go/beta/memory_stores/memories/delete.md", + "sha256": "e768913f3a8da3ff0894bc166510d08e63bdcda32fdc876e70d7829acef58a83", + "size": 8008 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/csharp/beta/skills/versions/create.md", - "sha256": "64593e90dbf43ed51490241f4e33858c57b57fe45480256bb0ced7571d17006d", - "size": 6097 + "path": "en/api/go/beta/memory_stores/memories/create.md", + "sha256": "2a916fc336bc9a2923c0b93e849a202c0f17e8feec2acde8282a1100d02d21cf", + "size": 10346 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/list", "status": "success", - "path": "en/api/csharp/beta/skills/versions/download.md", - "sha256": "67e9a134730a34f8ec9eae37105cdba589ac179040b1297f8d835fa7c03d5785", - "size": 4890 + "path": "en/api/go/beta/sessions/resources/list.md", + "sha256": "924241a48acc2f91194abae885d0e9e9b8e0812607308cc2ec9dc5427253501f", + "size": 10281 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/update", "status": "success", - "path": "en/api/csharp/beta/skills/versions/list.md", - "sha256": "922d13f2ba9d3128e49956502a20e4e959b837d283d0be5838a7e90304dde234", - "size": 6166 + "path": "en/api/go/beta/sessions/resources/update.md", + "sha256": "87c3efc609ea98971c45a28a7c966eaafbd37bc6c66d488a5a941669da1a5584", + "size": 9991 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/csharp/beta/skills/versions/retrieve.md", - "sha256": "95a1fe6a8af0ba3f8d9590312df44e2d95090e9633c25e6ed60e31df174ecfbc", - "size": 6142 + "path": "en/api/go/beta/sessions/resources/retrieve.md", + "sha256": "c924fee4794b1f5eaac29d1aa82bdf97e31e2b579582034829bb9a7d447cd918", + "size": 9731 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/delete", "status": "success", - "path": "en/api/csharp/beta/skills/versions/delete.md", - "sha256": "60bc0500e07b51f88ea1e0fc82ae50f953050d21179c523c24cb7ae938b4d517", - "size": 5281 + "path": "en/api/go/beta/sessions/resources/delete.md", + "sha256": "930e579af2d41b16d8f806d77f0e0062b7d724bcfb310367553c00742eccf4f3", + "size": 6991 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/resources/add", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/list.md", - "sha256": "d093163564c39bce67f7f2d13259957c6458734fe7f826c5bcfd029e0f2a7720", - "size": 35629 + "path": "en/api/go/beta/sessions/resources/add.md", + "sha256": "d14a41d1e6d5f57917b48e15c488a119a76b7ac89b33bf510bbda0dd7b660e4c", + "size": 7473 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/retrieve.md", - "sha256": "04cc7a9c98e7dfbdf1adfcee5a333d3be97f3d009ae5f8423748941fe39963cc", - "size": 34752 + "path": "en/api/go/beta/sessions/threads/events.md", + "sha256": "b9bbef0547498c88004316b902a5a74c38e65800fc0fae0299948918e536b707", + "size": 209068 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/list", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/events.md", - "sha256": "9d1647694a663b5458db1ebba0470a72389d434ed0606e3db91668fab91eaa80", - "size": 200614 + "path": "en/api/go/beta/sessions/threads/list.md", + "sha256": "a6ae02ff15139c09591c3770a2ff9df8729478d85281038d9654f1d5465d5c30", + "size": 39116 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/archive", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/archive.md", - "sha256": "232c469c0779a8422fe03db7cc58d27835f796df9cba7ba1219516d275e2e7ba", - "size": 34768 + "path": "en/api/go/beta/sessions/threads/archive.md", + "sha256": "d72f14ad6d7ccf91eb6b4a13211ca65857c12ea3d88657da4117deb70822d168", + "size": 37914 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/csharp/beta/sessions/resources/update.md", - "sha256": "1d5f5ef5c8bbff47f1bc1b3fab7a3b99f4fbe23051ec8b7f899402a59a617709", - "size": 7816 + "path": "en/api/go/beta/sessions/threads/retrieve.md", + "sha256": "a3957bfb8319f1373e3dff7781ac68f90a38ffb96c8268d1c847252e63873ec1", + "size": 37878 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/list", "status": "success", - "path": "en/api/csharp/beta/sessions/resources/list.md", - "sha256": "70c41d73abce280eea42fd4ea243a66d7816c69c7ca64552ecd3dcc82fb9a145", - "size": 8098 + "path": "en/api/go/beta/sessions/events/list.md", + "sha256": "b06eca453de85a876322c61b1b49570a4446739eaf7ad3f417afd12d80e41423", + "size": 109458 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/stream", "status": "success", - "path": "en/api/csharp/beta/sessions/resources/retrieve.md", - "sha256": "7a61003b9e1f413ff4f44e0749bd3c888bf4f96f54dae24b2ab56365a584b41b", - "size": 7584 + "path": "en/api/go/beta/sessions/events/stream.md", + "sha256": "bc9058f017d4e188c6768b85e5d1c2c3e3cd9ea1bea26a835d4dcf583f53c7ab", + "size": 106103 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/events/send", "status": "success", - "path": "en/api/csharp/beta/sessions/resources/add.md", - "sha256": "944c767e59993d73b6cf7595f30e8ab88ce2430d8cf46d47c499a43124cce6e4", - "size": 5615 + "path": "en/api/go/beta/sessions/events/send.md", + "sha256": "ce9c1b7904cbf5919139522bf2b0c2b19236b0a4758a285ce209cb0441335e3a", + "size": 30904 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/csharp/beta/sessions/resources/delete.md", - "sha256": "00348df1b55f8da7b578b4b253fd2f2537b50a8e62e780d8da9f076419814638", - "size": 5039 + "path": "en/api/go/beta/sessions/threads/events/list.md", + "sha256": "3ac99aa1b1edc664a7c29c10bdd40cdaa0924114b75a4dfa6c6379bcae6b9035", + "size": 102897 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/go/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/csharp/beta/sessions/events/send.md", - "sha256": "88a44c1bce02ab2967539e2253acd981d4b9d06d02bede89d20626915d8eb580", - "size": 27140 + "path": "en/api/go/beta/sessions/threads/events/stream.md", + "sha256": "67238b54ae26b0a2d17fa5b1446408fea93de329e8529e41aa378dcc98a288e9", + "size": 106304 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/csharp/beta/sessions/events/list.md", - "sha256": "9fd4244d830a3a85da21629968314da438d6934e4752eecff76246455542be3e", - "size": 102039 + "path": "en/api/go/beta/tunnels/certificates/list.md", + "sha256": "1b3f20bd833894fe0f8a417f7e10b14f3f6ec92703d5fb3d29c854eab0077363", + "size": 8512 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/csharp/beta/sessions/events/stream.md", - "sha256": "e9a781677c96ae7712192aaca99859cc2f84241de79d73124d2708e74bc39032", - "size": 101805 + "path": "en/api/go/beta/tunnels/certificates/archive.md", + "sha256": "c00405cd3770dce9a17e8118416a410370c7eeb4bffe9f9668fd7ed76d63b524", + "size": 8319 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/events/list.md", - "sha256": "10a4fe2e075015c00f543c2c5926eb2a09be32428d75ebcdde4169014e86a7e8", - "size": 98728 + "path": "en/api/go/beta/tunnels/certificates/retrieve.md", + "sha256": "01f0e2a58b4f46cd73600306de1781fdc5bd227969a87da5c658fac68fd7e9a9", + "size": 8064 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/go/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/csharp/beta/sessions/threads/events/stream.md", - "sha256": "7fe856c8807c8c151713c11176813dfc9c8d377c42d08f357b9e5c4f52c425eb", - "size": 102023 + "path": "en/api/go/beta/tunnels/certificates/create.md", + "sha256": "32383af499ea25e2a05fa8f481ed8219cb35b990ce3b19fb37c7938482d6b3ec", + "size": 8318 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/list", "status": "success", - "path": "en/api/csharp/beta/tunnels/certificates/create.md", - "sha256": "475fc5f2b5654d79df04bafde6d9a00961a902114ebac3653c62116ddfac64e7", - "size": 6469 + "path": "en/api/go/beta/skills/versions/list.md", + "sha256": "d78c97c290460f733a1db2614f514e8640337d025d8ce9084b2e64115a99a671", + "size": 8098 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/csharp/beta/tunnels/certificates/list.md", - "sha256": "2ab29a7325bcc0d48804f90301391e40e3fbe43ad9751e6228fdfe13ec5e0c5d", - "size": 6616 + "path": "en/api/go/beta/skills/versions/retrieve.md", + "sha256": "ce8017b91a8e4c4be405ea148ccd66dd2435c3459403319af7b22ba7c91dcfe7", + "size": 8043 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/delete", "status": "success", - "path": "en/api/csharp/beta/tunnels/certificates/retrieve.md", - "sha256": "0e55a57c2af08369b0a6967d11aabe97105d9643fa9834672058c42aa8ee7810", - "size": 6223 + "path": "en/api/go/beta/skills/versions/delete.md", + "sha256": "112afe0a0c3a3a3478b9b9fceeb4ab5366f5ea04a889ba5ca7dbded27d491cf1", + "size": 7255 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/download", "status": "success", - "path": "en/api/csharp/beta/tunnels/certificates/archive.md", - "sha256": "a496366ab26dce741f779576d6f369ca2bfeab2e6933a9c61f116b1ea405b12f", - "size": 6458 + "path": "en/api/go/beta/skills/versions/download.md", + "sha256": "42acf72d23f4bf7962bf454309532f369a00c251fe899acbdb41785cea98aed1", + "size": 6919 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/skills/versions/create", "status": "success", - "path": "en/api/csharp/beta/agents/versions/list.md", - "sha256": "a5ba67d8851fb295d8c072e19507aa2065e3714547c2e402a94060394fd69564", - "size": 32426 + "path": "en/api/go/beta/skills/versions/create.md", + "sha256": "11040650345bbe5d3535b026b277b7862582fbe634cbb5b5e43fa4200ded3a23", + "size": 7994 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/list", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/create.md", - "sha256": "77789336697adbf13d53e2b758236bb492dae8c802fbd31b1c0f52c80b32e226", - "size": 14639 + "path": "en/api/go/beta/environments/work/list.md", + "sha256": "d3cf3c751b51836294f0031a6ff60a802b548216cf49e73abc1b9d50007ccbf4", + "size": 9191 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/update.md", - "sha256": "00b4fda4b8d7e5eac7acdc95e47233e4f2b93d396a61fa57c7f7d818ddda2bf6", - "size": 13970 + "path": "en/api/go/beta/environments/work/heartbeat.md", + "sha256": "3692a4dfc6d480cb542c50c69e36a70eac85591f32cd9c796bb23fa9d29ffaf7", + "size": 8341 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/update", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/list.md", - "sha256": "0a792e012d1d0b301edd922359c1a6a120b7b510c3681926a19ef9f6bacd646e", - "size": 9878 + "path": "en/api/go/beta/environments/work/update.md", + "sha256": "e7d143473e4b90173266640c70387a09fe099543c5b2a076e4562f411fa2c281", + "size": 9588 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/retrieve", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "ee7ccd24761fb7b9ff7ef78b053c079744f5dfe6acda5948ed58deb0217a1705", - "size": 8570 + "path": "en/api/go/beta/environments/work/retrieve.md", + "sha256": "6c718ab1146d0c1e50fb3d06cd0461cf38c384895728ac44fe67878086965c11", + "size": 9310 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/poll", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/retrieve.md", - "sha256": "484fd8131dda6a5a77349ea50332377e7afbe3bc17ec9944a7cda3b0c9bf40df", - "size": 9435 + "path": "en/api/go/beta/environments/work/poll.md", + "sha256": "6711b2aec508ec01202ea97d96c21ba01d3a8b8cc3825d3b207c7bddbb85d908", + "size": 9471 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/stop", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/delete.md", - "sha256": "04a7b6549ece6ec650f3c9f1e47d45d147fa91d5cf9576bf9ff70ad990448b13", - "size": 5142 + "path": "en/api/go/beta/environments/work/stop.md", + "sha256": "db5e3baa48365ab4619cb3f005cf56e40b4fdd4e0afb2aa0a8eb4b1586c490d5", + "size": 9512 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/ack", "status": "success", - "path": "en/api/csharp/beta/vaults/credentials/archive.md", - "sha256": "caccecf336da431eb6edf1f964fa5c03bba5177ca4c571ac2469bb1f4b64cd8d", - "size": 9435 + "path": "en/api/go/beta/environments/work/ack.md", + "sha256": "9c155dd8627a1f260752f245dcd9484520a08c79d1770680f3ccf7d7db2436ed", + "size": 8989 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/go/beta/environments/work/stats", "status": "success", - "path": "en/api/csharp/beta/environments/work/update.md", - "sha256": "3a7dde0bdc358ad41b187ed90d5b059841e08920780fa566d2c44b5b2a44d2cd", - "size": 7499 + "path": "en/api/go/beta/environments/work/stats.md", + "sha256": "d8499fc2eb98a467a5fb9e2ea8657c50baca6f784be1ed669affd4128576d681", + "size": 7488 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/go/beta/agents/versions/list", "status": "success", - "path": "en/api/csharp/beta/environments/work/list.md", - "sha256": "38fd7a1a1f8e103252f633031ef8c0ef61950bdb03a776bd1be9bf2a7d224e71", - "size": 7083 + "path": "en/api/go/beta/agents/versions/list.md", + "sha256": "6ee4b86dd3a68c87609e433d13180aa5031fee03e18ba22fcdb1013470570224", + "size": 34982 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/cancel", "status": "success", - "path": "en/api/csharp/beta/environments/work/stop.md", - "sha256": "07e8fe70826d66dabb29f4382a8f0213452980a07e7d07c3bec9c6e49e15eacc", - "size": 7273 + "path": "en/api/go/beta/messages/batches/cancel.md", + "sha256": "0cfac6a895023ef9d8a1b6417ee16aa82040347f86f2a593aab526f311ef6fa2", + "size": 10937 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/list", "status": "success", - "path": "en/api/csharp/beta/environments/work/retrieve.md", - "sha256": "97deed600ce828815888a2b6bb93690bd1ef34a29781434ba6ff46ecd0ec4058", - "size": 7215 + "path": "en/api/go/beta/messages/batches/list.md", + "sha256": "12423159d11b8539dc200526cd3b6c1a1bcc14ff859964fd103ec2a3214dfc29", + "size": 11088 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/csharp/beta/environments/work/ack.md", - "sha256": "6ccbbf965e8976ad68ad3d634f95a789a4d9be6e0c8ba8063e4c6cabc343c9be", - "size": 6894 + "path": "en/api/go/beta/messages/batches/retrieve.md", + "sha256": "c2bcc7b1d74fde8f57a437ddbce3e63f72ca42f25067134a2b39f79faad38ec1", + "size": 10615 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/results", "status": "success", - "path": "en/api/csharp/beta/environments/work/stats.md", - "sha256": "1cfa6e1553ff2b0d872adc18d90d5234b069a788874bf35aca6880e4a4e16438", - "size": 5505 + "path": "en/api/go/beta/messages/batches/results.md", + "sha256": "1da812f2e63e85c11c0f52c58571408678f2dad98d01c56dd2df63479560c418", + "size": 174909 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/delete", "status": "success", - "path": "en/api/csharp/beta/environments/work/heartbeat.md", - "sha256": "c36201f93268b898597f37d3ac322d7512037f8fa2033f0443b3c9b2f16e3904", - "size": 5880 + "path": "en/api/go/beta/messages/batches/delete.md", + "sha256": "cd6739c5c652283d021c32ce3b7602b352e63a4dedbc11ceb3c43d19256fbdf5", + "size": 7200 }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/go/beta/messages/batches/create", "status": "success", - "path": "en/api/csharp/beta/environments/work/poll.md", - "sha256": "bb586f5b9bf602341567e1019ffedf90ec614c7c5eda2d5e5567f39057c468c5", - "size": 7308 + "path": "en/api/go/beta/messages/batches/create.md", + "sha256": "a147d153beab2acf573eeb9b0b410f6c75238582970f285c050d46e6fa98c362", + "size": 193053 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/list", "status": "success", - "path": "en/api/typescript/beta/sessions.md", - "sha256": "2deaa7b688005a8a2f3487d4c012b5002caf9246971b91861ffedfaa6c79e88b", - "size": 1224813 + "path": "en/api/go/beta/vaults/credentials/list.md", + "sha256": "bc8803a51a9d08bd4611036fe29b0216fd786efaf0817f7f068e56e95b0ffa59", + "size": 12126 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/typescript/beta/webhooks.md", - "sha256": "03d7a875d4346f1fd974e1140db9095c999a8d97343a00d5c5afbd5fd7163f33", - "size": 37110 + "path": "en/api/go/beta/vaults/credentials/archive.md", + "sha256": "973dc330138783eef99823c8debdabfb1d30c0e7fdf909b8b30b2eedd4b76e49", + "size": 11649 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/update", "status": "success", - "path": "en/api/typescript/beta/skills.md", - "sha256": "a6e0ae9b4227e35b0d788b25a3601abd2213e549a960b4ed6a57be8994eef409", - "size": 43794 + "path": "en/api/go/beta/vaults/credentials/update.md", + "sha256": "b44a70b8385da6a1f5837979421500ded5ed3743d538b6d3692cdbf568c6fa86", + "size": 16638 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/typescript/beta/agents.md", - "sha256": "35609c7ceea6edb7a6c306219282ed6aa597007ddcb63ca86c2a974635e88f76", - "size": 470449 + "path": "en/api/go/beta/vaults/credentials/retrieve.md", + "sha256": "f1c1d97698777613eefaaee165291b392a33c24f413a53271e8a1646e2ce37b6", + "size": 11629 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/typescript/beta/deployments.md", - "sha256": "2024d948a6d644aa0cd7f83d0cde34593cc52d2c3bcbcd22e97abe11332b65e8", - "size": 225343 + "path": "en/api/go/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "f2cddf61d44cfc057f8d4e40292f96e0817abd773a454d730c449a492736f06a", + "size": 11057 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/typescript/beta/deployment_runs.md", - "sha256": "455c4652abae25c07ab64b2ce1df256d90a088dce3f41c5b64dd0a295b45bd6d", - "size": 32964 + "path": "en/api/go/beta/vaults/credentials/delete.md", + "sha256": "161546b3e4f3f61c1783d66673187cb3aae1159183df4864d0852ba243d7a4c5", + "size": 7122 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/go/beta/vaults/credentials/create", "status": "success", - "path": "en/api/typescript/beta/user_profiles.md", - "sha256": "2ab4c15fa105f3562ae486e54e7e5832951144f93ab1f74857423a72694b65ef", - "size": 67145 + "path": "en/api/go/beta/vaults/credentials/create.md", + "sha256": "51278aaed14589694add98c4053f63ef7912bbe2c887f2558ad2cd4967ba96d1", + "size": 17212 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/models", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/cancel", "status": "success", - "path": "en/api/typescript/beta/models.md", - "sha256": "1e367b1b8adfeac9c3be9ea92f2da35da95bc38c40d5829f7e40488b3453448c", - "size": 44694 + "path": "en/api/go/messages/batches/cancel.md", + "sha256": "bcde07f82ffe6a8ebd67f92c5ebb799085a1f366cdf3e6f4b43fa075f1848cb0", + "size": 5661 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/list", "status": "success", - "path": "en/api/typescript/beta/vaults.md", - "sha256": "4c3a448ac660f947002f07f4944f9c6b3e8955bdc71b46147c5e64559b1b874a", - "size": 89004 + "path": "en/api/go/messages/batches/list.md", + "sha256": "ddcc7a670f3446f30bab414ea5023f9e2cc9c8f2d4071eae2db924fd3d3caf74", + "size": 5820 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/retrieve", "status": "success", - "path": "en/api/typescript/beta/memory_stores.md", - "sha256": "5afd8dad933ec95784c59b1a5c4fa3985142afaad0c7c0623aa5d0b5102cc684", - "size": 103778 + "path": "en/api/go/messages/batches/retrieve.md", + "sha256": "317e212972d4a10b02f8c3ea5fcc447f2d7f5791d1fd1696e05b0d5ecf0945a9", + "size": 5339 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/results", "status": "success", - "path": "en/api/typescript/beta/tunnels.md", - "sha256": "a948c60a3b8ee961d5b2d19d9968b654d0e7109b4f9ded424f581ec8f61cd152", - "size": 47566 + "path": "en/api/go/messages/batches/results.md", + "sha256": "f704254650bad11cd12f43bc53852ddd9831cf4f9b3028121cd07df529b6ba3a", + "size": 43903 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/delete", "status": "success", - "path": "en/api/typescript/beta/environments.md", - "sha256": "3030c2985cfbb8c8e8bfc0247ac89fd70586face09522159b32484090c35b559", - "size": 97821 + "path": "en/api/go/messages/batches/delete.md", + "sha256": "c8fd9f328d4daf47510651f78f050cfb389a3145a47272346b13b46ab8b603a5", + "size": 1956 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files", + "url": "https://platform.claude.com/docs/en/api/go/messages/batches/create", "status": "success", - "path": "en/api/typescript/beta/files.md", - "sha256": "e97c5ca879732f70ab17d46cc66376ad7d132756e0e03f5f0a27a328a0e0303b", - "size": 23676 + "path": "en/api/go/messages/batches/create.md", + "sha256": "47026917ccecb611cffd224f635b52d8174f0846811c62cde12c0fd4de37ed1b", + "size": 126071 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages", + "url": "https://platform.claude.com/docs/en/api/php/messages/count_tokens", "status": "success", - "path": "en/api/typescript/beta/messages.md", - "sha256": "f3eabc8ed19e1adce7695ae91d1f4cbff29596253c92512bf5481735114df98c", - "size": 2939363 + "path": "en/api/php/messages/count_tokens.md", + "sha256": "fd336a881f669b186e59846d87f698bc4f4072133f1462547f4c58516adb7a60", + "size": 10455 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/models/list", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches", "status": "success", - "path": "en/api/typescript/models/list.md", - "sha256": "1e20bb7265bb2d1884c8097145609585aba319df0de3c806747011c3a907ab0c", - "size": 13241 + "path": "en/api/php/messages/batches.md", + "sha256": "c4215b4f52c0e8a2a67d9a8cffa23f19684078158bbc0c2f9f6fed9785f2b8d7", + "size": 26892 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/messages/create", "status": "success", - "path": "en/api/typescript/models/retrieve.md", - "sha256": "c137c36f1e43346c91339c98f9798b21578ba3e77698c37117dad898d13b00be", - "size": 11897 + "path": "en/api/php/messages/create.md", + "sha256": "69dac11e95523150daf511473595808bfebdb933ea5e154dcabe06b62381cf0d", + "size": 21465 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/completions/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults", "status": "success", - "path": "en/api/typescript/completions/create.md", - "sha256": "9f32e9e5e23a9efdbc6f7de960da5f046a2ab411584a5ee6bebcaff9a6c307f5", - "size": 13418 + "path": "en/api/php/beta/vaults.md", + "sha256": "5e69359511d34eca20138c416a9459cc94fab1b8d2b1d5a002214c83dfb8c89a", + "size": 33535 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs", "status": "success", - "path": "en/api/typescript/messages/create.md", - "sha256": "26f31869174a7e74342493bda9e27c2c5282bce9f6a0ddba3555ee63bd8d3762", - "size": 142225 + "path": "en/api/php/beta/deployment_runs.md", + "sha256": "30ca8d8ede447c111c6ebe9ae443927e60bf2c2b3f04587824cab28ef17961ac", + "size": 12099 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/php/beta/webhooks", "status": "success", - "path": "en/api/typescript/messages/count_tokens.md", - "sha256": "6a7a3ebaae94c6f4a89b95bb5e88f48e9be74b4314278dd09db469716b2f6610", - "size": 97979 + "path": "en/api/php/beta/webhooks.md", + "sha256": "dbcac219db91f6509c0d8e83006f4783c03ae49910c4408c62d16969e61ee9e3", + "size": 24024 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches", + "url": "https://platform.claude.com/docs/en/api/php/beta/models", "status": "success", - "path": "en/api/typescript/messages/batches.md", - "sha256": "0d06d2918c3a1fa31f84a4bcb87dbcb7d6624d3ffc2d1d2e0cc24438d26e6863", - "size": 286260 + "path": "en/api/php/beta/models.md", + "sha256": "5d324e60a3f02da0adddb0ea5b19a7b220efe328543016efdbe34baa63ced970", + "size": 19754 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills", "status": "success", - "path": "en/api/typescript/messages/batches/create.md", - "sha256": "eebf839d2c359a6dd73f836d71bc7d18eeb77ca6a7eb242010ec773e84a82457", - "size": 114400 + "path": "en/api/php/beta/skills.md", + "sha256": "27c6e353c26e00d70d0f79d8d6ee45c836a88548f0cff61aebc6069d9582ceba", + "size": 24186 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores", "status": "success", - "path": "en/api/typescript/messages/batches/list.md", - "sha256": "9b99d48fa39b850f6e9475695438b9b659a772e7e3badf3faf29649284f11fc8", - "size": 5547 + "path": "en/api/php/beta/memory_stores.md", + "sha256": "9ea799b88955a11c59404e24d2f09bacd12b06b2f3cf962bd87e47e3da930f17", + "size": 62356 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages", "status": "success", - "path": "en/api/typescript/messages/batches/cancel.md", - "sha256": "5e3fa4682a36c98833b368ec01b063eec5838dbd359e8d43a2bc39d4f7b9c3c2", - "size": 5353 + "path": "en/api/php/beta/messages.md", + "sha256": "654a11c714bec71fd18a411f610f237e28d0b8f22887a4a165993147c4ee0bc6", + "size": 382514 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents", "status": "success", - "path": "en/api/typescript/messages/batches/retrieve.md", - "sha256": "c6525f32b5eafb682fd0d5c0be579f4ed869e9e5db35bf468ca069ec133818ea", - "size": 5047 + "path": "en/api/php/beta/agents.md", + "sha256": "7e856e1e50ce125cd06930f1efa91fd701fded8ce2e2829cda58fdfef9b4d17f", + "size": 82093 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions", "status": "success", - "path": "en/api/typescript/messages/batches/results.md", - "sha256": "ba451f128d83a96fa7155eb3103f681ce7963e21031001292a231f44e712e7f8", - "size": 40024 + "path": "en/api/php/beta/sessions.md", + "sha256": "75a4c852b975096975c7996e7d44d45485475746d934999f07d9c51c9874d05e", + "size": 199270 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles", "status": "success", - "path": "en/api/typescript/messages/batches/delete.md", - "sha256": "46fdfd0b33adef988d5799146b8c7abc9e63aa70ea38db05f199ab7a229d7567", - "size": 1797 + "path": "en/api/php/beta/user_profiles.md", + "sha256": "76d188b844ba0f266b45d1e7687f01d40f70a464659161e06c7267a30d9f6efe", + "size": 34412 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/files", "status": "success", - "path": "en/api/typescript/beta/environments/create.md", - "sha256": "8bbd33d7aaeb39e6f599b27cfdd2ea824c89e085496fff8310761ef2d098cea9", - "size": 10091 + "path": "en/api/php/beta/files.md", + "sha256": "c1af05fbbe4f931a2fbad8e1c3d2c0d0bd7fbd7dfaa1c5c59ba64984bf85216f", + "size": 12793 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments", "status": "success", - "path": "en/api/typescript/beta/environments/update.md", - "sha256": "d17c45ebf4c31c1859482b9990a8f14b9cf72476b9af9f56ff631f1bade2b1e5", - "size": 10184 + "path": "en/api/php/beta/deployments.md", + "sha256": "8b1577bc23ab7cff4ddffc1d21456d3800fca7e7c0deef3ea608e40ece53442b", + "size": 56347 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels", "status": "success", - "path": "en/api/typescript/beta/environments/list.md", - "sha256": "ce1c3b63676e57c1dcc8de98a3074fe0804b8b857595e58a65f7c1bbc46bdb11", - "size": 7586 + "path": "en/api/php/beta/tunnels.md", + "sha256": "15f6e16f7d5a0666ccad4a0b0cdeeb11c1ba1271aaea9d21f1964914e6e54181", + "size": 27635 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments", "status": "success", - "path": "en/api/typescript/beta/environments/retrieve.md", - "sha256": "794493313997fd1b1790adc9241ae67cacaa1151b994ad79825bde4e166a0131", - "size": 7007 + "path": "en/api/php/beta/environments.md", + "sha256": "4b62c673c51dadcdb1d55b2185f42f45a58d15870e696af825670cff1a639607", + "size": 48099 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/php/models/list", "status": "success", - "path": "en/api/typescript/beta/environments/delete.md", - "sha256": "e03ebfb46cef12b2edb6f425374ac64962585007a5b2d57728d90ae83db3bafe", - "size": 3644 + "path": "en/api/php/models/list.md", + "sha256": "35c543e97cb8025665ab969f35a9e762acf147ce73a23d330ddc9a6543e2943d", + "size": 6626 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/php/models/retrieve", "status": "success", - "path": "en/api/typescript/beta/environments/work.md", - "sha256": "abb6b35c661323850b5b2b8b0a4c67842c02a2c4c2a3e206fffa5ee2e0acb27e", - "size": 48837 + "path": "en/api/php/models/retrieve.md", + "sha256": "5b079e7634857b2a8969ea2d41b393a71b0c65f00246207afb97372060ed4364", + "size": 5307 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/php/completions/create", "status": "success", - "path": "en/api/typescript/beta/environments/archive.md", - "sha256": "362fc9e3f81a3d01ff7f2f6a0d39764f793717fad2c5f5bf430d14792d436585", - "size": 7068 + "path": "en/api/php/completions/create.md", + "sha256": "e47f61069eca3851f391ce940b1ccbfde33f0958d25ed5c4ddceb8f5a25201d2", + "size": 13298 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/list", "status": "success", - "path": "en/api/typescript/beta/deployment_runs/list.md", - "sha256": "82ae4cfa0416fc06d3faf524bb51461bdec12786a20d54b4b6511cbca8e8b857", - "size": 11188 + "path": "en/api/php/beta/vaults/list.md", + "sha256": "a8a13ad08c50c4ed9ed5003e4f18c29a243d2fe08a243d877f5c70e179ed0928", + "size": 2647 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/archive", "status": "success", - "path": "en/api/typescript/beta/deployment_runs/retrieve.md", - "sha256": "0a8ac4aa67e176e3e4eb89e7246e72fb121aa32be8ed81cb0c19e10fc7b657ad", - "size": 9645 + "path": "en/api/php/beta/vaults/archive.md", + "sha256": "2df977e274ada045734c9ee629fbcc79023f57fed14b33fa84b9c1e245c4534b", + "size": 2135 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/update", "status": "success", - "path": "en/api/typescript/beta/vaults/create.md", - "sha256": "539c87558f969bc324ba0683cb00d39e389266235fa27b35d2245298ff7a90a5", - "size": 4348 + "path": "en/api/php/beta/vaults/update.md", + "sha256": "9978558d9f339cd03887fd46c84ac80900dfbb860bb54be37f01238579dec806", + "size": 2501 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/retrieve", "status": "success", - "path": "en/api/typescript/beta/vaults/update.md", - "sha256": "5ba5ca96dc23eaed6db60b2e3a1015d324248d0ceec94eaf9dfc8e3cefc9f489", - "size": 4465 + "path": "en/api/php/beta/vaults/retrieve.md", + "sha256": "fb1796d2327d0a322ed7a8b3f0cd33a77288902efeb7ede589d3a4ed5c12f851", + "size": 2133 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/delete", "status": "success", - "path": "en/api/typescript/beta/vaults/list.md", - "sha256": "f9813ecff441a9b4b7c90f3d07805909d8797c493793bf330ef24cac36a327f4", - "size": 4714 + "path": "en/api/php/beta/vaults/delete.md", + "sha256": "fd906ef67a5d5653a433b07fb825898faf354ca03ee39f6a797ca8db6c6cd5c5", + "size": 1604 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/create", "status": "success", - "path": "en/api/typescript/beta/vaults/retrieve.md", - "sha256": "b052719e663b8e31083dabe3296aa9c7d610242adcb2d9e7018fa479c55ff0af", - "size": 4184 + "path": "en/api/php/beta/vaults/create.md", + "sha256": "a886fdffa08df0b1d82886d0d77ee843118a51995ad3b48b3d2b189e46e833ce", + "size": 2350 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials.md", - "sha256": "1dcfbfc31c59582452c72412bbce030b6c2e923e7d967a8f173c65ae0b1187d4", - "size": 97826 + "path": "en/api/php/beta/vaults/credentials.md", + "sha256": "9bd4538d11d884e98c7143c75a4d4c7eab9d2febe975d68a1627b08465697086", + "size": 33043 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/count_tokens", "status": "success", - "path": "en/api/typescript/beta/vaults/delete.md", - "sha256": "d5dd93bfa0fa9ab7a19be2264edca82432a231622383b57323593625aa19c998", - "size": 3550 + "path": "en/api/php/beta/messages/count_tokens.md", + "sha256": "979ebdeb155d148c36b30ca74cafcb1ac468f2bdb82ff8333846df7d2de92225", + "size": 13482 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches", "status": "success", - "path": "en/api/typescript/beta/vaults/archive.md", - "sha256": "379e8d9b1ad73216058b3ce03bf9a9947b260c04f60daa3f68434b4e41827236", - "size": 4185 + "path": "en/api/php/beta/messages/batches.md", + "sha256": "164fe9cdaaf69f7824acc6ae5134103b57f1146f7d1eb508a1a8c29e0a3bc397", + "size": 30087 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/create", "status": "success", - "path": "en/api/typescript/beta/user_profiles/create.md", - "sha256": "98392f357e03039568f9782ae6f72e4889e87b33cdfbc40d0070a6c50518b404", - "size": 13357 + "path": "en/api/php/beta/messages/create.md", + "sha256": "94b71605f97f9082d04fe33a920d1de3086a05f97cd919d5cc197da999cb4842", + "size": 31030 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs/list", "status": "success", - "path": "en/api/typescript/beta/user_profiles/update.md", - "sha256": "d9cf1c77216ddd81644b5c1f2f1b78d9136304b65a336da369dca9465647f450", - "size": 13211 + "path": "en/api/php/beta/deployment_runs/list.md", + "sha256": "56da5c10c1b12708126bcc0e2e540a7f08a2c1cbbf99187b02f3909230624af9", + "size": 4517 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/typescript/beta/user_profiles/list.md", - "sha256": "293ad5098e1a17bfba5a8861b0b96d4a344a83888d055c25f446045f0a5ff170", - "size": 10158 + "path": "en/api/php/beta/deployment_runs/retrieve.md", + "sha256": "6b2027b5e8bdcc76a78211d8f9de4d9310d9286695e29eb0293c51dcb800f56a", + "size": 2695 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/list", "status": "success", - "path": "en/api/typescript/beta/user_profiles/create_enrollment_url.md", - "sha256": "f5c947cf7d5ad682fb327d6ec88f564f439ea287c36225b52edb3ad7ad02053c", - "size": 4031 + "path": "en/api/php/beta/agents/list.md", + "sha256": "5ddfd0c0c1c83525fce1263d702b0b4edde405c3c9531a477fdddaf4b98bb702", + "size": 5573 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/archive", "status": "success", - "path": "en/api/typescript/beta/user_profiles/retrieve.md", - "sha256": "94ba576616e23fa34a60c74069c55106a77d052c139a18236776d6daa3fc34f3", - "size": 8989 + "path": "en/api/php/beta/agents/archive.md", + "sha256": "296afe4d9ec0c42bbc7b4270a2b1715514d4ce1f99eeef34017f7d0c43a4c992", + "size": 4503 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/update", "status": "success", - "path": "en/api/typescript/beta/agents/create.md", - "sha256": "a3d8b8920182eda49fc7e2be3f0eb146b8a944eddadf2c86e8d847bcd1d567dc", - "size": 67278 + "path": "en/api/php/beta/agents/update.md", + "sha256": "0206b3c2da1eda7927812163f41c968fc6959abf358b7d2745f9524a01b0ea13", + "size": 8405 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/retrieve", "status": "success", - "path": "en/api/typescript/beta/agents/update.md", - "sha256": "7cc37944650754619a6fa38d18e3d420127fa786bc08836cb7db6b3fb7e86e51", - "size": 68239 + "path": "en/api/php/beta/agents/retrieve.md", + "sha256": "f085adbc70ae0b8c3fd2eb96592079636d0af81d9367ae3cfa2eb8cae7d0f4a5", + "size": 4644 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/versions", "status": "success", - "path": "en/api/typescript/beta/agents/list.md", - "sha256": "be8126cffb4fd88ddc1ef1d041e369275912d7fb53580f39090328b0aacc848e", - "size": 31553 + "path": "en/api/php/beta/agents/versions.md", + "sha256": "8f1946edb531f8c8d10c31d21db6bd8a6196b06d1445f390a389e05c289231e7", + "size": 5167 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/create", "status": "success", - "path": "en/api/typescript/beta/agents/retrieve.md", - "sha256": "c50957166fa3615019985604f11d0edfcd3532f52039958d1ac3a54a8abf8dff", - "size": 30749 + "path": "en/api/php/beta/agents/create.md", + "sha256": "5caeb67b97cb9bf97ba889d0c8afdac2a2be23bd481d91a2efaec3a4670de6a8", + "size": 7328 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/list", "status": "success", - "path": "en/api/typescript/beta/agents/versions.md", - "sha256": "8bc5f065b845a0ac757904bd96527d891a165831c44007a173220470a7cfdf38", - "size": 31332 + "path": "en/api/php/beta/environments/list.md", + "sha256": "52e90f37a5010ab9aa2c93ecef36b5d1b1c29e07412ce5bc4b87c3f2b5020155", + "size": 3742 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/archive", "status": "success", - "path": "en/api/typescript/beta/agents/archive.md", - "sha256": "ebd4e9404d36371cb0040a2a895c3519281a9a999f0819d80ead418a382f5b45", - "size": 30617 + "path": "en/api/php/beta/environments/archive.md", + "sha256": "cdf8f1114a837716cea1d31db85e71752d1d104a077976a5f23f91a2429abb71", + "size": 3210 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work", "status": "success", - "path": "en/api/typescript/beta/models/list.md", - "sha256": "9c3dcce65d595bfa863e2126152ae56bf2b5eb030d8c8790bba22054c4346403", - "size": 13977 + "path": "en/api/php/beta/environments/work.md", + "sha256": "72d5538323207a9bc20407cd4a807bad55e4318bf979942a58e04cda37f90262", + "size": 27049 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/update", "status": "success", - "path": "en/api/typescript/beta/models/retrieve.md", - "sha256": "ccecf76e244bab3688c5bb29ae407a521f851269b27996ade7325215e8779118", - "size": 12597 + "path": "en/api/php/beta/environments/update.md", + "sha256": "b2c46bd4995adf69ecffa10cdd393735e1c2365c48e437eefa6e73b15ef825fe", + "size": 4455 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/retrieve", "status": "success", - "path": "en/api/typescript/beta/tunnels/create.md", - "sha256": "26c26be6718044a1046fc90772ed28467f641754f8556ad735f5128042f7ab1b", - "size": 4617 + "path": "en/api/php/beta/environments/retrieve.md", + "sha256": "de0710eb4547add4da69943f09a15696b3a06ad67906732ebf808b6b374a9b95", + "size": 3144 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/delete", "status": "success", - "path": "en/api/typescript/beta/tunnels/rotate_token.md", - "sha256": "51aa484f4b5ad711456786b039359fe56986f258cad1299ed17b1a4258d5d251", - "size": 4239 + "path": "en/api/php/beta/environments/delete.md", + "sha256": "87dfb9c885c03581d91f8a556ab961704c57a6e3ffbb8987b676ba321cd9c28f", + "size": 1645 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/create", "status": "success", - "path": "en/api/typescript/beta/tunnels/list.md", - "sha256": "b8f74c150696a08223390a8d5d20deb457076a064c99ac63bde38ff4d76e2c71", - "size": 4943 + "path": "en/api/php/beta/environments/create.md", + "sha256": "e3c21d55d6493be90698d86f001ad86e19c55d2a0a6937a40b6e0d39db30fcca", + "size": 4341 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/php/beta/models/list", "status": "success", - "path": "en/api/typescript/beta/tunnels/certificates.md", - "sha256": "a5b162622fe157d18b15e9852c4f6036ff49938d9030a602741e5a525729c138", - "size": 20869 + "path": "en/api/php/beta/models/list.md", + "sha256": "98cae1eab274bb72c7050f3dcc5f0df6538722489451c3790b6f1e6ff358bf39", + "size": 6880 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/models/retrieve", "status": "success", - "path": "en/api/typescript/beta/tunnels/retrieve.md", - "sha256": "e4effb475e8f79060230dc68d1189d8364473e00fdf9ac1a25534d9d8b29bebc", - "size": 4427 + "path": "en/api/php/beta/models/retrieve.md", + "sha256": "d41041b58f942e7c578090eada831af33ad16736c3de6238d96f48d791cfd880", + "size": 5533 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/list", "status": "success", - "path": "en/api/typescript/beta/tunnels/reveal_token.md", - "sha256": "026de85b6a79a84895fd8e0fa5987b9283d83853bff4ff592eb5e364c99e9882", - "size": 4140 + "path": "en/api/php/beta/user_profiles/list.md", + "sha256": "5581110b185c48c55e3f1e652d555fd519b723ca4005c7232ea35196191d0893", + "size": 5176 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/update", "status": "success", - "path": "en/api/typescript/beta/tunnels/archive.md", - "sha256": "5bbbab3b5b458186d57582ad36cd0a7cd221645bba33ff29a3309f8238ed8d6b", - "size": 4709 + "path": "en/api/php/beta/user_profiles/update.md", + "sha256": "fa1331701b0c32f4a0547185ff302ae36caa901919902d195bea7d4b46578c80", + "size": 6785 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/typescript/beta/sessions/create.md", - "sha256": "de84e5dea9a442358e864f97b07fde2013e328d39df3be5446502e297e7cedd1", - "size": 87121 + "path": "en/api/php/beta/user_profiles/retrieve.md", + "sha256": "f96408e32c4a15fbd065bbebba9514844a5ca8113cb28144a05e1e5ab3321f47", + "size": 4488 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/typescript/beta/sessions/resources.md", - "sha256": "5b25050b3e48c3efdb130c83456c5b9d588e089fc3c0a387b3d5b3f20210a8aa", - "size": 37407 + "path": "en/api/php/beta/user_profiles/create_enrollment_url.md", + "sha256": "b0b2f3156977a6ebe7b5610d53a76fbc7ab9fe96334ad364e93b2fb072898f21", + "size": 1973 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/user_profiles/create", "status": "success", - "path": "en/api/typescript/beta/sessions/update.md", - "sha256": "b79ffb597816df2c2aa4e0f5495d2d51d50d0fa244bf62b1a75043a9f13a3834", - "size": 71771 + "path": "en/api/php/beta/user_profiles/create.md", + "sha256": "5cc2d1c4dbf3878d9943392b36c6649373f5e29a919adfcf4a6e3c3d58df2af1", + "size": 6920 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/list", "status": "success", - "path": "en/api/typescript/beta/sessions/list.md", - "sha256": "20b948057dd2c9606641bdc5ec7d15ea1e490631796959e458fbdc527e3bba1c", - "size": 49511 + "path": "en/api/php/beta/skills/list.md", + "sha256": "4dc4b51c0a5ce7a7ecdcf8d7b71baefeae2d9affd5d97afd450c87d1d604898f", + "size": 3308 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/retrieve", "status": "success", - "path": "en/api/typescript/beta/sessions/threads.md", - "sha256": "e62ead5c557eb79f3d5cc3a255046aebe75f2569cab5e63a70e4cdf8ac23a3bd", - "size": 456601 + "path": "en/api/php/beta/skills/retrieve.md", + "sha256": "6d967a8532c8b697a7bdcd40c251d8a9b24085e02e7c5e9dd7238362ca09f61c", + "size": 2698 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/delete", "status": "success", - "path": "en/api/typescript/beta/sessions/retrieve.md", - "sha256": "bf36beec8131e1521ae191d39d5ec9e8b538c9fcfd2173994c9a24858a347519", - "size": 46595 + "path": "en/api/php/beta/skills/delete.md", + "sha256": "40b43a2b21e6326b0a41a929ae63c25ed9f1287cf82f0688876769da1e6125d5", + "size": 1679 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions", "status": "success", - "path": "en/api/typescript/beta/sessions/events.md", - "sha256": "d0c5a5398260e84ab55507fc998d98ac92ee7da68627fdf6d51dc3ef745177bc", - "size": 588289 + "path": "en/api/php/beta/skills/versions.md", + "sha256": "91fcfa98c1470157b78830ffc61c6b5fcd12dbeec5b24666a3430f5887dfa967", + "size": 13224 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/create", "status": "success", - "path": "en/api/typescript/beta/sessions/delete.md", - "sha256": "7946ddf0a1e3a3788f8711b2a8532ad6de52b1a07488c5a580708273ecb976e4", - "size": 3509 + "path": "en/api/php/beta/skills/create.md", + "sha256": "dc0a667f57be734a1e9d50d07d9720b3d18d8833c86667e51e1d435d525425ab", + "size": 3119 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/list", "status": "success", - "path": "en/api/typescript/beta/sessions/archive.md", - "sha256": "843cd92b712774be3b91b290c43275d43dc44e3ea685774cc92812c99c856751", - "size": 46612 + "path": "en/api/php/beta/tunnels/list.md", + "sha256": "0aa85265444fec25fa5e0c4e8b785c93d180eecda0d8e580f61a4208218a9a7c", + "size": 2979 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/archive", "status": "success", - "path": "en/api/typescript/beta/deployments/unpause.md", - "sha256": "7419b50a62ba072e474baf68f4aba3b0c0e0992a0c3b263169ccc91b51faaadb", - "size": 19733 + "path": "en/api/php/beta/tunnels/archive.md", + "sha256": "aaaffa6c9be755a89371415dd982e44b783ffa49054268a2a28423ffa086c55c", + "size": 2735 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates", "status": "success", - "path": "en/api/typescript/beta/deployments/create.md", - "sha256": "012eff81b6863fedce64a91616bbd9e8931402afb980c2525fd6f51079f09c22", - "size": 31381 + "path": "en/api/php/beta/tunnels/certificates.md", + "sha256": "8f799c96f9213e5d182e0574caf4be3c98c1a3bac727f6ee83160d5c5d42b382", + "size": 12633 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/retrieve", "status": "success", - "path": "en/api/typescript/beta/deployments/update.md", - "sha256": "d3a1a1ce84325aafaa2c5d81f65dba652168862fd7f27c6f438a5ca8c78cf19c", - "size": 31456 + "path": "en/api/php/beta/tunnels/retrieve.md", + "sha256": "927c3fbef23d61ffcfa63da5fcc8c9642fddd4656683331ec43365a540b9c486", + "size": 2452 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/typescript/beta/deployments/list.md", - "sha256": "69834a2af1afe5630a73e46d1e4ce4f7ad69055482ee5b915dbf9255062bcc03", - "size": 21109 + "path": "en/api/php/beta/tunnels/rotate_token.md", + "sha256": "2c646679f3111ecb05363f23c033351ff839f93c86b3c3e4cc857a5a0c3c7068", + "size": 2318 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/typescript/beta/deployments/retrieve.md", - "sha256": "20079a5ea5575373ef93d275c25a59e72b6296e6ec4b95c21232700870c8db5f", - "size": 19705 + "path": "en/api/php/beta/tunnels/reveal_token.md", + "sha256": "eabb7aae045d3fc4c487847db3428500c6354f5b539057f3b366b9c2022e3604", + "size": 2206 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/create", "status": "success", - "path": "en/api/typescript/beta/deployments/run.md", - "sha256": "6858af7749019383456eb4a6ea453335d5634ef372884cd8dd9d9cb4a4d0d898", - "size": 9618 + "path": "en/api/php/beta/tunnels/create.md", + "sha256": "6d3c228ca1ae96b8de5199119cb15fd13d64514aa8c401571fdfac4f33aea287", + "size": 2637 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/php/beta/files/list", "status": "success", - "path": "en/api/typescript/beta/deployments/pause.md", - "sha256": "59970477c978170d719d18ab3687a7cb7fef263f10bad1bae91c0e7ae8aaf8f4", - "size": 19715 + "path": "en/api/php/beta/files/list.md", + "sha256": "70236c2a8bd9a32c855e0672cc952fd547598e3e09bfa56426abf6c5e4cc2420", + "size": 3446 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/typescript/beta/deployments/archive.md", - "sha256": "772ff577cd63c171b0b667482b08a347f4540dab7493a6a34727758fd9183516", - "size": 19733 + "path": "en/api/php/beta/files/retrieve_metadata.md", + "sha256": "3232b216a10cb135f81452bd8cce74f237c8bfa6882ce2692325548311dcc2cc", + "size": 2574 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/files/upload", "status": "success", - "path": "en/api/typescript/beta/skills/create.md", - "sha256": "4ff8288cbbd86fba24adb539b7b403b6eeb296e81d099477f89b19272bd2205e", - "size": 5451 + "path": "en/api/php/beta/files/upload.md", + "sha256": "e1bf023984793213b88a8339b871bde3e23f95a33337134d679cbc5a5ecc5621", + "size": 3026 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/files/delete", "status": "success", - "path": "en/api/typescript/beta/skills/list.md", - "sha256": "d96baeff666e6dd716419405a3b3a2d090470c7868528e5ed2318d38a353ff9e", - "size": 5780 + "path": "en/api/php/beta/files/delete.md", + "sha256": "ee1e2538d14376e89432b21104f421b91e7f0725ee0bc3b54c3ab50e006ff5ca", + "size": 1520 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/files/download", "status": "success", - "path": "en/api/typescript/beta/skills/retrieve.md", - "sha256": "32b1980adf8cac84a36226b3b726b94c1a1abcde6c4ec8b8e0e69061c9e35e4b", - "size": 5154 + "path": "en/api/php/beta/files/download.md", + "sha256": "b0ab13a50a19654b2c377be1bc6d3d387f701d2d8e2a403495163fbe652be6bb", + "size": 1250 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/unpause", "status": "success", - "path": "en/api/typescript/beta/skills/versions.md", - "sha256": "1067b79f0a107e883f2c0c6ef258a03918e40e2f07d2027000f86327d90efda3", - "size": 23046 + "path": "en/api/php/beta/deployments/unpause.md", + "sha256": "c12e7f69495075a619d072aa22f71fc6078a2d41eea48be220185237b3b7ba83", + "size": 4680 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/list", "status": "success", - "path": "en/api/typescript/beta/skills/delete.md", - "sha256": "867f0b5ef22916d7a185e694a0ed71064d10c52cf4b05e4bb173e1c1ac0ab5f0", - "size": 3602 + "path": "en/api/php/beta/deployments/list.md", + "sha256": "d8df23c3bcefcab4dd5c69732975b32b255eaf69e389b54d424bcf255b169bb8", + "size": 6110 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/archive", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memory_versions.md", - "sha256": "ef38d0894b93eeeefba6d7422ff83fd0932bcf8459b094f1551756bfa963c7c5", - "size": 41592 + "path": "en/api/php/beta/deployments/archive.md", + "sha256": "1521f1ca9e8168c5f87c6c49c0bfa28bb62ecab7988c707782290e51cc63a595", + "size": 4680 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/update", "status": "success", - "path": "en/api/typescript/beta/memory_stores/create.md", - "sha256": "42d28aeaf113b4589b0a663cc00c5acac6e961b4fdcedd27390f2ca3bc8f4b04", - "size": 6568 + "path": "en/api/php/beta/deployments/update.md", + "sha256": "60edff9967f095b9228a0fafd8ec9b29a6114c74436713f2f3e75f6fa6421c73", + "size": 7471 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/retrieve", "status": "success", - "path": "en/api/typescript/beta/memory_stores/update.md", - "sha256": "d840974ade52b2c22f6b37b46d43ab2c9a4b45ec94f242517cfe5556deaf5db4", - "size": 6402 + "path": "en/api/php/beta/deployments/retrieve.md", + "sha256": "ea0cc82261c32a5138523e60a5ff721567ee35a9414443d2bc089b035c7834d6", + "size": 4651 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/run", "status": "success", - "path": "en/api/typescript/beta/memory_stores/list.md", - "sha256": "12aa4a2b3745ba0702e6ba12742cc0ae43ee89e40c17047e9f092293f80eca72", - "size": 6375 + "path": "en/api/php/beta/deployments/run.md", + "sha256": "2c036ed2d98410214e7dc083ae004d2e2fd80d8919f04feb2756ade491c6796a", + "size": 2676 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/pause", "status": "success", - "path": "en/api/typescript/beta/memory_stores/retrieve.md", - "sha256": "859f523473c0ce2076cc7c565fc625e6f2de692790dacf8af068ee80da9edf2e", - "size": 5586 + "path": "en/api/php/beta/deployments/pause.md", + "sha256": "05b2b2b247e5ebf5631a601140e54179e4459bc0c1da74b5028be5596ac71fd2", + "size": 4664 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/deployments/create", "status": "success", - "path": "en/api/typescript/beta/memory_stores/delete.md", - "sha256": "03e7fe48fbd9864072a4f64ba5350d81e6798726940f3e86c19061fbb25e8970", - "size": 3854 + "path": "en/api/php/beta/deployments/create.md", + "sha256": "5c9a9ab3fdda4378746b5991e4d8562171099e8a5bb5e5b8320ae5f53d01092a", + "size": 7163 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories.md", - "sha256": "fbb59bf467d46a5bd629161ade4dde7badc765078bd54409874efa5f2a06fdd8", - "size": 50905 + "path": "en/api/php/beta/sessions/events.md", + "sha256": "4c019ed077c5bc7758941f1271407609dcf656d091e43cda51e6b1a35d25c3ee", + "size": 142866 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/list", "status": "success", - "path": "en/api/typescript/beta/memory_stores/archive.md", - "sha256": "f01bebc7b06f5944c4619523f640e6dc5c6fe166cdc1cb6c4bb7d8105c240b46", - "size": 5678 + "path": "en/api/php/beta/sessions/list.md", + "sha256": "aa58d32e8cc6d60a0db7ef646240a5dfbe6b1f2dbfd4a83e2c7c2c44e825c132", + "size": 10737 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/archive", "status": "success", - "path": "en/api/typescript/beta/files/download.md", - "sha256": "a3e356e25c9d77a16951f4b2d5ee6238d272cdf6d026a8a5a9222a6267d8be9e", - "size": 3226 + "path": "en/api/php/beta/sessions/archive.md", + "sha256": "771b9a68f61dc38c490f0f06a7d9cf2dc9fee1df8f162a9903cf1492190f1f52", + "size": 7724 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/update", "status": "success", - "path": "en/api/typescript/beta/files/list.md", - "sha256": "0da22168bda6c5341ab291c11152c4723f2de7fb69ac182313cd731ef189a6db", - "size": 5648 + "path": "en/api/php/beta/sessions/update.md", + "sha256": "7e6c3235a26fb54dc5e307ce81863758fea3e334f8de651ec9e91c4255e673bf", + "size": 9984 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/retrieve", "status": "success", - "path": "en/api/typescript/beta/files/upload.md", - "sha256": "14ec2ccde36b5c5c329a02677db9b45b11fd6722af3c3e7cb8cba21a7f357544", - "size": 5213 + "path": "en/api/php/beta/sessions/retrieve.md", + "sha256": "fe31de60ee8b2e319234865b5cac17ea5c1c9eb4b929cf3ec6332cfa55023015", + "size": 7706 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources", "status": "success", - "path": "en/api/typescript/beta/files/retrieve_metadata.md", - "sha256": "f3defedbad4cff557a54807e9ce60eb508ab7fc1b8ac28046f819ed73e06f291", - "size": 4806 + "path": "en/api/php/beta/sessions/resources.md", + "sha256": "ed9cb796cd35c9f73a855cee017bb80d5b9471b3a1897a2b930f30049956d213", + "size": 18197 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/delete", "status": "success", - "path": "en/api/typescript/beta/files/delete.md", - "sha256": "83de44409c9298ae131210c1b8b72fac3a987880d1ebe9fe757059c7b8a296c7", - "size": 3451 + "path": "en/api/php/beta/sessions/delete.md", + "sha256": "604a18585dbe2912eefe16a5d8162c12eced2b6964cf1b3e62cc3f2b0e833d5d", + "size": 1532 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads", "status": "success", - "path": "en/api/typescript/beta/messages/create.md", - "sha256": "d67286871b06b1db7fbf0eab5bcb63b934a0d25a5456888347944248d9cc8c1f", - "size": 312903 + "path": "en/api/php/beta/sessions/threads.md", + "sha256": "c086307a486a5bc8d8f4567cf295b8d30e264ecb012a6e3d41eea572a5ab4ef7", + "size": 90768 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/create", "status": "success", - "path": "en/api/typescript/beta/messages/count_tokens.md", - "sha256": "f31f591206293c9098384270fc3cd07b7077da679336cedbd58c42fb41db1ddb", - "size": 148721 + "path": "en/api/php/beta/sessions/create.md", + "sha256": "8dc774b8f3aa0091ac9072663a812a74e4f8400f668bd5b5f47056b425c273a3", + "size": 9695 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/list", "status": "success", - "path": "en/api/typescript/beta/messages/batches.md", - "sha256": "6924d48a9f7eedeb54325b74c553945ac4d94a8baa736e35d50bbc2e8f07c823", - "size": 807203 + "path": "en/api/php/beta/memory_stores/list.md", + "sha256": "a69b21081555227f1fb4d9f6afc1837e80c6852cc84cb4db9bb3592d6d8779ab", + "size": 4312 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/typescript/beta/messages/batches/create.md", - "sha256": "fa2b386cd6ee9ea2b1d7f66a3cbf24eb9e74fb46d9eff92884ad5fea9fb78252", - "size": 174167 + "path": "en/api/php/beta/memory_stores/memory_versions.md", + "sha256": "17753008bfc123a7ef48b6c1be2afae0f6f540458abdb3011f583a04c68b1806", + "size": 22676 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/archive", "status": "success", - "path": "en/api/typescript/beta/messages/batches/list.md", - "sha256": "27b736682f341d292299890416187aa68f1221c8479f51d1441af773265a4bf7", - "size": 7703 + "path": "en/api/php/beta/memory_stores/archive.md", + "sha256": "f14a3b143c3990cfab9fca90bdb8c617346b3cab80e992c840247b9f9a2236c1", + "size": 3497 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/update", "status": "success", - "path": "en/api/typescript/beta/messages/batches/cancel.md", - "sha256": "d4f8264e1d4b2fc496bb59c527e564b85aa97a68e268deca22a3b43bffbf1c79", - "size": 7509 + "path": "en/api/php/beta/memory_stores/update.md", + "sha256": "4bac1560093f42ac048d03635d906177ec584f3812059bc7309dc51be0cecd14", + "size": 4289 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/typescript/beta/messages/batches/retrieve.md", - "sha256": "72cebb3d935e30a71c80ab8f4b5fa56dabf398a593478fa7cf0eac8a710fdbc8", - "size": 7203 + "path": "en/api/php/beta/memory_stores/retrieve.md", + "sha256": "3811f58a14586c7159a77e13da640f63b94ef5494518c3993f9711d52628ed7d", + "size": 3400 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/delete", "status": "success", - "path": "en/api/typescript/beta/messages/batches/results.md", - "sha256": "3f2e65cb3486a7b593079e3ea5b86d7b03e14477886dc01fa539afdb443fdf8c", - "size": 156903 + "path": "en/api/php/beta/memory_stores/delete.md", + "sha256": "9ba6980345fadf9025692d706e39944044febd11da3dab8f74036a5a6b4014fa", + "size": 1880 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/create", "status": "success", - "path": "en/api/typescript/beta/messages/batches/delete.md", - "sha256": "78ec5657bcf4e85a0efd67d8b6dcf1707f52af3a54e97cbdbe9f6bbb31253663", - "size": 3949 + "path": "en/api/php/beta/memory_stores/create.md", + "sha256": "76a119d3e84c85fdc133c930757df4276e5ee099a3f44f6a89ab660bcf977f92", + "size": 4441 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories/create.md", - "sha256": "c3cbb60caa48c14db5f33ceac4711fdff79b4755cf43a3bc4943e6590f4f21bd", - "size": 7382 + "path": "en/api/php/beta/memory_stores/memories.md", + "sha256": "6f540a7db6aa4ac6f98dea951023b6a89a9805ea693efd4f1676b1b84da929df", + "size": 29982 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories/update.md", - "sha256": "9037ad2bcebe7da7c68e5afb717d474877d27526c736357d87451bf41599e246", - "size": 8128 + "path": "en/api/php/beta/memory_stores/memory_versions/redact.md", + "sha256": "b0d65caeb996d9e554d27b5ca950267ad2bbfdee766b4f8f58083151bf8707c2", + "size": 4990 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories/list.md", - "sha256": "463aab7ac046ee03c7f864061efd2f4381dde1449038caabb5bb5c9da82a0dda", - "size": 9034 + "path": "en/api/php/beta/memory_stores/memory_versions/list.md", + "sha256": "2bf94f2038a6354cf3792a9a7d21218ac5fa259bb0847e67020645702dc556e7", + "size": 7450 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories/retrieve.md", - "sha256": "efffacb149a8397861ed395f5037824b6bc016b007bac83ad2652523b22a8b41", - "size": 6883 + "path": "en/api/php/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "dc8c308ef6962b50ee2ff678f325d62db7fe165d8cc7c7985b0388b18fe6a14e", + "size": 5440 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memories/delete.md", - "sha256": "273272c11022d487129251f67cced86810798ca457edc23da3dcc239e387abd9", - "size": 4730 + "path": "en/api/php/beta/memory_stores/memories/list.md", + "sha256": "ccce8c19d80fd54e500f34dea7baf2932d8a7c294579fc1beff0333ac19570a7", + "size": 5673 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memory_versions/list.md", - "sha256": "bf4c17ad6cb8047fd9486b40d1023c9346453179dae6975e5d20710421c5403b", - "size": 12342 + "path": "en/api/php/beta/memory_stores/memories/update.md", + "sha256": "ee26b99f0ea6ff0f5f9bb55087c5c204d9ef1e2caae405c8c6e5b24cd9e23af5", + "size": 5255 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "aaa9a805cfca6a4514212ef29df52dc994b474e3f1b225a2f5ec49e45f54f617", - "size": 10288 + "path": "en/api/php/beta/memory_stores/memories/retrieve.md", + "sha256": "adf044082b62dff399533ee377675fb09ccb6cdbc0505bfd8c4b7ed8dc3fb214", + "size": 4216 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/typescript/beta/memory_stores/memory_versions/redact.md", - "sha256": "697191dbb8a8cc893d5f7e1553b5766636e988e6139383f6f500926a1ccbba4f", - "size": 9659 + "path": "en/api/php/beta/memory_stores/memories/delete.md", + "sha256": "cc38c93da1e511bab458eb52098d8aa03091b705bd5d3b0f697cc131aab825f2", + "size": 2236 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/typescript/beta/skills/versions/create.md", - "sha256": "1b5e34e7de9d3a86791110675be9291998c081088a67b49a4228c48281ffcbcb", - "size": 4720 + "path": "en/api/php/beta/memory_stores/memories/create.md", + "sha256": "0b9c1a30bcbe67618063e0d6a5873fbe69129b8324195afba098952c1cac9ffd", + "size": 4677 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/list", "status": "success", - "path": "en/api/typescript/beta/skills/versions/download.md", - "sha256": "5dcf01ad9e2f710c62b31df2b97da46e3f7331c964d601a09466357561170051", - "size": 3689 + "path": "en/api/php/beta/sessions/resources/list.md", + "sha256": "dc6068308eafd38ae597c820094821df4bb55c95028e01fd31b65abd5f82854d", + "size": 4034 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/update", "status": "success", - "path": "en/api/typescript/beta/skills/versions/list.md", - "sha256": "e4c2acd6e147c12cfaa2af62a790cd74ac5e66c776b0dfccc30313804699649c", - "size": 4910 + "path": "en/api/php/beta/sessions/resources/update.md", + "sha256": "d591af9f07f6dc66ef2d406d4996d3d0349b607adf29215b112665c80e1fce3f", + "size": 3680 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/typescript/beta/skills/versions/retrieve.md", - "sha256": "86732de41e8f671457eebbb006a6c1f50122fff6701779564a0cc0b50f947f18", - "size": 4809 + "path": "en/api/php/beta/sessions/resources/retrieve.md", + "sha256": "6481addabcb5049b3e0f8dcedaf834e88643a9c3561223f512e2be52f8263da6", + "size": 3455 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/delete", "status": "success", - "path": "en/api/typescript/beta/skills/versions/delete.md", - "sha256": "034a94979af2d4a90642409591277f895a7e893d6fc13261ac55efcd5dd49275", - "size": 3996 + "path": "en/api/php/beta/sessions/resources/delete.md", + "sha256": "8276732c26b432b16e47ec09ed1dcb5ab3691794c40f52fb9179a90495e93b06", + "size": 1766 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/resources/add", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/list.md", - "sha256": "6b216d902ed7dfd8b68a41e3a977fa504323e5332753462311ae60b4e5ef50f7", - "size": 34858 + "path": "en/api/php/beta/sessions/resources/add.md", + "sha256": "0d94c0c85e2e75a08eba7f9f260e423f68c6d05466b3f14f8ae1143df5356c35", + "size": 2217 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/retrieve.md", - "sha256": "fd00631aae5226f7067c6a8cb2708368d87239b7823e2f561da383a555c88fa9", - "size": 33923 + "path": "en/api/php/beta/sessions/threads/events.md", + "sha256": "530d7a34e24c9f99b9b25d3613c4bc6c6f10cd8336c8b2c011d1499efe5f6af2", + "size": 49585 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/list", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/events.md", - "sha256": "e31e58abd7b0c990edab3b0921c2bafb77e85cd633c17dcb2045140c5e156ffe", - "size": 202786 + "path": "en/api/php/beta/sessions/threads/list.md", + "sha256": "75daea1205c95749dae96da78f0d1ee3b947a7f5c4fd9c3b1aa1eee465ff6a23", + "size": 5631 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/archive", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/archive.md", - "sha256": "6a8a10e36c6103c66347a39998740ced1a0436290fda2e3cd5e127ea411b7c2f", - "size": 33940 + "path": "en/api/php/beta/sessions/threads/archive.md", + "sha256": "3c5f955d38e69bd483bd9c9b741728ffb234b013d17675b808aff18be52302aa", + "size": 4698 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/typescript/beta/sessions/resources/update.md", - "sha256": "1305323434552ed2446baf1767e7817883299167179d076d53955825d5175c50", - "size": 6490 + "path": "en/api/php/beta/sessions/threads/retrieve.md", + "sha256": "19f0e30a41d2eaae94a922ee4930d2c334900c541b1142015607007969ceef3d", + "size": 4680 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/list", "status": "success", - "path": "en/api/typescript/beta/sessions/resources/list.md", - "sha256": "058533c1ab4e541acb406d2a7cceb945b45f13022ba375d8e1cbb7d51febf09f", - "size": 6890 + "path": "en/api/php/beta/sessions/events/list.md", + "sha256": "5dce181ea701c6bf93fd262b2482437ee4c19d16b098cfb70c96a7db5d45d760", + "size": 25607 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/stream", "status": "success", - "path": "en/api/typescript/beta/sessions/resources/retrieve.md", - "sha256": "02c1ac3442bd74b530571e47457c34cff4ea854dfef2168140665dec16a2b251", - "size": 6267 + "path": "en/api/php/beta/sessions/events/stream.md", + "sha256": "2ca7b772b7f25cba70c32b7e7f32d574bbbdd2abdcf1704d01819f1aa5e3a0ad", + "size": 25376 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/events/send", "status": "success", - "path": "en/api/typescript/beta/sessions/resources/add.md", - "sha256": "c5e832ebb423a052af1ea9bde1147bb1962613ee7fc94a82c2ead1fc7b4db48f", - "size": 4174 + "path": "en/api/php/beta/sessions/events/send.md", + "sha256": "d485d4900e6322b7ba893f057997ce0087312f44319e6e4abb1409dcdbfe41e5", + "size": 2014 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/typescript/beta/sessions/resources/delete.md", - "sha256": "44dfd1d967e7a9e56edae8a40243d2e63eda1fbc8d8dd63c6518cd099edddfd8", - "size": 3711 + "path": "en/api/php/beta/sessions/threads/events/list.md", + "sha256": "06b4b28d7147897a7170c3ca2c1f0cc75e8676004ff9b2dba0d7b75ae72bddc5", + "size": 24130 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/php/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/typescript/beta/sessions/events/send.md", - "sha256": "8199569ac3249ed76c962663b4b5537a88c1e772cecb1f14b5a5296cf5a155f4", - "size": 26726 + "path": "en/api/php/beta/sessions/threads/events/stream.md", + "sha256": "f538e8d2c1b42395ab20f5a8f530a0159dcaeaf2b17378b9a8c7fde1fe083d61", + "size": 25589 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/typescript/beta/sessions/events/list.md", - "sha256": "1699d065e0c6744ca0ffdba5af61cf6a031a6fb53d12c1beabff8f0ebc00321d", - "size": 102325 + "path": "en/api/php/beta/tunnels/certificates/list.md", + "sha256": "4bdc96111adfd5e8f5825cbe666abdc74a7757e72629722596949fd6b741b0e5", + "size": 3289 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/typescript/beta/sessions/events/stream.md", - "sha256": "c86fe3a998aef42a4f6279edb97ec83d14c689face92b033678ed0b28254c117", - "size": 102830 + "path": "en/api/php/beta/tunnels/certificates/archive.md", + "sha256": "194be18da7d6dbd9a44f5b1814e3f51c41c33c229a0064e301bd0f23479ee482", + "size": 3058 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/events/list.md", - "sha256": "e1cd0cc442d246349452256c3ac462aaf9fab0f800906cbe2ace776015f59145", - "size": 99890 + "path": "en/api/php/beta/tunnels/certificates/retrieve.md", + "sha256": "a1871f3d782d8c6232d85920f44b28613926c627c5f481e5f23971c7daaea8ad", + "size": 2821 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/php/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/typescript/beta/sessions/threads/events/stream.md", - "sha256": "5cc7175ee4308ace05afb461319ff1606d23bf30fe273749e1cd4be99a1f339e", - "size": 103037 + "path": "en/api/php/beta/tunnels/certificates/create.md", + "sha256": "4a100173d84a78630e4fa6316f460ca8764fd19ab4332747e58a8e23c6397c71", + "size": 3058 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/list", "status": "success", - "path": "en/api/typescript/beta/tunnels/certificates/create.md", - "sha256": "988a6ff1ee559c734f0e932a52465390fba46a8be0265daa9f9531dc6e61f3ba", - "size": 5095 + "path": "en/api/php/beta/skills/versions/list.md", + "sha256": "4bf7daa8cad8c1e543d3c4a73f28852e91744adc77361e2457e7aae371b41ec6", + "size": 2900 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/typescript/beta/tunnels/certificates/list.md", - "sha256": "239f2add479cdc08f845b19c346683b0bccdadf3f51e891ac4f18a93700cef54", - "size": 5321 + "path": "en/api/php/beta/skills/versions/retrieve.md", + "sha256": "03603cab7e6f8a95fc3e658b613dbca5943fb8479361a951f4c4adf668c6e6a9", + "size": 2855 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/delete", "status": "success", - "path": "en/api/typescript/beta/tunnels/certificates/retrieve.md", - "sha256": "4eb0996af50b7fcee2f06558e5aaec8c8080cfa96552c5ca2cfef2e9718c6d43", - "size": 4849 + "path": "en/api/php/beta/skills/versions/delete.md", + "sha256": "617f3150c186d0c6361ecac118117db36fbff1ee82a425b09767b43a26f3cc52", + "size": 2062 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/download", "status": "success", - "path": "en/api/typescript/beta/tunnels/certificates/archive.md", - "sha256": "d754572e878acc7acd5cbb21583e1cf2c256241c58710fcc845a28737bca2ecb", - "size": 5085 + "path": "en/api/php/beta/skills/versions/download.md", + "sha256": "b4dcb8720cede8f1b2e20eb2eae060366702324335a18f6ad517224facf24e0f", + "size": 1717 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/skills/versions/create", "status": "success", - "path": "en/api/typescript/beta/agents/versions/list.md", - "sha256": "28c47fcd5bdd1f1edbf202901b60e97fa476218b2ec3528a61ba4e0628adb020", - "size": 31331 + "path": "en/api/php/beta/skills/versions/create.md", + "sha256": "3cfa1c0386348a809ddec2c7047f04a0edcc3992f13bac4f9330708a12c51aa1", + "size": 2850 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/list", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/create.md", - "sha256": "2e3ef296b7b5bffdc288dd966389db666ae521f9743c5caa8f01abcf50cee7e3", - "size": 13762 + "path": "en/api/php/beta/environments/work/list.md", + "sha256": "2de14e1592c311cc1689e9ef64e18b175bb7a2178a2919a70a14d45be82aaeb3", + "size": 3164 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/update.md", - "sha256": "0d73461f555888efbc083a5faef8899a26d387b53a7a70a6856dbd47108ddd2e", - "size": 13322 + "path": "en/api/php/beta/environments/work/heartbeat.md", + "sha256": "a1f1482f8e1691617ef1a153ac0ff66a4bebb3b7672a8365b2ab1eddd358d69d", + "size": 2525 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/update", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/list.md", - "sha256": "547544ce99bff47c9a848d986fdf43cca18816b6d680c3055d5a3ddaf105645b", - "size": 8968 + "path": "en/api/php/beta/environments/work/update.md", + "sha256": "6f6c248d97652e76b2c897f22eb210f0173c5adf0b1d812d2003b9fbe67842a1", + "size": 3573 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/retrieve", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "56c0df8b9c1aba9d17eccaccb02b1de12ab05f2aada719383f395ea8bfbad504", - "size": 7187 + "path": "en/api/php/beta/environments/work/retrieve.md", + "sha256": "3a581532aa1a52af93b84af81bdf9e47549a7b92749efcd088856d59b0c968d7", + "size": 3356 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/poll", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/retrieve.md", - "sha256": "56cad22160b05700ec2a4d31534127514669aeb4653d936f9473ab483e5d8bfd", - "size": 8423 + "path": "en/api/php/beta/environments/work/poll.md", + "sha256": "d34dd88380b48cc0987f4991b6072b51d17ea823e27784959b53142fa4f982b5", + "size": 3504 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/stop", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/delete.md", - "sha256": "29f129bcfc640608989fe34a0328b5f5d6d4f820f0695cb23e3f5d98fdfc7535", - "size": 3848 + "path": "en/api/php/beta/environments/work/stop.md", + "sha256": "0e89bfffb4fe6cb0d7a3e4290290ded92ea2f7a73804a1f6120a17836a100efb", + "size": 3474 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/ack", "status": "success", - "path": "en/api/typescript/beta/vaults/credentials/archive.md", - "sha256": "96772b8b12140a3a29a1f8c1d51c3edbf711d93c0f8453131d353bfe590348e8", - "size": 8424 + "path": "en/api/php/beta/environments/work/ack.md", + "sha256": "463062dccc9c63dac028ed95e61de20ba33366e58ada16ea9ab4ed1a45503322", + "size": 2970 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/php/beta/environments/work/stats", "status": "success", - "path": "en/api/typescript/beta/environments/work/update.md", - "sha256": "fa2fb0fb853cc132f505ab25a750ced744e92db6ead5aa7e7bfb37ec206b28dd", - "size": 6025 + "path": "en/api/php/beta/environments/work/stats.md", + "sha256": "50e189daafcc5be37cad8c27329693d5c8d7855f4c417f25b738ffcbf3c4929b", + "size": 2151 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/php/beta/agents/versions/list", "status": "success", - "path": "en/api/typescript/beta/environments/work/list.md", - "sha256": "4f17aeb87fef2f07fca3b177e67f5f2c39eee53faefdd56a5512d7175f5bcf1b", - "size": 5775 + "path": "en/api/php/beta/agents/versions/list.md", + "sha256": "b15106002bb47ace76e2f600698156ea43485f23310704c15ebe0e4e7d8f9573", + "size": 5166 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/cancel", "status": "success", - "path": "en/api/typescript/beta/environments/work/stop.md", - "sha256": "f7bc06eacd8f418a6cd2da9c6afa747fe518c3f872f9585962fa6531bdfa357e", - "size": 5897 + "path": "en/api/php/beta/messages/batches/cancel.md", + "sha256": "6e2b22c5c809e5dff85e6a305735da0d9411313330fbc80654aaa152aef1e997", + "size": 4460 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/list", "status": "success", - "path": "en/api/typescript/beta/environments/work/retrieve.md", - "sha256": "3bef78950cc8d033debd81caf6476c3155a24a511cce6c58eb7adb1f7dcc2c52", - "size": 5830 + "path": "en/api/php/beta/messages/batches/list.md", + "sha256": "39310ce74a57608662dc517111424530c2abc91657e6a5f427c35c3e418a72e0", + "size": 4659 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/typescript/beta/environments/work/ack.md", - "sha256": "227d9232c16ef826334599cfd95e56386cf2315c55d397fad3e50bd36c400208", - "size": 5511 + "path": "en/api/php/beta/messages/batches/retrieve.md", + "sha256": "69ef30966238cdbdd759ff19e8132475e7fe0751354a821cfaad8957ef0e5c41", + "size": 4152 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/results", "status": "success", - "path": "en/api/typescript/beta/environments/work/stats.md", - "sha256": "069d0d706bf2f6aaf86cc16fa8a45e0860d54a6d07ca3099e1a6b711db61a2cc", - "size": 4248 + "path": "en/api/php/beta/messages/batches/results.md", + "sha256": "71664e0a56f46cd3e063214da5060bce7a73234f57426a38889db5e38aae2497", + "size": 2436 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/delete", "status": "success", - "path": "en/api/typescript/beta/environments/work/heartbeat.md", - "sha256": "bf8a919ec9963c45fa9adf25edf112c41653a1803b03917cc8c55be7acf5d2a8", - "size": 4600 + "path": "en/api/php/beta/messages/batches/delete.md", + "sha256": "f0c1c3d506b2639c2bb308631c35660ef2e9186546804cf33277684347c47b58", + "size": 2005 }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/php/beta/messages/batches/create", "status": "success", - "path": "en/api/typescript/beta/environments/work/poll.md", - "sha256": "d549ad54802d214c973912cd81f89dcc638b751ecb8893ef9571f0c3f971fbe6", - "size": 5711 + "path": "en/api/php/beta/messages/batches/create.md", + "sha256": "025bd31a90e144da21df22b8f5ee479141e1845cdb8fbec1342a09c706e75f3c", + "size": 8567 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/list", "status": "success", - "path": "en/api/python/beta/sessions.md", - "sha256": "31a8242bb95e5144a8fb79f91894d0b1654ad1c29b9afc76867f37bb8493c808", - "size": 1170714 + "path": "en/api/php/beta/vaults/credentials/list.md", + "sha256": "6b7870c10422960095e3523bd21fa61f14b9b6c6637fde13996dcebc6a788dbd", + "size": 3269 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/python/beta/webhooks.md", - "sha256": "7be33dc2c44044b6345a3a14edc3b45b3105e172a291cd0fecf4234256d5de19", - "size": 36380 + "path": "en/api/php/beta/vaults/credentials/archive.md", + "sha256": "25b09b5364612e77f3112ba969f8508cb8d76696174b2688d9f6b53609aebf3f", + "size": 2752 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/update", "status": "success", - "path": "en/api/python/beta/skills.md", - "sha256": "97a0187f329427becec5c453e19abe1aca60cc355f6087f72bb392a6952d4276", - "size": 42154 + "path": "en/api/php/beta/vaults/credentials/update.md", + "sha256": "e5c0d8a5ce7d872ddfc3bff711592ec8f1340a00bdc81031bf2228285a5ed9e6", + "size": 3616 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/python/beta/agents.md", - "sha256": "ad57503e4b80a3d28f98a5a14495b3cde149895a875808e7bb37acab16141a8b", - "size": 451036 + "path": "en/api/php/beta/vaults/credentials/retrieve.md", + "sha256": "cc88303cd4490e5ae3c9d58bc5585c9a2000e71783ee9aeb5d043e786cdf69e3", + "size": 2750 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/python/beta/deployments.md", - "sha256": "4e39a0dd7753a98de6fcbe3ab885cb6c9c89767414e30e8612fa9ac98159aa0a", - "size": 218429 + "path": "en/api/php/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "3b1b3fca6112665a0a32937779c0b9e4ee8a4075b813928703e549d2e9186353", + "size": 3178 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/python/beta/deployment_runs.md", - "sha256": "d1239596c6f5759ed60592c80c10f967a22e557305b3bce0036fc663697b9d56", - "size": 32339 + "path": "en/api/php/beta/vaults/credentials/delete.md", + "sha256": "5cf405e9fed9cc24eb4ba505e9440947b1f443fdb60a3e5b9c4703733cba6bb5", + "size": 1894 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/php/beta/vaults/credentials/create", "status": "success", - "path": "en/api/python/beta/user_profiles.md", - "sha256": "372c7914915906ebf000a47b25656d26e431aeef32377f9fcb4d96c4b44db2ea", - "size": 66316 + "path": "en/api/php/beta/vaults/credentials/create.md", + "sha256": "2a6e1f2f94c66bf22479c16ba14bb6cf5f6ac16a0bb7238f0b0f8eb05e6412fb", + "size": 3207 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/models", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/cancel", "status": "success", - "path": "en/api/python/beta/models.md", - "sha256": "09d72b51e358c511941391b956f3bbd0e087754b4a791e5e8e78151649ad5e82", - "size": 44340 + "path": "en/api/php/messages/batches/cancel.md", + "sha256": "911022ce5cf4e7f201d12ea0ed3402ff12ca36f21ab7b1dc4aba19fbcfffe544", + "size": 4189 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/list", "status": "success", - "path": "en/api/python/beta/vaults.md", - "sha256": "b575d66efde8536febe452eaa0903150383763340e5b59cadff24894ae45477e", - "size": 84430 + "path": "en/api/php/messages/batches/list.md", + "sha256": "6dd8f7bf735f417253dafcf9b8c8ea8822d75d7322525d430ffd0f67a53241df", + "size": 4399 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/retrieve", "status": "success", - "path": "en/api/python/beta/memory_stores.md", - "sha256": "071deb37a4a02536cf0ca5bf38eab1b75db906bde5efe8516a57856aee39a0bb", - "size": 101172 + "path": "en/api/php/messages/batches/retrieve.md", + "sha256": "354d5a124a51a4eed1a12534f2e701e194bb5f7874b70bdb3bbd3b0101331c47", + "size": 3881 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/results", "status": "success", - "path": "en/api/python/beta/tunnels.md", - "sha256": "15d978fa2ab78a1776f4b8066e77c79f9eb74e0e96c7e65c1c37702271cd433f", - "size": 45882 + "path": "en/api/php/messages/batches/results.md", + "sha256": "84d8fa8e00d89ef1784794f2c22f856495cc8422f974204de01bdb83e64144c9", + "size": 2153 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/delete", "status": "success", - "path": "en/api/python/beta/environments.md", - "sha256": "021ae566ba96ba1ff9d534cea1afc102a8b8540bfbf9b74bd6561a0087207842", - "size": 95159 + "path": "en/api/php/messages/batches/delete.md", + "sha256": "8a2680b484a8ce099c9691f30f103c8e7134d643c94e8937fdf6fe0a59e39e16", + "size": 1734 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files", + "url": "https://platform.claude.com/docs/en/api/php/messages/batches/create", "status": "success", - "path": "en/api/python/beta/files.md", - "sha256": "651f60cf6b868d41c7afd6e91593fc6136a714bb67c1c0dc478cb417e708ea07", - "size": 22826 + "path": "en/api/php/messages/batches/create.md", + "sha256": "c89ed0f723f16958aa4e461228128f38068b9c81a11318141c5a3c21ae9c27bf", + "size": 6764 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages", + "url": "https://platform.claude.com/docs/en/api/java/messages/count_tokens", "status": "success", - "path": "en/api/python/beta/messages.md", - "sha256": "8da7512de5f4fe39ddc287ca54b93a3002a2654bcb41fd0ad1a0ebb67749f5b0", - "size": 2931560 + "path": "en/api/java/messages/count_tokens.md", + "sha256": "a306a8b2fab8baae60dd6653866dfe9b5a9f99c922e8af3204268509d1020f14", + "size": 93192 }, { - "url": "https://platform.claude.com/docs/en/api/python/models/list", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches", "status": "success", - "path": "en/api/python/models/list.md", - "sha256": "4e69ccb5164826bcc8807b1bfd84b023d6b7529f1a86d947b80548332f449a7c", - "size": 13061 + "path": "en/api/java/messages/batches.md", + "sha256": "b4cc3b438c3173b65d676508f9cd3905b3d6d83c0750b2f9418067421d70552b", + "size": 279081 }, { - "url": "https://platform.claude.com/docs/en/api/python/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/messages/create", "status": "success", - "path": "en/api/python/models/retrieve.md", - "sha256": "03c7308aa80bc4cfc9b032f39a4add04a6934b7068a2b1bd71b8339f1e9105e0", - "size": 11756 + "path": "en/api/java/messages/create.md", + "sha256": "139ea900bec48939890cffd6c81d53f49ea277df3b42d5e8b82f49f08062f3e6", + "size": 133521 }, { - "url": "https://platform.claude.com/docs/en/api/python/completions/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults", "status": "success", - "path": "en/api/python/completions/create.md", - "sha256": "1c11acbf4a7c36e7c01e5c119417d5383e5e742e7d923c6d2870f4c4778a8edb", - "size": 13301 + "path": "en/api/java/beta/vaults.md", + "sha256": "e9c3d8321cc39d2cb3a00d4ca66835a8bd6f7e88638c8523a9ac79cfa1dbd1c4", + "size": 109161 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs", "status": "success", - "path": "en/api/python/messages/create.md", - "sha256": "78721e0a29b117fcf5e37eeb67e9283b95bb06fb1441751dc1e942353096ade0", - "size": 138100 + "path": "en/api/java/beta/deployment_runs.md", + "sha256": "800388fa96e3b312564ab0ccb265e283219df9eeffea66ddce09a8784998df4d", + "size": 33780 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/java/beta/webhooks", "status": "success", - "path": "en/api/python/messages/count_tokens.md", - "sha256": "d923b7c8299d32b925601b5b8dc711a82f5b37284900c51a94de0fdce7745392", - "size": 96229 + "path": "en/api/java/beta/webhooks.md", + "sha256": "0903773152aa3929c8d1302439e93e3ec74687782767045590f160c54fc954c7", + "size": 37222 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches", + "url": "https://platform.claude.com/docs/en/api/java/beta/models", "status": "success", - "path": "en/api/python/messages/batches.md", - "sha256": "aadc56f5f638aaaa7a731f3554af04160b3d73bf24522ef9125141bb40cef0d1", - "size": 280747 + "path": "en/api/java/beta/models.md", + "sha256": "8da4b4500857331a66505c5c5986d892338de68213a41b3494f9c331991c3026", + "size": 47970 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills", "status": "success", - "path": "en/api/python/messages/batches/create.md", - "sha256": "08fa876004eca5831202efb71d8503b77761ac29869c89894c22958b81169693", - "size": 111023 + "path": "en/api/java/beta/skills.md", + "sha256": "29a3fe251b401399dba1ba60668d8d23a553a3495266692730287b9ee1a1a067", + "size": 59581 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores", "status": "success", - "path": "en/api/python/messages/batches/list.md", - "sha256": "8ed1db0a6767cb02ffb6cd6ba09290c0fafa516b783e3edf130a9938c73d43c8", - "size": 5455 + "path": "en/api/java/beta/memory_stores.md", + "sha256": "e8e5833d60e45b6acc7739014cd1f5c70da261ee34fe506b2b02acdd8a1800cc", + "size": 125838 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages", "status": "success", - "path": "en/api/python/messages/batches/cancel.md", - "sha256": "2c6dfa35934fe1d7d2d15fad2f50fb8dcacb057624b35eeef6664c0a09be6b3b", - "size": 5321 + "path": "en/api/java/beta/messages.md", + "sha256": "862574225bd56ec044bb96a9aaff11352a7c3ca16a8601db2565b245def573b3", + "size": 2920727 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents", "status": "success", - "path": "en/api/python/messages/batches/retrieve.md", - "sha256": "b41e490112e56042477095dda97d1a6e848b1ad3c940189d5fc96b4e6ab125fa", - "size": 5013 + "path": "en/api/java/beta/agents.md", + "sha256": "0d53bee1dd910ca31c37e0088cd4334af71dccab438d3f01a0dabdeea2b0b4ab", + "size": 448902 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions", "status": "success", - "path": "en/api/python/messages/batches/results.md", - "sha256": "b6f955943f0d3c001dd02748169e7a9aeb822c80a751e958681055da2e614d4e", - "size": 39456 + "path": "en/api/java/beta/sessions.md", + "sha256": "362c951acf82643b684c47d3342ad7519d52dfb0ded934a4be1a3ab4f8d27c1c", + "size": 1181316 }, { - "url": "https://platform.claude.com/docs/en/api/python/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles", "status": "success", - "path": "en/api/python/messages/batches/delete.md", - "sha256": "0301eadc5ae4c3f4eb9222fb8bb2d9f5c5c3bc93aeba9f9ec4dd231898b7b318", - "size": 1756 + "path": "en/api/java/beta/user_profiles.md", + "sha256": "a51537f3723479ec532d6aaab55aa4b898c837a36a2629410122f7bea7b7eb76", + "size": 75311 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/files", "status": "success", - "path": "en/api/python/beta/environments/create.md", - "sha256": "f7a93f0ea595807a9b1fa5f99054e2b0595c6fb7121326af17f222695dab6781", - "size": 9714 + "path": "en/api/java/beta/files.md", + "sha256": "dc69b2f2af3407e024fa455dd292e16271b106d726ffb3fe6b53ede78eb06cfe", + "size": 32216 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments", "status": "success", - "path": "en/api/python/beta/environments/update.md", - "sha256": "1e4f1f924f741e3dce762f4b1c24408f7f1adbd8b498e4beb45592f30e39b286", - "size": 9833 + "path": "en/api/java/beta/deployments.md", + "sha256": "b4f2e0f40c1807f7570002145db29a19839438f60a961c2fe44c08a8381e912d", + "size": 221310 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels", "status": "success", - "path": "en/api/python/beta/environments/list.md", - "sha256": "68e068efa7dff9dd88bdc3d6e80dc290fa1cf4f0ed4558a665d44b1f20d7e8d6", - "size": 7319 + "path": "en/api/java/beta/tunnels.md", + "sha256": "889537940cfc1ceeda5cadc91692d42ea965c23308cd3b0adb5f14cc8bb48417", + "size": 65470 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments", "status": "success", - "path": "en/api/python/beta/environments/retrieve.md", - "sha256": "c498da560ffb90abe004348390d86145efd5abe4e9f4b223d6c6e924c4c2c795", - "size": 6783 + "path": "en/api/java/beta/environments.md", + "sha256": "c603dd5afb7080b54403bca99474f69fa60f996b27c508d6b862315b9aab505c", + "size": 122171 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/java/models/list", "status": "success", - "path": "en/api/python/beta/environments/delete.md", - "sha256": "e831cb9f51c07392dd76d521a07ea7aeb5e0b0697d21a75cf02c6ce2fc37ecc3", - "size": 3488 + "path": "en/api/java/models/list.md", + "sha256": "9c97ddd951cb40f825af472949c1d9f489cea865e3ac795da651b8e0e290d1fc", + "size": 14902 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/java/models/retrieve", "status": "success", - "path": "en/api/python/beta/environments/work.md", - "sha256": "e0c9448a6506bf88190376184e9d204fece7ff774728087a8be064af3cffacee", - "size": 47793 + "path": "en/api/java/models/retrieve.md", + "sha256": "51315fbfe50b56469ffc93173f53ff761935639444b2570af2d01ba0baecf371", + "size": 13597 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/java/completions/create", "status": "success", - "path": "en/api/python/beta/environments/archive.md", - "sha256": "63a0496d757377e4965470bdea9b18447b3eaf6a33894a9c8e513ac00a875351", - "size": 6849 + "path": "en/api/java/completions/create.md", + "sha256": "5941221c30ef29d66d0acb992ab287aca6d44138982ea19d9ddff7c9a2921d0e", + "size": 12643 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/list", "status": "success", - "path": "en/api/python/beta/deployment_runs/list.md", - "sha256": "77a02979b31b1b8ec560d4c3aa7dbb177fa18ca0335b236eb95a3bfc59fa973d", - "size": 10896 + "path": "en/api/java/beta/vaults/list.md", + "sha256": "81a68cfee9bfdb9e061c8f6acfd7ee614b554692e759e310865c0c6855fb7a5a", + "size": 6331 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/archive", "status": "success", - "path": "en/api/python/beta/deployment_runs/retrieve.md", - "sha256": "985d87cbcef7c7b116db7a25c9cffbeb91ba3a058965db2fb3855d518bde6980", - "size": 9406 + "path": "en/api/java/beta/vaults/archive.md", + "sha256": "f562a04999edf8f01a49e292f04fa9b2d3418f8681a5ca5bb1453721acdf8499", + "size": 5908 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/update", "status": "success", - "path": "en/api/python/beta/vaults/create.md", - "sha256": "ff98d8a6ec6818fae5719eb290c96eda2d5621c1b90aa5e2d748d6ca3d322518", - "size": 4168 + "path": "en/api/java/beta/vaults/update.md", + "sha256": "9267ef4ac0b07014ae6864ffc2b13ab3f8a116ff18e04c2deb0af85f1a8ac205", + "size": 6171 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/retrieve", "status": "success", - "path": "en/api/python/beta/vaults/update.md", - "sha256": "335504fb6bf4ac5ccb07f9f5fb99691b936d8b75aaebd5cf0f49ff8b3e5f3f2b", - "size": 4298 + "path": "en/api/java/beta/vaults/retrieve.md", + "sha256": "a7c90d8d9e7263eca9168c294acb81127b9e57e554ec7cfdcc442b7231cf3d89", + "size": 5909 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/delete", "status": "success", - "path": "en/api/python/beta/vaults/list.md", - "sha256": "4fff80f261ad12a851f14c4222c0e28ae900e39b1ad3fa7f59c50fe36d8247d3", - "size": 4471 + "path": "en/api/java/beta/vaults/delete.md", + "sha256": "10fd5080d53e373c01cafb8198631d44d8b809176da1d236ce7490937db80448", + "size": 5269 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/create", "status": "success", - "path": "en/api/python/beta/vaults/retrieve.md", - "sha256": "653d5b4fd564be0d871ad2962537967fc38a795ab8cb4b6d87c09c155a84055f", - "size": 4024 + "path": "en/api/java/beta/vaults/create.md", + "sha256": "68f5138c4e0bce40cd5f296fe08e940e84835a86613607f0f7d41b2801fc32a4", + "size": 6133 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials", "status": "success", - "path": "en/api/python/beta/vaults/credentials.md", - "sha256": "099fa687c5e5eccec26550c5e3245ef07272a9bf282b39c6f40c3b9177792464", - "size": 93270 + "path": "en/api/java/beta/vaults/credentials.md", + "sha256": "fc084b8ea52fb6c6572183db31d960d983fb7594ac89d2ae39f70dba1489369d", + "size": 105488 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/count_tokens", "status": "success", - "path": "en/api/python/beta/vaults/delete.md", - "sha256": "78e6599894bd1b7c6213896c87155a2de75e9fa813ac9af5fead4ec8c3c5972c", - "size": 3396 + "path": "en/api/java/beta/messages/count_tokens.md", + "sha256": "e2d16dfa7bfc4064c0e6b1132e85b523d26d51170cff650bd74f77bfe7d2e92e", + "size": 143150 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches", "status": "success", - "path": "en/api/python/beta/vaults/archive.md", - "sha256": "aa0dceca76baa404244dcaeb25bd318d245f9da30076250bfb7b855eaca66fdb", - "size": 4026 + "path": "en/api/java/beta/messages/batches.md", + "sha256": "c4219ed6c9b8d9af0649b9a2341a3ce663bd64ce6739f8fbee575e2c213a1edf", + "size": 805164 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/create", "status": "success", - "path": "en/api/python/beta/user_profiles/create.md", - "sha256": "16ecf331c9b737804ef42494c5518deaacc6a3b5e705c83bf6ad2fd2eec6f0a7", - "size": 13226 + "path": "en/api/java/beta/messages/create.md", + "sha256": "5730c021970d2b404c3d1c1bc57e926f2bc7934d3b82717170cbd7e28ac6063f", + "size": 300607 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs/list", "status": "success", - "path": "en/api/python/beta/user_profiles/update.md", - "sha256": "f18f4d26230345205b9e30953100ebe80f066d01c6cd00826c400737895e05c1", - "size": 13093 + "path": "en/api/java/beta/deployment_runs/list.md", + "sha256": "22084ebda8720c6b477cca356e87223dc48ce29b205b5ce4c664afe170aa2f8c", + "size": 12079 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/python/beta/user_profiles/list.md", - "sha256": "b43319d4256deeb540cfff8f1c68c05634697bed7099194b6e174acac7fe066f", - "size": 9988 + "path": "en/api/java/beta/deployment_runs/retrieve.md", + "sha256": "cd264381330c4a871d6d0fe6c7b3a67875f31609edc59f3a0db1f8523c5e386b", + "size": 10773 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/list", "status": "success", - "path": "en/api/python/beta/user_profiles/create_enrollment_url.md", - "sha256": "24de651c50157a11abfacaacb02b60e85596ba0a1c0686e5d4472177401789fa", - "size": 3875 + "path": "en/api/java/beta/agents/list.md", + "sha256": "b7f0e204b45d68d71e300154997e602f47b4aa2bab6040c4ebe5c574d1fa2841", + "size": 32225 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/archive", "status": "success", - "path": "en/api/python/beta/user_profiles/retrieve.md", - "sha256": "d44df59bb43f30fdada09c5d346f11b49e842e2e54b236101c352e10667e3ca5", - "size": 8885 + "path": "en/api/java/beta/agents/archive.md", + "sha256": "d0e7367b6162371222ae61f7dbf32874b12caf3d0e2d39c4569f2973c6b705fa", + "size": 31369 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/update", "status": "success", - "path": "en/api/python/beta/agents/create.md", - "sha256": "4ae747781600f7cd93215c868e24a8ffead47a2f5852b353b5089936f7008c21", - "size": 64042 + "path": "en/api/java/beta/agents/update.md", + "sha256": "8c5b09afecac521ee13693af751f90a1a7eb3a9de877a8a1170d935de122a60c", + "size": 60271 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/retrieve", "status": "success", - "path": "en/api/python/beta/agents/update.md", - "sha256": "3a2de7fd9358595ef1dd438dd1093c5cd71efbb59a1e8aa60fc3a193470596a4", - "size": 65003 + "path": "en/api/java/beta/agents/retrieve.md", + "sha256": "0e183d2003e00c3be318925b793ede61bf4939a015ff81826a6297dd2552ae6e", + "size": 31509 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/versions", "status": "success", - "path": "en/api/python/beta/agents/list.md", - "sha256": "8273e9e35e01f72339337fc741df4831b191e9efc27d1fb36dba2d8ac0b967e4", - "size": 30276 + "path": "en/api/java/beta/agents/versions.md", + "sha256": "811ea83c9144f20b617b1934f816f5e19a1e3b08793c9815e4c0fdc6bfa8bf2e", + "size": 32009 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/create", "status": "success", - "path": "en/api/python/beta/agents/retrieve.md", - "sha256": "4de4a4dbf2a094edafa8f0f361ec1765e0b28dcf3e4b7b995dfc28f3f5d939e8", - "size": 29523 + "path": "en/api/java/beta/agents/create.md", + "sha256": "f5510c0a436a4b1f8c1885b7fad77d5cebe19ea10f076ab1d166d6b26acb8f1d", + "size": 59518 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/list", "status": "success", - "path": "en/api/python/beta/agents/versions.md", - "sha256": "719f33374c7921f9b18c3358aa6fbd3b83334968c3195be3006d12a9c9000b82", - "size": 30034 + "path": "en/api/java/beta/environments/list.md", + "sha256": "3a58564811c16507195f191149812e01aaae3ac19b810bdf5f4dead2ebbffcea", + "size": 9157 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/archive", "status": "success", - "path": "en/api/python/beta/agents/archive.md", - "sha256": "4d2322d001af1b6e322474cc35179009df40c8f2b3cc6388ecd5030581bd6c5b", - "size": 29392 + "path": "en/api/java/beta/environments/archive.md", + "sha256": "0925431951fca53f37b1746db439acadad529fe9892fda3d99662162739e1429", + "size": 8696 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work", "status": "success", - "path": "en/api/python/beta/models/list.md", - "sha256": "527876a448a5538508aadd2b0b581cbfc11585d05840b58ebab557b168ab2ce3", - "size": 13790 + "path": "en/api/java/beta/environments/work.md", + "sha256": "ac042667ea3e52b119028716687fe9290e31ceab2289b8914f800f29bd67e310", + "size": 63658 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/update", "status": "success", - "path": "en/api/python/beta/models/retrieve.md", - "sha256": "bcd91857f1e20b131886ad2ca64ed08bea2fd672223f3f4493fdfb294b969cfc", - "size": 12459 + "path": "en/api/java/beta/environments/update.md", + "sha256": "39c514664030f9e2e5908211cc5178c11c66ce4a965bd2f361b5d2da918d0e6b", + "size": 11720 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/retrieve", "status": "success", - "path": "en/api/python/beta/tunnels/create.md", - "sha256": "f444a943d3bb99bbbc1ae5753bb95beb0eb3d9c31fcec4862c142c3d887f047d", - "size": 4443 + "path": "en/api/java/beta/environments/retrieve.md", + "sha256": "534064e718ea46312ecfdade95151841528e446c7e5fecbce117a2d0823374f7", + "size": 8633 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/delete", "status": "success", - "path": "en/api/python/beta/tunnels/rotate_token.md", - "sha256": "1236f5f3ca0a6af6c0e6b581d42aec066a571136c2506c36d3245d7cc0f60db9", - "size": 4073 + "path": "en/api/java/beta/environments/delete.md", + "sha256": "8517955eb957da08ad70cf3364ef73cebb0c3a14fd682a6a2092264ae362f792", + "size": 5339 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/create", "status": "success", - "path": "en/api/python/beta/tunnels/list.md", - "sha256": "262dcd48a7211ed5eb171008431569ec5186751d27d7022f880dcd34d7e9feef", - "size": 4733 + "path": "en/api/java/beta/environments/create.md", + "sha256": "4bf82bfde6fb1106a0c8559ac36b87ed0d9c8ed31287d10986452bce7d572f28", + "size": 11714 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/java/beta/models/list", "status": "success", - "path": "en/api/python/beta/tunnels/certificates.md", - "sha256": "efaee6b5fd9fd960ab57355f09c39a5093cd8047159e3bba744d87c333bb2343", - "size": 20181 + "path": "en/api/java/beta/models/list.md", + "sha256": "82bc9fee8b34e525e8577588e0844c2d9e17fdb0ccffeda097732825533cac3a", + "size": 15639 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/models/retrieve", "status": "success", - "path": "en/api/python/beta/tunnels/retrieve.md", - "sha256": "d09a32db37c02bd529465f5c665d598f835fb62b88c5fba6b36644d7dcb03a23", - "size": 4273 + "path": "en/api/java/beta/models/retrieve.md", + "sha256": "4e524a501e26ca609072637488a718255b94b9bf09f877c516babc1568fb7257", + "size": 14314 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/list", "status": "success", - "path": "en/api/python/beta/tunnels/reveal_token.md", - "sha256": "14b9067891642b48853351751c4f08f190f34b1d8f0127f81803653f1ff906ef", - "size": 3980 + "path": "en/api/java/beta/user_profiles/list.md", + "sha256": "b64fef259afa9b65cab80a0f84936e921af013dac85cf04f34a6c006a1cd5983", + "size": 11862 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/update", "status": "success", - "path": "en/api/python/beta/tunnels/archive.md", - "sha256": "d0fb6c1c8b1f31b0774872751ad02b1987f005b51ec6b24a62cd0392448560a1", - "size": 4556 + "path": "en/api/java/beta/user_profiles/update.md", + "sha256": "e0697218f9916bcaff2d94c4f4e621cc2d1ab0a410440d236fae016a4304c05c", + "size": 12800 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/python/beta/sessions/create.md", - "sha256": "ae7c108d42a91ee2613ee237e0a1f0d6e3b793e29b97275b4d38dd89b10da899", - "size": 82736 + "path": "en/api/java/beta/user_profiles/retrieve.md", + "sha256": "f09a51137a9495589c5cb46e5336b9fbeed77851cabb06032cd9d49ad0634791", + "size": 10729 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/python/beta/sessions/resources.md", - "sha256": "e7b6ebf3c4dd1a16a0da03bdb7f854ae9ad29874f57d853216d35a46b48f86bd", - "size": 35597 + "path": "en/api/java/beta/user_profiles/create_enrollment_url.md", + "sha256": "ed02e40c033aa6b376144a0a07bd40751b771675d1697fc3860d48230ee02476", + "size": 5789 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/create", "status": "success", - "path": "en/api/python/beta/sessions/update.md", - "sha256": "a1f7ec36fc1e7eb6eb5a979b63cb0fc50464b51b7f7ba28aee9e08a7266cc388", - "size": 68558 + "path": "en/api/java/beta/user_profiles/create.md", + "sha256": "df8fdf9fbe1dd8df0b8baa4bf64038f66684024c32d4328da20d53e2b98f5669", + "size": 12959 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/list", "status": "success", - "path": "en/api/python/beta/sessions/list.md", - "sha256": "fc482b18395be32aca4a69f94c271b7c54767ad980ceda90ebd0315586d8ae4f", - "size": 47832 + "path": "en/api/java/beta/skills/list.md", + "sha256": "eaeb6f68edb36128474e54588a2a4047e112b7fa32471d77024e06876ca62fac", + "size": 7421 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/retrieve", "status": "success", - "path": "en/api/python/beta/sessions/threads.md", - "sha256": "3c5e21f0556975e9d9c25836e69accbbd6ee8f4cffae0f1900165fca9e1448c2", - "size": 436253 + "path": "en/api/java/beta/skills/retrieve.md", + "sha256": "eb1584559209f5667bd322fce58d4bc2b0c38ccada2ace1d1c28f1c0efc8564d", + "size": 6864 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/delete", "status": "success", - "path": "en/api/python/beta/sessions/retrieve.md", - "sha256": "289d219f67c41055fc61c8cd36e3321ff3554a360585031e862bbf8cde7ef1e7", - "size": 44936 + "path": "en/api/java/beta/skills/delete.md", + "sha256": "b591f41a67a8105b84a31f421dd58d75c1bc9261c15d360dac3a233277f1c985", + "size": 5309 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions", "status": "success", - "path": "en/api/python/beta/sessions/events.md", - "sha256": "446ea33db867abcbe0277b8fd24278485d4c0ef0ffde6b6ce463fed6c029c0e7", - "size": 560438 + "path": "en/api/java/beta/skills/versions.md", + "sha256": "2ded495b45b346ded1bb6b756c9b64dac7f8cdd0529e45db1513e1c753e5c66c", + "size": 31929 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/create", "status": "success", - "path": "en/api/python/beta/sessions/delete.md", - "sha256": "4c1daff18cdb7003e64adda3333c597347fa3e5ac6284d6430667209ec19fbe2", - "size": 3355 + "path": "en/api/java/beta/skills/create.md", + "sha256": "9b598a2937d2eb50ea1af2bb8c7897fc2856d218387b1b03f8b348aea899ed37", + "size": 7271 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/list", "status": "success", - "path": "en/api/python/beta/sessions/archive.md", - "sha256": "ddca502859724a1e5c95cc25e727e95914e61f825fef44ab8f1b64bdf73e9e00", - "size": 44954 + "path": "en/api/java/beta/tunnels/list.md", + "sha256": "1282461f17a22daf6ec7fb1d1fb3745e003080b42c7288e061a2f7dba6c1b4e4", + "size": 6636 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/archive", "status": "success", - "path": "en/api/python/beta/deployments/unpause.md", - "sha256": "0cd158625325a04d20152dcdd9856e3085528570a40e2fe5ebce6156579eb979", - "size": 19280 + "path": "en/api/java/beta/tunnels/archive.md", + "sha256": "007a2f6c2fd99a0cf252cfa52552b549c0a5e59799f7688387931a77c8e8f5e0", + "size": 6454 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates", "status": "success", - "path": "en/api/python/beta/deployments/create.md", - "sha256": "93102fd6f2aa5bd148a2daf09f8e67cd3f711cb224ec19bee9a5c502d1cb3516", - "size": 30147 + "path": "en/api/java/beta/tunnels/certificates.md", + "sha256": "39244828715ccda0c10bad3bb7893703fae142a487133dda87512e3cd2650114", + "size": 28324 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/retrieve", "status": "success", - "path": "en/api/python/beta/deployments/update.md", - "sha256": "1cfbfaec347f57f1b476196e6fecad8ee745173af10dc380674217990de43383", - "size": 30119 + "path": "en/api/java/beta/tunnels/retrieve.md", + "sha256": "d31fed31a9eb69bf24187b553a4e9853f5a2e6f12af7e7126a4995f9c5a28db4", + "size": 6174 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/python/beta/deployments/list.md", - "sha256": "2163340dd0c1a936a1f95a55e2c8d6841744a413b06da922a66260123585bf1b", - "size": 20588 + "path": "en/api/java/beta/tunnels/rotate_token.md", + "sha256": "46d79efaf00ad448d213633159936080406ee16b8ae3afed83eeaf912a992ebe", + "size": 5984 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/python/beta/deployments/retrieve.md", - "sha256": "046d6e0f03fb62e6a388a06d337240bfdcc1979ffa9d1662a68b2682b076445f", - "size": 19251 + "path": "en/api/java/beta/tunnels/reveal_token.md", + "sha256": "9893ffc9712cc0b26d3de71c77f4e6b34915d20b108f0c414a2b1a1696c78cd9", + "size": 5883 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/create", "status": "success", - "path": "en/api/python/beta/deployments/run.md", - "sha256": "71f75859e91a4c9ee7f0bcdbc808b21959b11c43702d88dba26d9e3bb9c19193", - "size": 9379 + "path": "en/api/java/beta/tunnels/create.md", + "sha256": "326592802b8248e0a41acbf5f143b412aa8721127cdb1ebf81830e644d9914e8", + "size": 6358 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/java/beta/files/list", "status": "success", - "path": "en/api/python/beta/deployments/pause.md", - "sha256": "a140fb561b4ea8a53d3e59cbaa95f6c65699b7ceca9b9abe97c4f759793f93ee", - "size": 19264 + "path": "en/api/java/beta/files/list.md", + "sha256": "3066ccbbf7c60b8d9fe0a53027c6da671844894f680bad7255c7a1ee3b10db76", + "size": 7293 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/python/beta/deployments/archive.md", - "sha256": "900a5711839432e911f1c17e0d88a33b66de5a1876754040cd4acdf4a09a9389", - "size": 19280 + "path": "en/api/java/beta/files/retrieve_metadata.md", + "sha256": "c7d54d887de96f0efb226bf766b3133a460dd419d55752fa6608b0eaca0e4b02", + "size": 6560 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/files/upload", "status": "success", - "path": "en/api/python/beta/skills/create.md", - "sha256": "0422c74c6773b2f430126555c482db2a75e3ad94d467a4d1658a2c766f14fbd8", - "size": 5252 + "path": "en/api/java/beta/files/upload.md", + "sha256": "4da5d914ac59d362004015d97a1c70909f8220ce2a65ed5c23b23d5cf5e3f50b", + "size": 7045 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/files/delete", "status": "success", - "path": "en/api/python/beta/skills/list.md", - "sha256": "74ddd3a2256dff233226418ca6f19468ddac6464de668929acc8d49077eec9bf", - "size": 5562 + "path": "en/api/java/beta/files/delete.md", + "sha256": "78eaf9c3fef73b3091f66a9b40b7450c70130fbf724f89404d31ac1fd891bef5", + "size": 5140 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/files/download", "status": "success", - "path": "en/api/python/beta/skills/retrieve.md", - "sha256": "333dcb8ebf5e42af68d53729002b0a50f9aab656f21db0b793aba9d616f1bad6", - "size": 5000 + "path": "en/api/java/beta/files/download.md", + "sha256": "db3a960ab4f9781e72aa8b4418bc1918baa9e58c8b2da74ac3ccd537cdb79b1d", + "size": 4841 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/unpause", "status": "success", - "path": "en/api/python/beta/skills/versions.md", - "sha256": "930dae1c60fbff261f799dc7f2a7983b92a0a2de936245af253900e726f73022", - "size": 22102 + "path": "en/api/java/beta/deployments/unpause.md", + "sha256": "f9c2895819e16c49585cdd38819e5b3a4485bbef6ec36e0082ea90018b9d5205", + "size": 20356 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/list", "status": "success", - "path": "en/api/python/beta/skills/delete.md", - "sha256": "0ed77d0adcaec2ed1deee0259a2f7a503c15b02e71209509150243e8f6d79f15", - "size": 3448 + "path": "en/api/java/beta/deployments/list.md", + "sha256": "deac50cb05933b6439172bf919e6c0a9d6cfd8daec03fcff3e0804fda60f6693", + "size": 21388 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/archive", "status": "success", - "path": "en/api/python/beta/memory_stores/memory_versions.md", - "sha256": "1641511d5dabfc93e57200159b56898dfbe0eecea4e8212daf2f80268e2afc92", - "size": 40965 + "path": "en/api/java/beta/deployments/archive.md", + "sha256": "0b0518617cf61eb6d38fb03efa4b33d9d5b97db480ea85c87fffab9a5771bb34", + "size": 20356 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/update", "status": "success", - "path": "en/api/python/beta/memory_stores/create.md", - "sha256": "5f3e873c9c21aa8b9e9c0c6d95b02b7fad6c96b3016fad70aa2b09882c2ba5c6", - "size": 6371 + "path": "en/api/java/beta/deployments/update.md", + "sha256": "3883b11cd0cfadf6e5008641ed5fdcf2f39e079082b3f658c306b0383abe9e5d", + "size": 29970 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/retrieve", "status": "success", - "path": "en/api/python/beta/memory_stores/update.md", - "sha256": "887b4c728532ee3ea68e5a72df6eb806f61e7eda5ae90a69d43bb0a6c1e23e51", - "size": 6224 + "path": "en/api/java/beta/deployments/retrieve.md", + "sha256": "662749e50875f6ea4e81c780ec30537b48fcd71f66b86f8db3aa035bea1e9849", + "size": 20330 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/run", "status": "success", - "path": "en/api/python/beta/memory_stores/list.md", - "sha256": "0b65b78739feafe9cbf3b648326bdfa16e0a91bc97581b9a4657aad6cb2196a7", - "size": 6141 + "path": "en/api/java/beta/deployments/run.md", + "sha256": "92f21c43c12c69ff1df2cca2675a50676936d37adf0655738357872f36d71bc8", + "size": 10730 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/pause", "status": "success", - "path": "en/api/python/beta/memory_stores/retrieve.md", - "sha256": "f8b39748d629bed30ad6bf2c74a7b0d012707ccea068323dd2c6a826a148f044", - "size": 5426 + "path": "en/api/java/beta/deployments/pause.md", + "sha256": "6e538b1e7546cbd86648119dfddee255dbffd286dfbee3603c13d62d1c0d7302", + "size": 20334 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/create", "status": "success", - "path": "en/api/python/beta/memory_stores/delete.md", - "sha256": "4a2d2216f27b3a22fa3a7c06939f9e012ce897acb9e95a66d681b196cbb86c2d", - "size": 3707 + "path": "en/api/java/beta/deployments/create.md", + "sha256": "de6d18909a27f03023369187ab9e4da999e2e46b63177d1cc7be9d8d228c0b4a", + "size": 30339 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events", "status": "success", - "path": "en/api/python/beta/memory_stores/memories.md", - "sha256": "71861024c9f876debce181bf7a3ea48b3594cfe485c0d21458f9a0fa76345d2f", - "size": 49826 + "path": "en/api/java/beta/sessions/events.md", + "sha256": "0ffa5c58f97e2ad294113b959293ff02856d4b39335ddf95a6d14c5e9bc1a784", + "size": 558003 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/list", "status": "success", - "path": "en/api/python/beta/memory_stores/archive.md", - "sha256": "c671066a19a9d3893e3a8fd0f7500c7e4156875c203464c7a1ff582d77dfa1af", - "size": 5523 + "path": "en/api/java/beta/sessions/list.md", + "sha256": "d639ee539fc04eee41186e557a125bb799efa2029b300bf039e84bc8b6734f0d", + "size": 49651 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/archive", "status": "success", - "path": "en/api/python/beta/files/download.md", - "sha256": "5a4fae71833b50e825520d824d6c9035210bcdbdefdd25a9a7ff26152ad5e81c", - "size": 3045 + "path": "en/api/java/beta/sessions/archive.md", + "sha256": "0e556a330ed510e3ae5f865bac1e7f9df8f30d68df87bcab4d3ae04fa9113fb5", + "size": 46784 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/update", "status": "success", - "path": "en/api/python/beta/files/list.md", - "sha256": "8fd9c781948e5476ea541594d540989e0e0b2b1f7292bedb955cef4db9660c47", - "size": 5437 + "path": "en/api/java/beta/sessions/update.md", + "sha256": "5fce78e275667c661fef78011756d8644cba8727daa2579e938ff8df64856360", + "size": 48086 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/retrieve", "status": "success", - "path": "en/api/python/beta/files/upload.md", - "sha256": "7934a365f3e0250785722faaf2dbcf524115f16d8f27f4002549e5ed8de70404", - "size": 5009 + "path": "en/api/java/beta/sessions/retrieve.md", + "sha256": "809b2cc7a8d76e05d0e40f7b64be90ed42084b69c8c757efff22fd2bf7cf1bdc", + "size": 46769 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources", "status": "success", - "path": "en/api/python/beta/files/retrieve_metadata.md", - "sha256": "fe703ba4bdbf45b7a18a019c19be7a7d738c6f6f6eeebb7a9bc48017b66806a2", - "size": 4655 + "path": "en/api/java/beta/sessions/resources.md", + "sha256": "6a279e627c43f6f55534621414718ce7f49ace22a9a57f4fc4ec8ca717020878", + "size": 40559 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/delete", "status": "success", - "path": "en/api/python/beta/files/delete.md", - "sha256": "0d5c56cfe6aefa6301bfb23d12757984ed748edb451595608569c6bf1e9868c0", - "size": 3306 + "path": "en/api/java/beta/sessions/delete.md", + "sha256": "0538c0eb4d3488629db7a7c0ef551502dd0baf3e8cc4297e754c869c46522488", + "size": 5232 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads", "status": "success", - "path": "en/api/python/beta/messages/create.md", - "sha256": "df00729fa4643b151fec7c231b0565f5feec183810bae67f60c37a387f94fae5", - "size": 306678 + "path": "en/api/java/beta/sessions/threads.md", + "sha256": "e0c05a905cfffc81bfa837c6236414fa5f5a4b87a67859dbdb0f7bac65a52cb8", + "size": 442866 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/create", "status": "success", - "path": "en/api/python/beta/messages/count_tokens.md", - "sha256": "cc1326b33b6ebe7a1cad3de0f2aeae6015fa9961f17729c30f509d157f01bc6e", - "size": 144624 + "path": "en/api/java/beta/sessions/create.md", + "sha256": "4a6d2706a1daa4104993966d78c6ab68871e925caa755ab33d6030cc05e464a9", + "size": 84649 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/list", "status": "success", - "path": "en/api/python/beta/messages/batches.md", - "sha256": "3f9749637e6a8a024125e3aea420f46da52135f9e2c38f1e0cce9ea604f019bc", - "size": 800510 + "path": "en/api/java/beta/memory_stores/list.md", + "sha256": "892be30d0b4a0165cf7f745f14a64462104f3efab63ed24523ba062dd9bfc4e9", + "size": 8029 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/python/beta/messages/batches/create.md", - "sha256": "6059545e8195fe9af79df4bc855c603afcd8dfdc911a72208a2dd6265f5408dd", - "size": 168271 + "path": "en/api/java/beta/memory_stores/memory_versions.md", + "sha256": "fb5a5fa84267894e7dfa1c0a101fa9c4b31505e67a14ccaa3d8770f5b30cfbaf", + "size": 45622 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/archive", "status": "success", - "path": "en/api/python/beta/messages/batches/list.md", - "sha256": "c07d7c727308625b018e484d94b66b539d73f52c45e031e9fb2979546781e2f6", - "size": 7496 + "path": "en/api/java/beta/memory_stores/archive.md", + "sha256": "8b8c419649043062a602e502630af4c952377231195e4284f1aebc47cedad11c", + "size": 7418 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/update", "status": "success", - "path": "en/api/python/beta/messages/batches/cancel.md", - "sha256": "963e6f6d743b9099a268738a41c209080f8c1b3a4eb8dd52a3173cba6bab9fb8", - "size": 7372 + "path": "en/api/java/beta/memory_stores/update.md", + "sha256": "f7d2c77c508240581e5e65db6cac79c7f18b6385fc70f61344da0d2700439d97", + "size": 8123 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/python/beta/messages/batches/retrieve.md", - "sha256": "536b3fbec0bdf47e298eef1de0c459b1a684bdfe1bbfb5799159d9dfc9e62b16", - "size": 7064 + "path": "en/api/java/beta/memory_stores/retrieve.md", + "sha256": "99faac70567674e0764664ceae7d3dd1aa51d66ea1907b1d951a0470e434f52e", + "size": 7322 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/delete", "status": "success", - "path": "en/api/python/beta/messages/batches/results.md", - "sha256": "e3a713dc38d9a7151fadd3e8f87b25dfa770a2a9d25320f47b7b7ff3a74e51c9", - "size": 156695 + "path": "en/api/java/beta/memory_stores/delete.md", + "sha256": "c257624aaa129c17102fe9e88e7a963a1bc597ce5f74fd032f8a9ac29f3a4546", + "size": 5592 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/create", "status": "success", - "path": "en/api/python/beta/messages/batches/delete.md", - "sha256": "200661c32484b5ab2abd525176347aa4e828a63d4ff45abc3627cbbaab03ed13", - "size": 3803 + "path": "en/api/java/beta/memory_stores/create.md", + "sha256": "484f9f0418a26af4cc88723cfc51bcdfec9b1f0773ec75ccbc33a9ffdaa92b80", + "size": 8382 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories", "status": "success", - "path": "en/api/python/beta/memory_stores/memories/create.md", - "sha256": "284b2497dcf247ab519582e064adc8ca4eb0183ea8e5b52b58ac4cfc42de6a72", - "size": 7195 + "path": "en/api/java/beta/memory_stores/memories.md", + "sha256": "b1b22e5184e6f3b111d7ea03c08d2e8c65c9eabd51790d334ae5db0f63f8ec43", + "size": 57352 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/python/beta/memory_stores/memories/update.md", - "sha256": "9c451b13f1bbfcb5e63c44a42433a59d955dc98c65ae426e55c7e09ced5b28db", - "size": 7947 + "path": "en/api/java/beta/memory_stores/memory_versions/redact.md", + "sha256": "6dafce72d5b2a2ef7c65996bd3e02b693aee871a703490169d60d910adafaa80", + "size": 11510 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/python/beta/memory_stores/memories/list.md", - "sha256": "9dd032e5fc661f4b8abc42695b157fcc26e4b65894aeb25cf234beb4687943ba", - "size": 8711 + "path": "en/api/java/beta/memory_stores/memory_versions/list.md", + "sha256": "6a1a520db3fbb60b77d91e2a93e1da2569859928eb711f4752d3c14a7e1fab8c", + "size": 13230 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/python/beta/memory_stores/memories/retrieve.md", - "sha256": "546c436063d0245e291bac57a28f5a97e0fe08dc8a14a99a4f3d9a7958e258eb", - "size": 6697 + "path": "en/api/java/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "12354f1d93423eeb17ad6367ab4dff8b07e80d37e8015ec1ec9a61d60804facd", + "size": 11841 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/python/beta/memory_stores/memories/delete.md", - "sha256": "6ff57c14e18f65e2faf72a4533953d57d751003b152528a0767c25c2cc6a83c4", - "size": 4557 + "path": "en/api/java/beta/memory_stores/memories/list.md", + "sha256": "a8db794a2276a090e1fc06bbf491ad36006c3f298c619376c10f552dc9791826", + "size": 10272 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/python/beta/memory_stores/memory_versions/list.md", - "sha256": "97e0670b4247bda068a04a2cddba0d4f489e8f68e3dd63aed43cb10e2665f162", - "size": 12125 + "path": "en/api/java/beta/memory_stores/memories/update.md", + "sha256": "810efc29e917a0ba679bc577dd392c36121c38bc5366c600c8e941482ae09810", + "size": 9307 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/python/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "9618ec243ee17322254f6ef6cc3b17b172c75d7754193a2731d4f9c17c89aeee", - "size": 10127 + "path": "en/api/java/beta/memory_stores/memories/retrieve.md", + "sha256": "b8efa4bf9fb2a92218780c28361d7d3df5bf5c2fec56d8012e826e592544d5d1", + "size": 8420 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/python/beta/memory_stores/memory_versions/redact.md", - "sha256": "9d825d1af5f99c87c5e9f4b3985f200e217aac333c28bbe04f643ccb0ffa17ec", - "size": 9505 + "path": "en/api/java/beta/memory_stores/memories/delete.md", + "sha256": "8124498723922ec5bb94b8d8457bc1402ebce5d21ae2a21c896e3e676f501aa2", + "size": 6563 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/python/beta/skills/versions/create.md", - "sha256": "600d200925ad50053715e4b310a014eb853baac20a4d39fb90ea63ddc8831d05", - "size": 4531 + "path": "en/api/java/beta/memory_stores/memories/create.md", + "sha256": "bf1505d7b3afda2270cd9e33f3b61936a6d1f0bbce3f45912bc06fbe47e6b6d4", + "size": 8927 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/list", "status": "success", - "path": "en/api/python/beta/skills/versions/download.md", - "sha256": "4535586a9c9df9ca8d5e2d14a909c7df5a62fdbc8c6683b32b72fe582cc32e7e", - "size": 3492 + "path": "en/api/java/beta/sessions/resources/list.md", + "sha256": "432ba394e3fa8931da9cf3e928fc3aa28909dbf4db858bce69bfdbe2b77a7a78", + "size": 8323 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/update", "status": "success", - "path": "en/api/python/beta/skills/versions/list.md", - "sha256": "ed68648bec840def10eded2f5ff2e8429d719f3fc84d6f9cda764c3b4394c43c", - "size": 4686 + "path": "en/api/java/beta/sessions/resources/update.md", + "sha256": "114586c4e9c9b69a3a126ca8f4665455cea7fbe159d7bef9aee378e953a442a9", + "size": 8168 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/python/beta/skills/versions/retrieve.md", - "sha256": "e31816a6c36d67760c53c7c6273b7503251d048bf5003cd7ce46d3e4462705a4", - "size": 4630 + "path": "en/api/java/beta/sessions/resources/retrieve.md", + "sha256": "77f1d43eb53f632d981580917887a6445050c6f0df0f52c172a9d91d1ffd73f2", + "size": 7946 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/delete", "status": "success", - "path": "en/api/python/beta/skills/versions/delete.md", - "sha256": "d65ccd076fd3945871146b3c800e5fc39627367800b94ea7cbc25a24f777755b", - "size": 3828 + "path": "en/api/java/beta/sessions/resources/delete.md", + "sha256": "e1175737850587bca4babe5e8c3fec6278dbda9f42d0633b40e669ce69aae797", + "size": 5554 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/add", "status": "success", - "path": "en/api/python/beta/sessions/threads/list.md", - "sha256": "2ef82ce6a6992baa2bacc38e580fb657026ff6e94defb641a269ef5eeccc0905", - "size": 33383 + "path": "en/api/java/beta/sessions/resources/add.md", + "sha256": "25974158a42643b933af2143aebc74e85390af082b549f43978f6b11b4701153", + "size": 6160 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events", "status": "success", - "path": "en/api/python/beta/sessions/threads/retrieve.md", - "sha256": "60e8dfdce9023973e46a29d46505ba2ae270155adf37cec585e7f94e5b8a41e4", - "size": 32534 + "path": "en/api/java/beta/sessions/threads/events.md", + "sha256": "ccf52a929c9087b5af97fc0ae763a8a57205e2678b38adb65f3b3c135bd0c8c0", + "size": 194801 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/list", "status": "success", - "path": "en/api/python/beta/sessions/threads/events.md", - "sha256": "c0b86565256c5166770256f806848a300e8b7df13b75d8393c64d412cce83600", - "size": 193336 + "path": "en/api/java/beta/sessions/threads/list.md", + "sha256": "217246f1839ceafca80bba11b887c7a435b5842a51cf5089fda8f7248d2d0b01", + "size": 35429 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/archive", "status": "success", - "path": "en/api/python/beta/sessions/threads/archive.md", - "sha256": "534cdbccad5f92bbd030f1dbd05df72e61659b47a86c72d60f67f08e20b5459c", - "size": 32552 + "path": "en/api/java/beta/sessions/threads/archive.md", + "sha256": "d578777913fd4284ea4f87fae77016a89ad388c2118db45e56549ae63cb7d043", + "size": 34694 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/python/beta/sessions/resources/update.md", - "sha256": "20851458e7a0e3947d48c53e64008a52d14d788596af116b97a46b4483b1accb", - "size": 6168 + "path": "en/api/java/beta/sessions/threads/retrieve.md", + "sha256": "ad6652fe38c14a61418c93317b90307e3556d211d493e6d445ea1d9130cffc5f", + "size": 34680 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/list", "status": "success", - "path": "en/api/python/beta/sessions/resources/list.md", - "sha256": "b317470cf4acb499b75d7d34493e66390cec2574d4b6f80e79473703a4f46520", - "size": 6494 + "path": "en/api/java/beta/sessions/events/list.md", + "sha256": "b6ba7467190868fe28fc0cff25d4a637c8b03ea5886e14aca8a8d8689f177db6", + "size": 99175 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/stream", "status": "success", - "path": "en/api/python/beta/sessions/resources/retrieve.md", - "sha256": "d5cf365cd9b68c262d16225f7a34475c5e1491f2f32155f47b8cfbaa359dfac0", - "size": 5949 + "path": "en/api/java/beta/sessions/events/stream.md", + "sha256": "4ca26388786a3bacaec07d4dcc8576a1544d331750a12e924c24758112e2edad", + "size": 98803 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/send", "status": "success", - "path": "en/api/python/beta/sessions/resources/add.md", - "sha256": "a5a0e866121da372f8ee5fcdc347f1badb4be5af5a3b76ed60777eb98e6198c5", - "size": 4012 + "path": "en/api/java/beta/sessions/events/send.md", + "sha256": "a925787423760c2bcd3121a8095d8c2045d6c5f094f2f1789667ea2644c9590e", + "size": 26821 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/python/beta/sessions/resources/delete.md", - "sha256": "97dc406f370f11861502fd6a309a620f1e3457b3963a7430dc48d2792c872678", - "size": 3552 + "path": "en/api/java/beta/sessions/threads/events/list.md", + "sha256": "e21229a11877415d1e97910fa40078afab8c878102c23a3daa48492b7fe1d735", + "size": 95818 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/python/beta/sessions/events/send.md", - "sha256": "510cff8a32eaf6272e4387e95dca2f365548d42b4105ab4cb5420cc74bc8927b", - "size": 25017 + "path": "en/api/java/beta/sessions/threads/events/stream.md", + "sha256": "c70ec67b9226de65a311559fbe4ff142dab44753d440642fdac33cc1adc54de5", + "size": 99118 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/python/beta/sessions/events/list.md", - "sha256": "7a1785d7d8c82c8f2192e2ef7025252104ddf0bc0a783cf1d94d52a67a3974bd", - "size": 97592 + "path": "en/api/java/beta/tunnels/certificates/list.md", + "sha256": "2edd2f241c9c8afddec5453053d7697dc7c4b94a0c0353977f283f3715e75a85", + "size": 7044 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/python/beta/sessions/events/stream.md", - "sha256": "e00c14a4326c4c017fc529dc22812f753ec76d395302e127e4c1ad600a93a831", - "size": 98126 + "path": "en/api/java/beta/tunnels/certificates/archive.md", + "sha256": "ccf7addb8ce1c3db1f42f058168110adbab380a16426be9a2b08c565a5c33007", + "size": 6981 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/python/beta/sessions/threads/events/list.md", - "sha256": "75f972f8f2fa77b5297a9ec1cf3db0d5753d027c19bbbb1e9c0eeb56b9ac7b99", - "size": 95164 + "path": "en/api/java/beta/tunnels/certificates/retrieve.md", + "sha256": "1e23c43e0acc113f5ecc73296ec66a5006b3fb4536ffc2698029838f26d064f9", + "size": 6748 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/python/beta/sessions/threads/events/stream.md", - "sha256": "0ef891533d1b13e6e840a6bbcd0cd9e2c62d168dcdc6622edec387c8a8dd2162", - "size": 98309 + "path": "en/api/java/beta/tunnels/certificates/create.md", + "sha256": "ba738ef194b7a9d3a5a9e7eb2b0f72f2889d78e9e7a71ea53aec54d364a9f86b", + "size": 6990 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/list", "status": "success", - "path": "en/api/python/beta/tunnels/certificates/create.md", - "sha256": "e436ab7dc5546260c1d62c1935f44d2a099e780d6aecd31c75ef1378e072317d", - "size": 4931 + "path": "en/api/java/beta/skills/versions/list.md", + "sha256": "06371b3307a1352fc52ddab7317fd4f4987ba1b2bacd1700223c72944762ae62", + "size": 6555 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/python/beta/tunnels/certificates/list.md", - "sha256": "317be5180d8b6098c8103b417abe0287f0ffa8a4fdd014487f33f29aef641861", - "size": 5102 + "path": "en/api/java/beta/skills/versions/retrieve.md", + "sha256": "0b66f111380d700387f42b6073ec84a8b8583a2b420804304fd6d39a70b83df9", + "size": 6642 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/delete", "status": "success", - "path": "en/api/python/beta/tunnels/certificates/retrieve.md", - "sha256": "b151ebe72cff63b11978b1480964dcf3e90de48462cae5e8ea19de486457da6b", - "size": 4686 + "path": "en/api/java/beta/skills/versions/delete.md", + "sha256": "2eafae1e6af7e49be36b18ea814243cc332814ec8ccf8062cb8a45ff8f14d546", + "size": 5821 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/download", "status": "success", - "path": "en/api/python/beta/tunnels/certificates/archive.md", - "sha256": "becec1be399d270e0740e189431219c52613160ec9986408b9d1466420d10b39", - "size": 4923 + "path": "en/api/java/beta/skills/versions/download.md", + "sha256": "2e8dc7e42563935b55b304636bb7e1024b0ea8df1b06bb11f2e92f8ca6c87ccf", + "size": 5420 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/create", "status": "success", - "path": "en/api/python/beta/agents/versions/list.md", - "sha256": "00c1f9cdd8d167000929150b0dbd8e5d7c2340a89a50f3d14d35932cf3954b90", - "size": 30033 + "path": "en/api/java/beta/skills/versions/create.md", + "sha256": "1db96ab1ed173640545cf6b859d17d720e040575075151e9cc1ae3b184505b6c", + "size": 6597 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/list", "status": "success", - "path": "en/api/python/beta/vaults/credentials/create.md", - "sha256": "7748fe01ff212f8ca028c243e590e36c508dde39b1eddfad2a20a99da508a995", - "size": 12891 + "path": "en/api/java/beta/environments/work/list.md", + "sha256": "4f06aff958a18d39a918df56224ba36b0239bf7d51de1ae2a69c23fd229783a4", + "size": 7400 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/python/beta/vaults/credentials/update.md", - "sha256": "6ead5224c33c846309464afaeca8d8a9315e5fe6ead3e285a2bc544e9ed5c04a", - "size": 12551 + "path": "en/api/java/beta/environments/work/heartbeat.md", + "sha256": "bc93b30ab2d334800d7dee2da43b42b7d9ef88592ef6087f82714f153ad13e26", + "size": 6418 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/update", "status": "success", - "path": "en/api/python/beta/vaults/credentials/list.md", - "sha256": "f24c35f1db5a22673c05bc9748f0637a0a173fb0d30ceb0ecf774988018ddd02", - "size": 8381 + "path": "en/api/java/beta/environments/work/update.md", + "sha256": "bf828077c7ca5d7d55d4b9b8587717c0020f0ce0315f0d5ba3dc74eb400a5e8a", + "size": 8115 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/retrieve", "status": "success", - "path": "en/api/python/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "86378590bd62dd2ac459fd777c1be5a6324ade47b6e5e9e16e86418c4e92430a", - "size": 7035 + "path": "en/api/java/beta/environments/work/retrieve.md", + "sha256": "6058b98ad6adf6f62de66410aa5f8ceae1204fc61996f600f86085788f967b30", + "size": 7667 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/poll", "status": "success", - "path": "en/api/python/beta/vaults/credentials/retrieve.md", - "sha256": "40dfb057dc2bdc3657a59e4ebc28b86f881a8e66de6b4df28e5d3e6d83648164", - "size": 7914 + "path": "en/api/java/beta/environments/work/poll.md", + "sha256": "7023e91469cea61db7e3d7808e7307a40ee986cff41dbdf379676deb9b26e8d3", + "size": 7719 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/stop", "status": "success", - "path": "en/api/python/beta/vaults/credentials/delete.md", - "sha256": "d9313e8a379abc6c8a34149f260ed35881fd96bacb87e5f2b3f32ca94a38cd4b", - "size": 3685 + "path": "en/api/java/beta/environments/work/stop.md", + "sha256": "b7775f8685551ed6dcd86291c979ad5b2dc1dba0145ee3202d753d54ea1fd157", + "size": 7912 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/ack", "status": "success", - "path": "en/api/python/beta/vaults/credentials/archive.md", - "sha256": "9b5fcb7e7cfbafebab0154b8e75780111c1dd569c31beb366d2126fe3bc66c46", - "size": 7916 + "path": "en/api/java/beta/environments/work/ack.md", + "sha256": "9bd54471cff29dca557037b08ab34526b8f1859533f553ed6ee219b460482d60", + "size": 7326 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/stats", "status": "success", - "path": "en/api/python/beta/environments/work/update.md", - "sha256": "920d5a4c6f7d6f5cc3e4d23cbe81618d9767acf222d3f33f8d56007ff134bc42", - "size": 5856 + "path": "en/api/java/beta/environments/work/stats.md", + "sha256": "e6fc7307d5728c9251de4cddf280cfbe042546c2499a148e58beddb9163f4830", + "size": 5947 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/java/beta/agents/versions/list", "status": "success", - "path": "en/api/python/beta/environments/work/list.md", - "sha256": "ba3e9a5ea49eeab85cd70579d0eb3e429c41e286eccb6ef492aab449d53695df", - "size": 5566 + "path": "en/api/java/beta/agents/versions/list.md", + "sha256": "836e0dc62cdc26850d679ac7ba2bbe294111bf9d7b732144f53eba4477fcb1d3", + "size": 32008 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/cancel", "status": "success", - "path": "en/api/python/beta/environments/work/stop.md", - "sha256": "401fb35f7341d8c5629919072406fed4fbbde87bc61535a1e1dbe89644ffcedf", - "size": 5758 + "path": "en/api/java/beta/messages/batches/cancel.md", + "sha256": "f0a1d817c67d51baf178331d8e6c2f9f3738106b93eafb2184389075530b1c6f", + "size": 9160 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/list", "status": "success", - "path": "en/api/python/beta/environments/work/retrieve.md", - "sha256": "5d0602730407c21b735b78a0b5536bf2b92345ff1167642403eb3c5f7dd47353", - "size": 5667 + "path": "en/api/java/beta/messages/batches/list.md", + "sha256": "d06f3c41bfd183b0344dea7a42f8e6fd0ab13f6b008d1e5ed11c18d5ff06b9e5", + "size": 9288 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/python/beta/environments/work/ack.md", - "sha256": "1d0e700e6ebc4df4bcfcd3d8e9213ac731e2921dee0ba8e336b1e11a3ff707cc", - "size": 5353 + "path": "en/api/java/beta/messages/batches/retrieve.md", + "sha256": "94b7ce1e2b880553a3ca3452f7c10176d80b13af18a9faee3a55f797430ba887", + "size": 8858 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/results", "status": "success", - "path": "en/api/python/beta/environments/work/stats.md", - "sha256": "ccf9244fbe17c90fbbc1e0a9ddef32e9a71f0c771867abec2199093fb67b26c2", - "size": 4101 + "path": "en/api/java/beta/messages/batches/results.md", + "sha256": "3412c05c9391acade67e4de9fc17fcc32ec6bb81cc9f58e9a493b738cfff457c", + "size": 155422 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/delete", "status": "success", - "path": "en/api/python/beta/environments/work/heartbeat.md", - "sha256": "20ad3f4c9d7ab9b589bb4bad46a3cc3ce29f71cb8c691b6ed1c42662701b7ad9", - "size": 4428 + "path": "en/api/java/beta/messages/batches/delete.md", + "sha256": "e2f4a47825f067f731335b0f515b95106b7bdd5de4ccabac2fcc3ad91b0ef5fe", + "size": 5664 }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/create", "status": "success", - "path": "en/api/python/beta/environments/work/poll.md", - "sha256": "44da95bdb5a15075bc4e81deee89c0f6aa114f3eaf853dae9dbc86ef4e454aa2", - "size": 5801 + "path": "en/api/java/beta/messages/batches/create.md", + "sha256": "77e2372ad4b9bd747d99bde2d4d95d136e00e6ebd2ff190a276053c41771cef4", + "size": 176529 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/list", "status": "success", - "path": "en/api/java/beta/sessions.md", - "sha256": "362c951acf82643b684c47d3342ad7519d52dfb0ded934a4be1a3ab4f8d27c1c", - "size": 1181316 + "path": "en/api/java/beta/vaults/credentials/list.md", + "sha256": "83140bf0cdcc8afbed012e7d9ab905fee4684dc2a225352d7e9bddf9cf6e973d", + "size": 10114 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/java/beta/webhooks.md", - "sha256": "0903773152aa3929c8d1302439e93e3ec74687782767045590f160c54fc954c7", - "size": 37222 + "path": "en/api/java/beta/vaults/credentials/archive.md", + "sha256": "be9ffc2934a174311daf51f661b06d0ee95d3513d24434b0a23b517f4ef22514", + "size": 9778 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/update", "status": "success", - "path": "en/api/java/beta/skills.md", - "sha256": "29a3fe251b401399dba1ba60668d8d23a553a3495266692730287b9ee1a1a067", - "size": 59581 + "path": "en/api/java/beta/vaults/credentials/update.md", + "sha256": "ef93c8f0f781548674c51136bf6e97e164db15ae57f530f6227291bb2b63cb51", + "size": 14366 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/java/beta/agents.md", - "sha256": "0d53bee1dd910ca31c37e0088cd4334af71dccab438d3f01a0dabdeea2b0b4ab", - "size": 448902 + "path": "en/api/java/beta/vaults/credentials/retrieve.md", + "sha256": "05eb4dd6ad9082263ca34ecbe84d99ca9963f2a443df1f584bbef9a1f70522e2", + "size": 9780 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/java/beta/deployments.md", - "sha256": "b4f2e0f40c1807f7570002145db29a19839438f60a961c2fe44c08a8381e912d", - "size": 221310 + "path": "en/api/java/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "e2af4e354e9e0c7103ce265baf28f6225377251e4574f74b84da2fe42dc8f198", + "size": 9065 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/java/beta/deployment_runs.md", - "sha256": "800388fa96e3b312564ab0ccb265e283219df9eeffea66ddce09a8784998df4d", - "size": 33780 + "path": "en/api/java/beta/vaults/credentials/delete.md", + "sha256": "1080bed9dc63193f7fc26ac5c351b16122e1cfdbe4f989dd9a3f51ace67416fd", + "size": 5695 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/create", "status": "success", - "path": "en/api/java/beta/user_profiles.md", - "sha256": "a51537f3723479ec532d6aaab55aa4b898c837a36a2629410122f7bea7b7eb76", - "size": 75311 + "path": "en/api/java/beta/vaults/credentials/create.md", + "sha256": "8e652e3c11f2ba0dae90e46ad34357a03dcfb928767fbb61b9c981bad709056b", + "size": 14971 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/models", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/cancel", "status": "success", - "path": "en/api/java/beta/models.md", - "sha256": "8da4b4500857331a66505c5c5986d892338de68213a41b3494f9c331991c3026", - "size": 47970 + "path": "en/api/java/messages/batches/cancel.md", + "sha256": "d0e8a5cdd35d81643166c690ac64ad2e1926ee7202eff2a18032968b4ce8bb76", + "size": 5548 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/list", "status": "success", - "path": "en/api/java/beta/vaults.md", - "sha256": "e9c3d8321cc39d2cb3a00d4ca66835a8bd6f7e88638c8523a9ac79cfa1dbd1c4", - "size": 109161 + "path": "en/api/java/messages/batches/list.md", + "sha256": "7028a924b5213d1700667d3cac922db45d0aa464402488b71b714e707966a5a6", + "size": 5692 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/retrieve", "status": "success", - "path": "en/api/java/beta/memory_stores.md", - "sha256": "e8e5833d60e45b6acc7739014cd1f5c70da261ee34fe506b2b02acdd8a1800cc", - "size": 125838 + "path": "en/api/java/messages/batches/retrieve.md", + "sha256": "2b907b2fa12853f98573977bfd463fb17436d366cca93aa1768a449b1febeccd", + "size": 5246 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/results", "status": "success", - "path": "en/api/java/beta/tunnels.md", - "sha256": "889537940cfc1ceeda5cadc91692d42ea965c23308cd3b0adb5f14cc8bb48417", - "size": 65470 + "path": "en/api/java/messages/batches/results.md", + "sha256": "76d9dcffde22b85903d40c2e6dfae574fd797dd9c3a501662e581546d1b0de5d", + "size": 37823 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/delete", "status": "success", - "path": "en/api/java/beta/environments.md", - "sha256": "c603dd5afb7080b54403bca99474f69fa60f996b27c508d6b862315b9aab505c", - "size": 122171 + "path": "en/api/java/messages/batches/delete.md", + "sha256": "0500b9264cefa010edd185d95b54f5d058babd782dffa108c6159f4bedf23ae1", + "size": 2056 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files", + "url": "https://platform.claude.com/docs/en/api/java/messages/batches/create", "status": "success", - "path": "en/api/java/beta/files.md", - "sha256": "dc69b2f2af3407e024fa455dd292e16271b106d726ffb3fe6b53ede78eb06cfe", - "size": 32216 + "path": "en/api/java/messages/batches/create.md", + "sha256": "6a80d55bafc6e5770dcc42578d7283fe7d1a950795fd567cd83c71131edf6b0b", + "size": 116070 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/count_tokens", "status": "success", - "path": "en/api/java/beta/messages.md", - "sha256": "862574225bd56ec044bb96a9aaff11352a7c3ca16a8601db2565b245def573b3", - "size": 2920727 + "path": "en/api/csharp/messages/count_tokens.md", + "sha256": "b060690e7ad61640aa21b08d81b87b8669eeecc50c40088733d8863527e638e7", + "size": 91087 }, { - "url": "https://platform.claude.com/docs/en/api/java/models/list", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches", "status": "success", - "path": "en/api/java/models/list.md", - "sha256": "9c97ddd951cb40f825af472949c1d9f489cea865e3ac795da651b8e0e290d1fc", - "size": 14902 + "path": "en/api/csharp/messages/batches.md", + "sha256": "560469408c5db9433d76f74b4b3008e56e5bf368a3389aef8c80c1c34b844d62", + "size": 285144 }, { - "url": "https://platform.claude.com/docs/en/api/java/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/create", "status": "success", - "path": "en/api/java/models/retrieve.md", - "sha256": "51315fbfe50b56469ffc93173f53ff761935639444b2570af2d01ba0baecf371", - "size": 13597 + "path": "en/api/csharp/messages/create.md", + "sha256": "1717473feeeb9bdaf398688894b10c3a6d1fb4bfaad80ca74d3e2c36c015a92e", + "size": 132591 }, { - "url": "https://platform.claude.com/docs/en/api/java/completions/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults", "status": "success", - "path": "en/api/java/completions/create.md", - "sha256": "5941221c30ef29d66d0acb992ab287aca6d44138982ea19d9ddff7c9a2921d0e", - "size": 12643 + "path": "en/api/csharp/beta/vaults.md", + "sha256": "5bc5b4fb968c58b920df81d8d89e5ecfb6162ade1ffee1beb20089306d015b54", + "size": 104221 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs", "status": "success", - "path": "en/api/java/messages/create.md", - "sha256": "139ea900bec48939890cffd6c81d53f49ea277df3b42d5e8b82f49f08062f3e6", - "size": 133521 + "path": "en/api/csharp/beta/deployment_runs.md", + "sha256": "3a62f8846d2e97457f31850aaacb22fd19d3bfefae6aa63218b536de378023b1", + "size": 34310 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/webhooks", "status": "success", - "path": "en/api/java/messages/count_tokens.md", - "sha256": "a306a8b2fab8baae60dd6653866dfe9b5a9f99c922e8af3204268509d1020f14", - "size": 93192 + "path": "en/api/csharp/beta/webhooks.md", + "sha256": "fae41b78ecb934e38c33fbd98e8dc9249370dac743d07b87ce48260dc5274031", + "size": 41445 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/models", "status": "success", - "path": "en/api/java/messages/batches.md", - "sha256": "b4cc3b438c3173b65d676508f9cd3905b3d6d83c0750b2f9418067421d70552b", - "size": 279081 + "path": "en/api/csharp/beta/models.md", + "sha256": "01b2a3bb46b48ad2999bd06d9b5a8fff2f728939425c598484be49533dc24ae2", + "size": 48379 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills", "status": "success", - "path": "en/api/java/messages/batches/create.md", - "sha256": "6a80d55bafc6e5770dcc42578d7283fe7d1a950795fd567cd83c71131edf6b0b", - "size": 116070 + "path": "en/api/csharp/beta/skills.md", + "sha256": "6bdfc3e9da6320ced64155b305e184ceeb59dbfe5082859fd13676938e472e4e", + "size": 55544 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores", "status": "success", - "path": "en/api/java/messages/batches/list.md", - "sha256": "7028a924b5213d1700667d3cac922db45d0aa464402488b71b714e707966a5a6", - "size": 5692 + "path": "en/api/csharp/beta/memory_stores.md", + "sha256": "995163d8e7951c22d6cb6491682cb1aa2a6dfc74e97778a8514da310b2ddab80", + "size": 119588 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages", "status": "success", - "path": "en/api/java/messages/batches/cancel.md", - "sha256": "d0e8a5cdd35d81643166c690ac64ad2e1926ee7202eff2a18032968b4ce8bb76", - "size": 5548 + "path": "en/api/csharp/beta/messages.md", + "sha256": "546a98791e7c2a05d9e87738f9e6efc86faba6410339c6a7dbe0f2cb9e41753f", + "size": 2895422 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents", "status": "success", - "path": "en/api/java/messages/batches/retrieve.md", - "sha256": "2b907b2fa12853f98573977bfd463fb17436d366cca93aa1768a449b1febeccd", - "size": 5246 + "path": "en/api/csharp/beta/agents.md", + "sha256": "86c1f368d97eab55118bf7d5d1cce0355937bbd272cb5b91ea3eb9e81a59a39e", + "size": 456147 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions", "status": "success", - "path": "en/api/java/messages/batches/results.md", - "sha256": "76d9dcffde22b85903d40c2e6dfae574fd797dd9c3a501662e581546d1b0de5d", - "size": 37823 + "path": "en/api/csharp/beta/sessions.md", + "sha256": "16c8a7a755ece87f7ff1dcd276e0dc98576bcda0d2b8065d5c8a6477d4372f72", + "size": 1209227 }, { - "url": "https://platform.claude.com/docs/en/api/java/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles", "status": "success", - "path": "en/api/java/messages/batches/delete.md", - "sha256": "0500b9264cefa010edd185d95b54f5d058babd782dffa108c6159f4bedf23ae1", - "size": 2056 + "path": "en/api/csharp/beta/user_profiles.md", + "sha256": "34f161d039d5b79d391b29b359c8bb20b1a26c62b0b32c89b46153962cac21c5", + "size": 72291 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files", "status": "success", - "path": "en/api/java/beta/environments/create.md", - "sha256": "4bf82bfde6fb1106a0c8559ac36b87ed0d9c8ed31287d10986452bce7d572f28", - "size": 11714 + "path": "en/api/csharp/beta/files.md", + "sha256": "e80ed9616149bcb82ec5be67286eac4dbb5501c8a9d795971e1e77d67aa7630e", + "size": 29995 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments", "status": "success", - "path": "en/api/java/beta/environments/update.md", - "sha256": "39c514664030f9e2e5908211cc5178c11c66ce4a965bd2f361b5d2da918d0e6b", - "size": 11720 + "path": "en/api/csharp/beta/deployments.md", + "sha256": "4e78938ac00ce96c4beb17f776221791a5acba8c8539198f3703e99f24d5e06c", + "size": 226348 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels", "status": "success", - "path": "en/api/java/beta/environments/list.md", - "sha256": "3a58564811c16507195f191149812e01aaae3ac19b810bdf5f4dead2ebbffcea", - "size": 9157 + "path": "en/api/csharp/beta/tunnels.md", + "sha256": "6a3234c685113bd70dcdf8236c8553ff4d3e6a7ed21ad6a0dcad31cc607dcb8b", + "size": 60952 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments", "status": "success", - "path": "en/api/java/beta/environments/retrieve.md", - "sha256": "534064e718ea46312ecfdade95151841528e446c7e5fecbce117a2d0823374f7", - "size": 8633 + "path": "en/api/csharp/beta/environments.md", + "sha256": "c98bebefbca76d24ee2538304ee5850e7a3ba2bd95f8ecf56246ba0877326f55", + "size": 116969 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/models/list", "status": "success", - "path": "en/api/java/beta/environments/delete.md", - "sha256": "8517955eb957da08ad70cf3364ef73cebb0c3a14fd682a6a2092264ae362f792", - "size": 5339 + "path": "en/api/csharp/models/list.md", + "sha256": "da0897a68831ee7658aef4b90e7c35a99d8e37a3e3c245f4506326cac01a3415", + "size": 14726 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/csharp/models/retrieve", "status": "success", - "path": "en/api/java/beta/environments/work.md", - "sha256": "ac042667ea3e52b119028716687fe9290e31ceab2289b8914f800f29bd67e310", - "size": 63658 + "path": "en/api/csharp/models/retrieve.md", + "sha256": "29f014286ff068f26c0e7703b7b82ef25d254608d8c40aa2011ee7bd45c15752", + "size": 13424 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/completions/create", "status": "success", - "path": "en/api/java/beta/environments/archive.md", - "sha256": "0925431951fca53f37b1746db439acadad529fe9892fda3d99662162739e1429", - "size": 8696 + "path": "en/api/csharp/completions/create.md", + "sha256": "82d0bfc05ea5550b68db168de9460263db209f9fc9f316561c19252c0ea84c9e", + "size": 13301 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/list", "status": "success", - "path": "en/api/java/beta/deployment_runs/list.md", - "sha256": "22084ebda8720c6b477cca356e87223dc48ce29b205b5ce4c664afe170aa2f8c", - "size": 12079 + "path": "en/api/csharp/beta/vaults/list.md", + "sha256": "59cca73c7c1fb06382f990a93392b6523eff31788154ebaa023dc264277fabe6", + "size": 5969 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/archive", "status": "success", - "path": "en/api/java/beta/deployment_runs/retrieve.md", - "sha256": "cd264381330c4a871d6d0fe6c7b3a67875f31609edc59f3a0db1f8523c5e386b", - "size": 10773 + "path": "en/api/csharp/beta/vaults/archive.md", + "sha256": "12acdc59e7ad131a160d31a28b84de177dc83c33f35e0beacc98966f310b7ea3", + "size": 5542 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/update", "status": "success", - "path": "en/api/java/beta/vaults/create.md", - "sha256": "68f5138c4e0bce40cd5f296fe08e940e84835a86613607f0f7d41b2801fc32a4", - "size": 6133 + "path": "en/api/csharp/beta/vaults/update.md", + "sha256": "83251d6ce1449a3c26fd8863eaf6cb512f50f5d4b680f4c11dec0b856934180b", + "size": 5815 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/retrieve", "status": "success", - "path": "en/api/java/beta/vaults/update.md", - "sha256": "9267ef4ac0b07014ae6864ffc2b13ab3f8a116ff18e04c2deb0af85f1a8ac205", - "size": 6171 + "path": "en/api/csharp/beta/vaults/retrieve.md", + "sha256": "66c799ec3a02f786024788bec2f01cbf3473e0f1200f8aae2d0fa381ea633871", + "size": 5542 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/delete", "status": "success", - "path": "en/api/java/beta/vaults/list.md", - "sha256": "81a68cfee9bfdb9e061c8f6acfd7ee614b554692e759e310865c0c6855fb7a5a", - "size": 6331 + "path": "en/api/csharp/beta/vaults/delete.md", + "sha256": "c839b96a492b50b14ca28cca67dcc765cb210b180e1b76d601e0d9be7181d669", + "size": 4831 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/create", "status": "success", - "path": "en/api/java/beta/vaults/retrieve.md", - "sha256": "a7c90d8d9e7263eca9168c294acb81127b9e57e554ec7cfdcc442b7231cf3d89", - "size": 5909 + "path": "en/api/csharp/beta/vaults/create.md", + "sha256": "7c852115e9824488e6cf89d54763ff75913fe226ead1c93b477db885834381bb", + "size": 5704 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials", "status": "success", - "path": "en/api/java/beta/vaults/credentials.md", - "sha256": "fc084b8ea52fb6c6572183db31d960d983fb7594ac89d2ae39f70dba1489369d", - "size": 105488 + "path": "en/api/csharp/beta/vaults/credentials.md", + "sha256": "c326940b027fe07f5bd7d73b39dcad387e6dd1bfe11c7290d65dabe058d515d4", + "size": 103661 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/count_tokens", "status": "success", - "path": "en/api/java/beta/vaults/delete.md", - "sha256": "10fd5080d53e373c01cafb8198631d44d8b809176da1d236ce7490937db80448", - "size": 5269 + "path": "en/api/csharp/beta/messages/count_tokens.md", + "sha256": "261a469873a14944385b82a28e74ff9c7041ad9dbfe35c35fbcac83752a7d298", + "size": 141138 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches", "status": "success", - "path": "en/api/java/beta/vaults/archive.md", - "sha256": "f562a04999edf8f01a49e292f04fa9b2d3418f8681a5ca5bb1453721acdf8499", - "size": 5908 + "path": "en/api/csharp/beta/messages/batches.md", + "sha256": "3821cd6f7b63bbc413d7195abbe78d224ec76fac710fb730aa21d9a9558e7404", + "size": 804824 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/create", "status": "success", - "path": "en/api/java/beta/user_profiles/create.md", - "sha256": "df8fdf9fbe1dd8df0b8baa4bf64038f66684024c32d4328da20d53e2b98f5669", - "size": 12959 + "path": "en/api/csharp/beta/messages/create.md", + "sha256": "5623a5bab6e5bc2389ce74f3b3f322a321064e1cae787a9f0fa5dca505cc68b1", + "size": 297777 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs/list", "status": "success", - "path": "en/api/java/beta/user_profiles/update.md", - "sha256": "e0697218f9916bcaff2d94c4f4e621cc2d1ab0a410440d236fae016a4304c05c", - "size": 12800 + "path": "en/api/csharp/beta/deployment_runs/list.md", + "sha256": "3355411fc6dd06142d31e7e5401004ab8e84659b1e7a24e67cc6b6885d69ddb5", + "size": 11940 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/java/beta/user_profiles/list.md", - "sha256": "b64fef259afa9b65cab80a0f84936e921af013dac85cf04f34a6c006a1cd5983", - "size": 11862 + "path": "en/api/csharp/beta/deployment_runs/retrieve.md", + "sha256": "83927fda9a9c928b2c85d17c268f32b93f3b351b06d9b0fd1f8b2ce3e7bae6ba", + "size": 10703 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/list", "status": "success", - "path": "en/api/java/beta/user_profiles/create_enrollment_url.md", - "sha256": "ed02e40c033aa6b376144a0a07bd40751b771675d1697fc3860d48230ee02476", - "size": 5789 + "path": "en/api/csharp/beta/agents/list.md", + "sha256": "f8fec189a3d228ec47ae4a1852791e216f801656f11a9dcf70ee006dad5d0b8c", + "size": 32613 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/archive", "status": "success", - "path": "en/api/java/beta/user_profiles/retrieve.md", - "sha256": "f09a51137a9495589c5cb46e5336b9fbeed77851cabb06032cd9d49ad0634791", - "size": 10729 + "path": "en/api/csharp/beta/agents/archive.md", + "sha256": "d5f7b3bfac5597fd484f857a2f310f6ba47fba9d5734476d74b6d5cce760ea51", + "size": 31773 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/update", "status": "success", - "path": "en/api/java/beta/agents/create.md", - "sha256": "f5510c0a436a4b1f8c1885b7fad77d5cebe19ea10f076ab1d166d6b26acb8f1d", - "size": 59518 + "path": "en/api/csharp/beta/agents/update.md", + "sha256": "49a81f870fe267aa40aa75e34395ab4525639327d66e936ffc7739c70d21dd7f", + "size": 62722 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/retrieve", "status": "success", - "path": "en/api/java/beta/agents/update.md", - "sha256": "8c5b09afecac521ee13693af751f90a1a7eb3a9de877a8a1170d935de122a60c", - "size": 60271 + "path": "en/api/csharp/beta/agents/retrieve.md", + "sha256": "fd999c50548e7a6d6ef6a23f3ec1a2760b47d343ccede13e0aec30e561c1e856", + "size": 31901 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/versions", "status": "success", - "path": "en/api/java/beta/agents/list.md", - "sha256": "b7f0e204b45d68d71e300154997e602f47b4aa2bab6040c4ebe5c574d1fa2841", - "size": 32225 + "path": "en/api/csharp/beta/agents/versions.md", + "sha256": "d69717215a57d0e8dffde2062c07dd0efd79cc1ba71f6167ec1462f5d43e16d4", + "size": 32427 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/create", "status": "success", - "path": "en/api/java/beta/agents/retrieve.md", - "sha256": "0e183d2003e00c3be318925b793ede61bf4939a015ff81826a6297dd2552ae6e", - "size": 31509 + "path": "en/api/csharp/beta/agents/create.md", + "sha256": "2f72750d1a418b5dd05163fc0b3852bcf0214380ccfcfe271fde3445a7d699b3", + "size": 61856 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/list", "status": "success", - "path": "en/api/java/beta/agents/versions.md", - "sha256": "811ea83c9144f20b617b1934f816f5e19a1e3b08793c9815e4c0fdc6bfa8bf2e", - "size": 32009 + "path": "en/api/csharp/beta/environments/list.md", + "sha256": "1c36e667da7840c0226cc15e6ba57ecad6c915eb562dda968dfe5dcb8450b039", + "size": 8914 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/archive", "status": "success", - "path": "en/api/java/beta/agents/archive.md", - "sha256": "d0e7367b6162371222ae61f7dbf32874b12caf3d0e2d39c4569f2973c6b705fa", - "size": 31369 + "path": "en/api/csharp/beta/environments/archive.md", + "sha256": "5a392d849090bf1a566f3079337bad0a555486ffcf061c7b55460e590e3ff051", + "size": 8474 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work", "status": "success", - "path": "en/api/java/beta/models/list.md", - "sha256": "82bc9fee8b34e525e8577588e0844c2d9e17fdb0ccffeda097732825533cac3a", - "size": 15639 + "path": "en/api/csharp/beta/environments/work.md", + "sha256": "8fbc3d5750f8c826624f0dee4f6288c4c85a05d51ce978d6e24f01607cbc1edb", + "size": 60092 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/update", "status": "success", - "path": "en/api/java/beta/models/retrieve.md", - "sha256": "4e524a501e26ca609072637488a718255b94b9bf09f877c516babc1568fb7257", - "size": 14314 + "path": "en/api/csharp/beta/environments/update.md", + "sha256": "e8a1f6babf5a7ccdebbadad6e93a219746a44e6ad2c97dbabf2cb456cc3a7a52", + "size": 11436 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/retrieve", "status": "success", - "path": "en/api/java/beta/tunnels/create.md", - "sha256": "326592802b8248e0a41acbf5f143b412aa8721127cdb1ebf81830e644d9914e8", - "size": 6358 + "path": "en/api/csharp/beta/environments/retrieve.md", + "sha256": "8475e23968eab89462bffd06ac9c59573c3bf08ffe7101541cf213eef18791b9", + "size": 8410 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/delete", "status": "success", - "path": "en/api/java/beta/tunnels/rotate_token.md", - "sha256": "46d79efaf00ad448d213633159936080406ee16b8ae3afed83eeaf912a992ebe", - "size": 5984 + "path": "en/api/csharp/beta/environments/delete.md", + "sha256": "b044924905677babaad6d7e9ac373fcab58e5d11926e3a75d79379db79841af9", + "size": 4895 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/create", "status": "success", - "path": "en/api/java/beta/tunnels/list.md", - "sha256": "1282461f17a22daf6ec7fb1d1fb3745e003080b42c7288e061a2f7dba6c1b4e4", - "size": 6636 + "path": "en/api/csharp/beta/environments/create.md", + "sha256": "23d4740eed0a4aeb245dc14d90e6cd5f71ad9ca842a6de39de86c4ccf7e31e17", + "size": 11346 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/models/list", "status": "success", - "path": "en/api/java/beta/tunnels/certificates.md", - "sha256": "39244828715ccda0c10bad3bb7893703fae142a487133dda87512e3cd2650114", - "size": 28324 + "path": "en/api/csharp/beta/models/list.md", + "sha256": "f5be33c94110911b82d94021914e31e0bdd6988dfbe11c2aae1ca6bb36cf7852", + "size": 15478 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/models/retrieve", "status": "success", - "path": "en/api/java/beta/tunnels/retrieve.md", - "sha256": "d31fed31a9eb69bf24187b553a4e9853f5a2e6f12af7e7126a4995f9c5a28db4", - "size": 6174 + "path": "en/api/csharp/beta/models/retrieve.md", + "sha256": "222410e0da07705fc47d2eddd553e6f3ae3b153828de2fc2b1b199ca0293f47e", + "size": 14152 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/list", "status": "success", - "path": "en/api/java/beta/tunnels/reveal_token.md", - "sha256": "9893ffc9712cc0b26d3de71c77f4e6b34915d20b108f0c414a2b1a1696c78cd9", - "size": 5883 + "path": "en/api/csharp/beta/user_profiles/list.md", + "sha256": "d8f93d2fd2dd62a6d817547eb1067c469dd91d52745d30fbe227e82d70e90d39", + "size": 11480 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/update", "status": "success", - "path": "en/api/java/beta/tunnels/archive.md", - "sha256": "007a2f6c2fd99a0cf252cfa52552b549c0a5e59799f7688387931a77c8e8f5e0", - "size": 6454 + "path": "en/api/csharp/beta/user_profiles/update.md", + "sha256": "59d065ba5a61548b9e1f703fc06c6a2fd3146189d8185bb192098da5683bfa4b", + "size": 12421 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/java/beta/sessions/create.md", - "sha256": "4a6d2706a1daa4104993966d78c6ab68871e925caa755ab33d6030cc05e464a9", - "size": 84649 + "path": "en/api/csharp/beta/user_profiles/retrieve.md", + "sha256": "76fe8dba7bebed4f7c4a655a5f09a6eed7fd65b1bebafd756a267518cd59d106", + "size": 10377 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/java/beta/sessions/resources.md", - "sha256": "6a279e627c43f6f55534621414718ce7f49ace22a9a57f4fc4ec8ca717020878", - "size": 40559 + "path": "en/api/csharp/beta/user_profiles/create_enrollment_url.md", + "sha256": "baa4e03d6f59af9299438eaa729cb94e4b46ab0ec02cee38547ba4b73020915e", + "size": 5343 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/user_profiles/create", "status": "success", - "path": "en/api/java/beta/sessions/update.md", - "sha256": "5fce78e275667c661fef78011756d8644cba8727daa2579e938ff8df64856360", - "size": 48086 + "path": "en/api/csharp/beta/user_profiles/create.md", + "sha256": "bc21c92803368f897354b4622b196878636cae942cb1b66d301b67f6863f5e00", + "size": 12555 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/list", "status": "success", - "path": "en/api/java/beta/sessions/list.md", - "sha256": "d639ee539fc04eee41186e557a125bb799efa2029b300bf039e84bc8b6734f0d", - "size": 49651 + "path": "en/api/csharp/beta/skills/list.md", + "sha256": "e2b7ab8f6e1fe77d398b95145db83fca11b10402d41d43c8908ac1c30c52ae03", + "size": 7045 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/retrieve", "status": "success", - "path": "en/api/java/beta/sessions/threads.md", - "sha256": "e0c05a905cfffc81bfa837c6236414fa5f5a4b87a67859dbdb0f7bac65a52cb8", - "size": 442866 + "path": "en/api/csharp/beta/skills/retrieve.md", + "sha256": "55c85f93fc314c3a2d9c70a65c3ea90fdb863607d3794825f3e7c67e7578841a", + "size": 6488 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/delete", "status": "success", - "path": "en/api/java/beta/sessions/retrieve.md", - "sha256": "809b2cc7a8d76e05d0e40f7b64be90ed42084b69c8c757efff22fd2bf7cf1bdc", - "size": 46769 + "path": "en/api/csharp/beta/skills/delete.md", + "sha256": "db9b66061bf132b92d474bc069f0c1b5735b303e21be3072870b4101fa2d355e", + "size": 4873 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions", "status": "success", - "path": "en/api/java/beta/sessions/events.md", - "sha256": "0ffa5c58f97e2ad294113b959293ff02856d4b39335ddf95a6d14c5e9bc1a784", - "size": 558003 + "path": "en/api/csharp/beta/skills/versions.md", + "sha256": "ceb40c98784228827b96616f376229e80a6f26f9930dff277bb2c035cca9ec26", + "size": 29521 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/create", "status": "success", - "path": "en/api/java/beta/sessions/delete.md", - "sha256": "0538c0eb4d3488629db7a7c0ef551502dd0baf3e8cc4297e754c869c46522488", - "size": 5232 + "path": "en/api/csharp/beta/skills/create.md", + "sha256": "44f1db8d55748087d1218005eed8239add7ee17f78620a86575cf82055d4365f", + "size": 6812 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/list", "status": "success", - "path": "en/api/java/beta/sessions/archive.md", - "sha256": "0e556a330ed510e3ae5f865bac1e7f9df8f30d68df87bcab4d3ae04fa9113fb5", - "size": 46784 + "path": "en/api/csharp/beta/tunnels/list.md", + "sha256": "7e9204b9f2e572149f8782e6c145c1d68cce32fa154cd1268c8318e134ab3077", + "size": 6215 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/archive", "status": "success", - "path": "en/api/java/beta/deployments/unpause.md", - "sha256": "f9c2895819e16c49585cdd38819e5b3a4485bbef6ec36e0082ea90018b9d5205", - "size": 20356 + "path": "en/api/csharp/beta/tunnels/archive.md", + "sha256": "7a86bf4abc6d6902fa99a7d5c9ed0f312341d3fcb78074154f70967f8f64f681", + "size": 6042 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates", "status": "success", - "path": "en/api/java/beta/deployments/create.md", - "sha256": "de6d18909a27f03023369187ab9e4da999e2e46b63177d1cc7be9d8d228c0b4a", - "size": 30339 + "path": "en/api/csharp/beta/tunnels/certificates.md", + "sha256": "a7f7e266b0f4e69fe973edaada8142e79bd987aea722a7165775c2970aa1ca72", + "size": 26362 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/retrieve", "status": "success", - "path": "en/api/java/beta/deployments/update.md", - "sha256": "3883b11cd0cfadf6e5008641ed5fdcf2f39e079082b3f658c306b0383abe9e5d", - "size": 29970 + "path": "en/api/csharp/beta/tunnels/retrieve.md", + "sha256": "99025b8014f173fdf68a8cac19e7b7a702e73d584ef3b20d3933ae4fbcb7414e", + "size": 5761 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/java/beta/deployments/list.md", - "sha256": "deac50cb05933b6439172bf919e6c0a9d6cfd8daec03fcff3e0804fda60f6693", - "size": 21388 + "path": "en/api/csharp/beta/tunnels/rotate_token.md", + "sha256": "098728ed3523207c5d66b0d76370a09e45e2bd5ca44b20c719390526c529d33e", + "size": 5543 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/java/beta/deployments/retrieve.md", - "sha256": "662749e50875f6ea4e81c780ec30537b48fcd71f66b86f8db3aa035bea1e9849", - "size": 20330 + "path": "en/api/csharp/beta/tunnels/reveal_token.md", + "sha256": "257e99eb64100f78937492109a57f231edd0ce27944270a3eddc3d4bd37f66fd", + "size": 5451 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/create", "status": "success", - "path": "en/api/java/beta/deployments/run.md", - "sha256": "92f21c43c12c69ff1df2cca2675a50676936d37adf0655738357872f36d71bc8", - "size": 10730 + "path": "en/api/csharp/beta/tunnels/create.md", + "sha256": "aa9f0fc9891ac2fa199b3c8749847c93c9b92bcc5df9214f94e55957f8b32bd0", + "size": 5923 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/list", "status": "success", - "path": "en/api/java/beta/deployments/pause.md", - "sha256": "6e538b1e7546cbd86648119dfddee255dbffd286dfbee3603c13d62d1c0d7302", - "size": 20334 + "path": "en/api/csharp/beta/files/list.md", + "sha256": "44bde625ce8056c5b4f22a3e1208b091fb94ffd423ea30dc023a0d169c36919b", + "size": 6883 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/java/beta/deployments/archive.md", - "sha256": "0b0518617cf61eb6d38fb03efa4b33d9d5b97db480ea85c87fffab9a5771bb34", - "size": 20356 + "path": "en/api/csharp/beta/files/retrieve_metadata.md", + "sha256": "aff83f513128ef4efa643148cddf8b165844064c166244f4dd794c53ee080792", + "size": 6133 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/upload", "status": "success", - "path": "en/api/java/beta/skills/create.md", - "sha256": "9b598a2937d2eb50ea1af2bb8c7897fc2856d218387b1b03f8b348aea899ed37", - "size": 7271 + "path": "en/api/csharp/beta/files/upload.md", + "sha256": "d12e885a23be028a0c3b02ffd27c52ffa18ad61048c892e5a839107ac97c21f9", + "size": 6516 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/delete", "status": "success", - "path": "en/api/java/beta/skills/list.md", - "sha256": "eaeb6f68edb36128474e54588a2a4047e112b7fa32471d77024e06876ca62fac", - "size": 7421 + "path": "en/api/csharp/beta/files/delete.md", + "sha256": "82ebad618d1e8afff02cf668d168e9df6c45f1689a2e2c2cd9173bd8f3085fd2", + "size": 4694 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/files/download", "status": "success", - "path": "en/api/java/beta/skills/retrieve.md", - "sha256": "eb1584559209f5667bd322fce58d4bc2b0c38ccada2ace1d1c28f1c0efc8564d", - "size": 6864 + "path": "en/api/csharp/beta/files/download.md", + "sha256": "5007ddaa427a2616238ac9c6e8b04030dc6b35c07ab9972dea3096ad05976a08", + "size": 4401 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/unpause", "status": "success", - "path": "en/api/java/beta/skills/versions.md", - "sha256": "2ded495b45b346ded1bb6b756c9b64dac7f8cdd0529e45db1513e1c753e5c66c", - "size": 31929 + "path": "en/api/csharp/beta/deployments/unpause.md", + "sha256": "b739b5c3ef6f6708a51b7a9ac87cb95c86527c2773957eadb6100ed7aa1bcbee", + "size": 20652 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/list", "status": "success", - "path": "en/api/java/beta/skills/delete.md", - "sha256": "b591f41a67a8105b84a31f421dd58d75c1bc9261c15d360dac3a233277f1c985", - "size": 5309 + "path": "en/api/csharp/beta/deployments/list.md", + "sha256": "38a9613fd9d50e0636c8522ce7012f6387307d2e473814975b5947bb8536d900", + "size": 21638 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/archive", "status": "success", - "path": "en/api/java/beta/memory_stores/memory_versions.md", - "sha256": "fb5a5fa84267894e7dfa1c0a101fa9c4b31505e67a14ccaa3d8770f5b30cfbaf", - "size": 45622 + "path": "en/api/csharp/beta/deployments/archive.md", + "sha256": "b55810b63972f07032316ffe7dbb35213b584aa261b21aaba08a1216f57f6ebb", + "size": 20652 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/update", "status": "success", - "path": "en/api/java/beta/memory_stores/create.md", - "sha256": "484f9f0418a26af4cc88723cfc51bcdfec9b1f0773ec75ccbc33a9ffdaa92b80", - "size": 8382 + "path": "en/api/csharp/beta/deployments/update.md", + "sha256": "ad5dd30ec2c26aeb1a24bc053993cca302d54893a7466d882a225c2326a98e46", + "size": 30590 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/retrieve", "status": "success", - "path": "en/api/java/beta/memory_stores/update.md", - "sha256": "f7d2c77c508240581e5e65db6cac79c7f18b6385fc70f61344da0d2700439d97", - "size": 8123 + "path": "en/api/csharp/beta/deployments/retrieve.md", + "sha256": "51809e3d8064ee4dd414f7e4956133b5186bb4042435fb1dcd69d499aed85ce5", + "size": 20625 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/run", "status": "success", - "path": "en/api/java/beta/memory_stores/list.md", - "sha256": "892be30d0b4a0165cf7f745f14a64462104f3efab63ed24523ba062dd9bfc4e9", - "size": 8029 + "path": "en/api/csharp/beta/deployments/run.md", + "sha256": "88e8f8b55d7d83c61ddc7681d9234cc7469246c0fe1c5f0eeff71cd0a1a3b5e0", + "size": 10665 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/pause", "status": "success", - "path": "en/api/java/beta/memory_stores/retrieve.md", - "sha256": "99faac70567674e0764664ceae7d3dd1aa51d66ea1907b1d951a0470e434f52e", - "size": 7322 + "path": "en/api/csharp/beta/deployments/pause.md", + "sha256": "90ba68d0070642deb0b730da0116164d482fdc8303fb33bad2728afa0e4771fb", + "size": 20632 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/deployments/create", "status": "success", - "path": "en/api/java/beta/memory_stores/delete.md", - "sha256": "c257624aaa129c17102fe9e88e7a963a1bc597ce5f74fd032f8a9ac29f3a4546", - "size": 5592 + "path": "en/api/csharp/beta/deployments/create.md", + "sha256": "40e5abee87c266ccda9c85112cfbf42543648f990ecfdcb1116d59dbe0c67823", + "size": 30940 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events", "status": "success", - "path": "en/api/java/beta/memory_stores/memories.md", - "sha256": "b1b22e5184e6f3b111d7ea03c08d2e8c65c9eabd51790d334ae5db0f63f8ec43", - "size": 57352 + "path": "en/api/csharp/beta/sessions/events.md", + "sha256": "96194b0a99fbaac3ff54422beb04cc64ec7ffce62b341fe30cd195b103b8fffc", + "size": 578125 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/list", "status": "success", - "path": "en/api/java/beta/memory_stores/archive.md", - "sha256": "8b8c419649043062a602e502630af4c952377231195e4284f1aebc47cedad11c", - "size": 7418 + "path": "en/api/csharp/beta/sessions/list.md", + "sha256": "955e002bcb615e44cffaae16e70862f3bcf14d770221f1e58c0996328b07dad8", + "size": 50500 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/archive", "status": "success", - "path": "en/api/java/beta/files/download.md", - "sha256": "db3a960ab4f9781e72aa8b4418bc1918baa9e58c8b2da74ac3ccd537cdb79b1d", - "size": 4841 + "path": "en/api/csharp/beta/sessions/archive.md", + "sha256": "3506821ef136b88442d48ce03020d80a43b1a5759cb09fb5c0266fa819e1d474", + "size": 47723 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/update", "status": "success", - "path": "en/api/java/beta/files/list.md", - "sha256": "3066ccbbf7c60b8d9fe0a53027c6da671844894f680bad7255c7a1ee3b10db76", - "size": 7293 + "path": "en/api/csharp/beta/sessions/update.md", + "sha256": "f4f85e2bb05b0dbc83415dfa9174551c8ef47bab4c4b059dc3037e338dcf0e76", + "size": 49015 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/retrieve", "status": "success", - "path": "en/api/java/beta/files/upload.md", - "sha256": "4da5d914ac59d362004015d97a1c70909f8220ce2a65ed5c23b23d5cf5e3f50b", - "size": 7045 + "path": "en/api/csharp/beta/sessions/retrieve.md", + "sha256": "e5656f431c4b52a21a3fe386b12da67be477b2cf09bbba65adbec97ff9da8e63", + "size": 47707 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources", "status": "success", - "path": "en/api/java/beta/files/retrieve_metadata.md", - "sha256": "c7d54d887de96f0efb226bf766b3133a460dd419d55752fa6608b0eaca0e4b02", - "size": 6560 + "path": "en/api/csharp/beta/sessions/resources.md", + "sha256": "4aaa3727e4cb5b9e6a2d3fd1bd526d4f57676bc8ac5eb184fd97474a00f6be59", + "size": 39038 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/delete", "status": "success", - "path": "en/api/java/beta/files/delete.md", - "sha256": "78eaf9c3fef73b3091f66a9b40b7450c70130fbf724f89404d31ac1fd891bef5", - "size": 5140 + "path": "en/api/csharp/beta/sessions/delete.md", + "sha256": "dd1317a2ef30e3a56dd1ea565d48af61e5c15464f149500ec5bbd668a8622d63", + "size": 4790 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads", "status": "success", - "path": "en/api/java/beta/messages/create.md", - "sha256": "5730c021970d2b404c3d1c1bc57e926f2bc7934d3b82717170cbd7e28ac6063f", - "size": 300607 + "path": "en/api/csharp/beta/sessions/threads.md", + "sha256": "6279e550258e07af8863179ba902fb6429dcf98ad39a737b6ed7b8ee1cb7f2b9", + "size": 453590 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/create", "status": "success", - "path": "en/api/java/beta/messages/count_tokens.md", - "sha256": "e2d16dfa7bfc4064c0e6b1132e85b523d26d51170cff650bd74f77bfe7d2e92e", - "size": 143150 + "path": "en/api/csharp/beta/sessions/create.md", + "sha256": "b9f740ad1d395ed5e0363dee08f341559ea6424ad09d24dfeadd5de296f63ea4", + "size": 88036 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/list", "status": "success", - "path": "en/api/java/beta/messages/batches.md", - "sha256": "c4219ed6c9b8d9af0649b9a2341a3ce663bd64ce6739f8fbee575e2c213a1edf", - "size": 805164 + "path": "en/api/csharp/beta/memory_stores/list.md", + "sha256": "14288e39a68cccc35c891ab527aa828a653c748848a50fac6eabdcd84ad2106d", + "size": 7634 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/java/beta/messages/batches/create.md", - "sha256": "77e2372ad4b9bd747d99bde2d4d95d136e00e6ebd2ff190a276053c41771cef4", - "size": 176529 + "path": "en/api/csharp/beta/memory_stores/memory_versions.md", + "sha256": "6d11ec82fe20c2176f7672d08257c2efb95e2dcc7537437ac6e482a51dcf72b1", + "size": 44296 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/archive", "status": "success", - "path": "en/api/java/beta/messages/batches/list.md", - "sha256": "d06f3c41bfd183b0344dea7a42f8e6fd0ab13f6b008d1e5ed11c18d5ff06b9e5", - "size": 9288 + "path": "en/api/csharp/beta/memory_stores/archive.md", + "sha256": "4e7545e8ed9e1fa39c739ef6240d2d47e59f47b2a8b7f0503884956216a584a6", + "size": 7051 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/update", "status": "success", - "path": "en/api/java/beta/messages/batches/cancel.md", - "sha256": "f0a1d817c67d51baf178331d8e6c2f9f3738106b93eafb2184389075530b1c6f", - "size": 9160 + "path": "en/api/csharp/beta/memory_stores/update.md", + "sha256": "86c72cbb003925a81cf3ef4c168e49baf069a276eb903348aea56a64577bc7b8", + "size": 7757 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/java/beta/messages/batches/retrieve.md", - "sha256": "94b7ce1e2b880553a3ca3452f7c10176d80b13af18a9faee3a55f797430ba887", - "size": 8858 + "path": "en/api/csharp/beta/memory_stores/retrieve.md", + "sha256": "ae6a6311a0605663c8ec416803e11d0a9a4487160ddab97630683f6ffc226873", + "size": 6954 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/delete", "status": "success", - "path": "en/api/java/beta/messages/batches/results.md", - "sha256": "3412c05c9391acade67e4de9fc17fcc32ec6bb81cc9f58e9a493b738cfff457c", - "size": 155422 + "path": "en/api/csharp/beta/memory_stores/delete.md", + "sha256": "62fc07d18b282d1b5740802eee5bc0846079e216a38bd5e1658d7bfabd1d6a8d", + "size": 5142 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/create", "status": "success", - "path": "en/api/java/beta/messages/batches/delete.md", - "sha256": "e2f4a47825f067f731335b0f515b95106b7bdd5de4ccabac2fcc3ad91b0ef5fe", - "size": 5664 + "path": "en/api/csharp/beta/memory_stores/create.md", + "sha256": "649904b6ff8a7af8d1bcb2ae65691882c2f1c1c3cf43535013cf87bea7e5a204", + "size": 7932 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories", "status": "success", - "path": "en/api/java/beta/memory_stores/memories/create.md", - "sha256": "bf1505d7b3afda2270cd9e33f3b61936a6d1f0bbce3f45912bc06fbe47e6b6d4", - "size": 8927 + "path": "en/api/csharp/beta/memory_stores/memories.md", + "sha256": "bd9e46aece79297e79f509c51e6f4bd9d1ab1d372e0ed68a1fc7bdb5d1316e12", + "size": 55199 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/java/beta/memory_stores/memories/update.md", - "sha256": "810efc29e917a0ba679bc577dd392c36121c38bc5366c600c8e941482ae09810", - "size": 9307 + "path": "en/api/csharp/beta/memory_stores/memory_versions/redact.md", + "sha256": "01bf4e5ffd25a373a33fd11b63ae0dfcdb768451906452f764660c5b138a1a39", + "size": 10993 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/java/beta/memory_stores/memories/list.md", - "sha256": "a8db794a2276a090e1fc06bbf491ad36006c3f298c619376c10f552dc9791826", - "size": 10272 + "path": "en/api/csharp/beta/memory_stores/memory_versions/list.md", + "sha256": "74b042199f4489972123b8aa9c2d53a9d3b0ace66fdd44253b983d58d49bb080", + "size": 12757 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/java/beta/memory_stores/memories/retrieve.md", - "sha256": "b8efa4bf9fb2a92218780c28361d7d3df5bf5c2fec56d8012e826e592544d5d1", - "size": 8420 + "path": "en/api/csharp/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "d0e93a3573b9c9666ba55456358add7bd40e11786b56f39571e841d229df983b", + "size": 11310 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/java/beta/memory_stores/memories/delete.md", - "sha256": "8124498723922ec5bb94b8d8457bc1402ebce5d21ae2a21c896e3e676f501aa2", - "size": 6563 + "path": "en/api/csharp/beta/memory_stores/memories/list.md", + "sha256": "bc23a02fd3e74f157795146119bdc802a3df270e7d96c4ad2df276d9e54589f0", + "size": 9903 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/java/beta/memory_stores/memory_versions/list.md", - "sha256": "6a1a520db3fbb60b77d91e2a93e1da2569859928eb711f4752d3c14a7e1fab8c", - "size": 13230 + "path": "en/api/csharp/beta/memory_stores/memories/update.md", + "sha256": "f09c181d68ef15020e8b035a3418286fbca9b8ac2fd02679adc165112b76ae1b", + "size": 8791 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/java/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "12354f1d93423eeb17ad6367ab4dff8b07e80d37e8015ec1ec9a61d60804facd", - "size": 11841 + "path": "en/api/csharp/beta/memory_stores/memories/retrieve.md", + "sha256": "b80d6a0298cfb3b22c2f0998ff841ecc52b59f78cfa51aa927ee1472e70637e8", + "size": 7928 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/java/beta/memory_stores/memory_versions/redact.md", - "sha256": "6dafce72d5b2a2ef7c65996bd3e02b693aee871a703490169d60d910adafaa80", - "size": 11510 + "path": "en/api/csharp/beta/memory_stores/memories/delete.md", + "sha256": "53c4e58a66d8d92e3f68815bea969a7d15aa504f4344d9e71eaae95d7b4c5f79", + "size": 6015 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/java/beta/skills/versions/create.md", - "sha256": "1db96ab1ed173640545cf6b859d17d720e040575075151e9cc1ae3b184505b6c", - "size": 6597 + "path": "en/api/csharp/beta/memory_stores/memories/create.md", + "sha256": "cb4eb913392599a877c5737d5d272d4239dbc87df8e9b1afc2e362341f7548cc", + "size": 8432 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/list", "status": "success", - "path": "en/api/java/beta/skills/versions/download.md", - "sha256": "2e8dc7e42563935b55b304636bb7e1024b0ea8df1b06bb11f2e92f8ca6c87ccf", - "size": 5420 + "path": "en/api/csharp/beta/sessions/resources/list.md", + "sha256": "70c41d73abce280eea42fd4ea243a66d7816c69c7ca64552ecd3dcc82fb9a145", + "size": 8098 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/update", "status": "success", - "path": "en/api/java/beta/skills/versions/list.md", - "sha256": "06371b3307a1352fc52ddab7317fd4f4987ba1b2bacd1700223c72944762ae62", - "size": 6555 + "path": "en/api/csharp/beta/sessions/resources/update.md", + "sha256": "1d5f5ef5c8bbff47f1bc1b3fab7a3b99f4fbe23051ec8b7f899402a59a617709", + "size": 7816 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/java/beta/skills/versions/retrieve.md", - "sha256": "0b66f111380d700387f42b6073ec84a8b8583a2b420804304fd6d39a70b83df9", - "size": 6642 + "path": "en/api/csharp/beta/sessions/resources/retrieve.md", + "sha256": "7a61003b9e1f413ff4f44e0749bd3c888bf4f96f54dae24b2ab56365a584b41b", + "size": 7584 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/delete", "status": "success", - "path": "en/api/java/beta/skills/versions/delete.md", - "sha256": "2eafae1e6af7e49be36b18ea814243cc332814ec8ccf8062cb8a45ff8f14d546", - "size": 5821 + "path": "en/api/csharp/beta/sessions/resources/delete.md", + "sha256": "00348df1b55f8da7b578b4b253fd2f2537b50a8e62e780d8da9f076419814638", + "size": 5039 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/resources/add", "status": "success", - "path": "en/api/java/beta/sessions/threads/list.md", - "sha256": "217246f1839ceafca80bba11b887c7a435b5842a51cf5089fda8f7248d2d0b01", - "size": 35429 + "path": "en/api/csharp/beta/sessions/resources/add.md", + "sha256": "944c767e59993d73b6cf7595f30e8ab88ce2430d8cf46d47c499a43124cce6e4", + "size": 5615 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events", "status": "success", - "path": "en/api/java/beta/sessions/threads/retrieve.md", - "sha256": "ad6652fe38c14a61418c93317b90307e3556d211d493e6d445ea1d9130cffc5f", - "size": 34680 + "path": "en/api/csharp/beta/sessions/threads/events.md", + "sha256": "9d1647694a663b5458db1ebba0470a72389d434ed0606e3db91668fab91eaa80", + "size": 200614 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/list", "status": "success", - "path": "en/api/java/beta/sessions/threads/events.md", - "sha256": "ccf52a929c9087b5af97fc0ae763a8a57205e2678b38adb65f3b3c135bd0c8c0", - "size": 194801 + "path": "en/api/csharp/beta/sessions/threads/list.md", + "sha256": "d093163564c39bce67f7f2d13259957c6458734fe7f826c5bcfd029e0f2a7720", + "size": 35629 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/archive", "status": "success", - "path": "en/api/java/beta/sessions/threads/archive.md", - "sha256": "d578777913fd4284ea4f87fae77016a89ad388c2118db45e56549ae63cb7d043", - "size": 34694 + "path": "en/api/csharp/beta/sessions/threads/archive.md", + "sha256": "232c469c0779a8422fe03db7cc58d27835f796df9cba7ba1219516d275e2e7ba", + "size": 34768 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/java/beta/sessions/resources/update.md", - "sha256": "114586c4e9c9b69a3a126ca8f4665455cea7fbe159d7bef9aee378e953a442a9", - "size": 8168 + "path": "en/api/csharp/beta/sessions/threads/retrieve.md", + "sha256": "04cc7a9c98e7dfbdf1adfcee5a333d3be97f3d009ae5f8423748941fe39963cc", + "size": 34752 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/list", "status": "success", - "path": "en/api/java/beta/sessions/resources/list.md", - "sha256": "432ba394e3fa8931da9cf3e928fc3aa28909dbf4db858bce69bfdbe2b77a7a78", - "size": 8323 + "path": "en/api/csharp/beta/sessions/events/list.md", + "sha256": "9fd4244d830a3a85da21629968314da438d6934e4752eecff76246455542be3e", + "size": 102039 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/stream", "status": "success", - "path": "en/api/java/beta/sessions/resources/retrieve.md", - "sha256": "77f1d43eb53f632d981580917887a6445050c6f0df0f52c172a9d91d1ffd73f2", - "size": 7946 + "path": "en/api/csharp/beta/sessions/events/stream.md", + "sha256": "e9a781677c96ae7712192aaca99859cc2f84241de79d73124d2708e74bc39032", + "size": 101805 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/events/send", "status": "success", - "path": "en/api/java/beta/sessions/resources/add.md", - "sha256": "25974158a42643b933af2143aebc74e85390af082b549f43978f6b11b4701153", - "size": 6160 + "path": "en/api/csharp/beta/sessions/events/send.md", + "sha256": "88a44c1bce02ab2967539e2253acd981d4b9d06d02bede89d20626915d8eb580", + "size": 27140 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/java/beta/sessions/resources/delete.md", - "sha256": "e1175737850587bca4babe5e8c3fec6278dbda9f42d0633b40e669ce69aae797", - "size": 5554 + "path": "en/api/csharp/beta/sessions/threads/events/list.md", + "sha256": "10a4fe2e075015c00f543c2c5926eb2a09be32428d75ebcdde4169014e86a7e8", + "size": 98728 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/java/beta/sessions/events/send.md", - "sha256": "a925787423760c2bcd3121a8095d8c2045d6c5f094f2f1789667ea2644c9590e", - "size": 26821 + "path": "en/api/csharp/beta/sessions/threads/events/stream.md", + "sha256": "7fe856c8807c8c151713c11176813dfc9c8d377c42d08f357b9e5c4f52c425eb", + "size": 102023 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/java/beta/sessions/events/list.md", - "sha256": "b6ba7467190868fe28fc0cff25d4a637c8b03ea5886e14aca8a8d8689f177db6", - "size": 99175 + "path": "en/api/csharp/beta/tunnels/certificates/list.md", + "sha256": "2ab29a7325bcc0d48804f90301391e40e3fbe43ad9751e6228fdfe13ec5e0c5d", + "size": 6616 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/java/beta/sessions/events/stream.md", - "sha256": "4ca26388786a3bacaec07d4dcc8576a1544d331750a12e924c24758112e2edad", - "size": 98803 + "path": "en/api/csharp/beta/tunnels/certificates/archive.md", + "sha256": "a496366ab26dce741f779576d6f369ca2bfeab2e6933a9c61f116b1ea405b12f", + "size": 6458 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/java/beta/sessions/threads/events/list.md", - "sha256": "e21229a11877415d1e97910fa40078afab8c878102c23a3daa48492b7fe1d735", - "size": 95818 + "path": "en/api/csharp/beta/tunnels/certificates/retrieve.md", + "sha256": "0e55a57c2af08369b0a6967d11aabe97105d9643fa9834672058c42aa8ee7810", + "size": 6223 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/java/beta/sessions/threads/events/stream.md", - "sha256": "c70ec67b9226de65a311559fbe4ff142dab44753d440642fdac33cc1adc54de5", - "size": 99118 + "path": "en/api/csharp/beta/tunnels/certificates/create.md", + "sha256": "475fc5f2b5654d79df04bafde6d9a00961a902114ebac3653c62116ddfac64e7", + "size": 6469 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/list", "status": "success", - "path": "en/api/java/beta/tunnels/certificates/create.md", - "sha256": "ba738ef194b7a9d3a5a9e7eb2b0f72f2889d78e9e7a71ea53aec54d364a9f86b", - "size": 6990 + "path": "en/api/csharp/beta/skills/versions/list.md", + "sha256": "922d13f2ba9d3128e49956502a20e4e959b837d283d0be5838a7e90304dde234", + "size": 6166 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/java/beta/tunnels/certificates/list.md", - "sha256": "2edd2f241c9c8afddec5453053d7697dc7c4b94a0c0353977f283f3715e75a85", - "size": 7044 + "path": "en/api/csharp/beta/skills/versions/retrieve.md", + "sha256": "95a1fe6a8af0ba3f8d9590312df44e2d95090e9633c25e6ed60e31df174ecfbc", + "size": 6142 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/delete", "status": "success", - "path": "en/api/java/beta/tunnels/certificates/retrieve.md", - "sha256": "1e23c43e0acc113f5ecc73296ec66a5006b3fb4536ffc2698029838f26d064f9", - "size": 6748 + "path": "en/api/csharp/beta/skills/versions/delete.md", + "sha256": "60bc0500e07b51f88ea1e0fc82ae50f953050d21179c523c24cb7ae938b4d517", + "size": 5281 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/download", "status": "success", - "path": "en/api/java/beta/tunnels/certificates/archive.md", - "sha256": "ccf7addb8ce1c3db1f42f058168110adbab380a16426be9a2b08c565a5c33007", - "size": 6981 + "path": "en/api/csharp/beta/skills/versions/download.md", + "sha256": "67e9a134730a34f8ec9eae37105cdba589ac179040b1297f8d835fa7c03d5785", + "size": 4890 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/skills/versions/create", "status": "success", - "path": "en/api/java/beta/agents/versions/list.md", - "sha256": "836e0dc62cdc26850d679ac7ba2bbe294111bf9d7b732144f53eba4477fcb1d3", - "size": 32008 + "path": "en/api/csharp/beta/skills/versions/create.md", + "sha256": "64593e90dbf43ed51490241f4e33858c57b57fe45480256bb0ced7571d17006d", + "size": 6097 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/list", "status": "success", - "path": "en/api/java/beta/vaults/credentials/create.md", - "sha256": "8e652e3c11f2ba0dae90e46ad34357a03dcfb928767fbb61b9c981bad709056b", - "size": 14971 + "path": "en/api/csharp/beta/environments/work/list.md", + "sha256": "38fd7a1a1f8e103252f633031ef8c0ef61950bdb03a776bd1be9bf2a7d224e71", + "size": 7083 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/java/beta/vaults/credentials/update.md", - "sha256": "ef93c8f0f781548674c51136bf6e97e164db15ae57f530f6227291bb2b63cb51", - "size": 14366 + "path": "en/api/csharp/beta/environments/work/heartbeat.md", + "sha256": "c36201f93268b898597f37d3ac322d7512037f8fa2033f0443b3c9b2f16e3904", + "size": 5880 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/update", "status": "success", - "path": "en/api/java/beta/vaults/credentials/list.md", - "sha256": "83140bf0cdcc8afbed012e7d9ab905fee4684dc2a225352d7e9bddf9cf6e973d", - "size": 10114 + "path": "en/api/csharp/beta/environments/work/update.md", + "sha256": "3a7dde0bdc358ad41b187ed90d5b059841e08920780fa566d2c44b5b2a44d2cd", + "size": 7499 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/retrieve", "status": "success", - "path": "en/api/java/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "e2af4e354e9e0c7103ce265baf28f6225377251e4574f74b84da2fe42dc8f198", - "size": 9065 + "path": "en/api/csharp/beta/environments/work/retrieve.md", + "sha256": "97deed600ce828815888a2b6bb93690bd1ef34a29781434ba6ff46ecd0ec4058", + "size": 7215 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/poll", "status": "success", - "path": "en/api/java/beta/vaults/credentials/retrieve.md", - "sha256": "05eb4dd6ad9082263ca34ecbe84d99ca9963f2a443df1f584bbef9a1f70522e2", - "size": 9780 + "path": "en/api/csharp/beta/environments/work/poll.md", + "sha256": "bb586f5b9bf602341567e1019ffedf90ec614c7c5eda2d5e5567f39057c468c5", + "size": 7308 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/stop", "status": "success", - "path": "en/api/java/beta/vaults/credentials/delete.md", - "sha256": "1080bed9dc63193f7fc26ac5c351b16122e1cfdbe4f989dd9a3f51ace67416fd", - "size": 5695 + "path": "en/api/csharp/beta/environments/work/stop.md", + "sha256": "07e8fe70826d66dabb29f4382a8f0213452980a07e7d07c3bec9c6e49e15eacc", + "size": 7273 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/ack", "status": "success", - "path": "en/api/java/beta/vaults/credentials/archive.md", - "sha256": "be9ffc2934a174311daf51f661b06d0ee95d3513d24434b0a23b517f4ef22514", - "size": 9778 + "path": "en/api/csharp/beta/environments/work/ack.md", + "sha256": "6ccbbf965e8976ad68ad3d634f95a789a4d9be6e0c8ba8063e4c6cabc343c9be", + "size": 6894 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/environments/work/stats", "status": "success", - "path": "en/api/java/beta/environments/work/update.md", - "sha256": "bf828077c7ca5d7d55d4b9b8587717c0020f0ce0315f0d5ba3dc74eb400a5e8a", - "size": 8115 + "path": "en/api/csharp/beta/environments/work/stats.md", + "sha256": "1cfa6e1553ff2b0d872adc18d90d5234b069a788874bf35aca6880e4a4e16438", + "size": 5505 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/agents/versions/list", "status": "success", - "path": "en/api/java/beta/environments/work/list.md", - "sha256": "4f06aff958a18d39a918df56224ba36b0239bf7d51de1ae2a69c23fd229783a4", - "size": 7400 + "path": "en/api/csharp/beta/agents/versions/list.md", + "sha256": "a5ba67d8851fb295d8c072e19507aa2065e3714547c2e402a94060394fd69564", + "size": 32426 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/cancel", "status": "success", - "path": "en/api/java/beta/environments/work/stop.md", - "sha256": "b7775f8685551ed6dcd86291c979ad5b2dc1dba0145ee3202d753d54ea1fd157", - "size": 7912 + "path": "en/api/csharp/beta/messages/batches/cancel.md", + "sha256": "f515f1b514f30b30af537bca172191ad8fe76e516be8e823cce89f80aaed0798", + "size": 8804 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/list", "status": "success", - "path": "en/api/java/beta/environments/work/retrieve.md", - "sha256": "6058b98ad6adf6f62de66410aa5f8ceae1204fc61996f600f86085788f967b30", - "size": 7667 + "path": "en/api/csharp/beta/messages/batches/list.md", + "sha256": "03e1a50a8d095927685d448c23ba04f47231ab0356f0eb4ba4d7cd3948b93579", + "size": 8928 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/java/beta/environments/work/ack.md", - "sha256": "9bd54471cff29dca557037b08ab34526b8f1859533f553ed6ee219b460482d60", - "size": 7326 + "path": "en/api/csharp/beta/messages/batches/retrieve.md", + "sha256": "9796a7a30a0e7cc2533e91865bb3b0bfd4ba3c43c385f57c03df9515dd988c8e", + "size": 8500 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/results", "status": "success", - "path": "en/api/java/beta/environments/work/stats.md", - "sha256": "e6fc7307d5728c9251de4cddf280cfbe042546c2499a148e58beddb9163f4830", - "size": 5947 + "path": "en/api/csharp/beta/messages/batches/results.md", + "sha256": "89fc98e2a4efa8fc756fd9416af8d95c5ea150a52c73d2b384f45bf9d16c4897", + "size": 154172 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/delete", "status": "success", - "path": "en/api/java/beta/environments/work/heartbeat.md", - "sha256": "bc93b30ab2d334800d7dee2da43b42b7d9ef88592ef6087f82714f153ad13e26", - "size": 6418 + "path": "en/api/csharp/beta/messages/batches/delete.md", + "sha256": "6e1ca29566a8231fd27d043ccb0f0ca2279f5fb68d7fce92bf53015f89b22bc1", + "size": 5216 }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/messages/batches/create", "status": "success", - "path": "en/api/java/beta/environments/work/poll.md", - "sha256": "7023e91469cea61db7e3d7808e7307a40ee986cff41dbdf379676deb9b26e8d3", - "size": 7719 + "path": "en/api/csharp/beta/messages/batches/create.md", + "sha256": "7aebdb37b8ece1b846b8786f82e7f2de6af07b70caf20f0992bb3cc9a7d24c5c", + "size": 181060 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/list", "status": "success", - "path": "en/api/ruby/beta/sessions.md", - "sha256": "5c307ed87f43686af0355912be6939a9d62ade6c75c117d3b28add7c32b9b94d", - "size": 1197613 + "path": "en/api/csharp/beta/vaults/credentials/list.md", + "sha256": "0a792e012d1d0b301edd922359c1a6a120b7b510c3681926a19ef9f6bacd646e", + "size": 9878 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/webhooks", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/archive", "status": "success", - "path": "en/api/ruby/beta/webhooks.md", - "sha256": "0c6b70312b9a543599c89bee6d1dea7d94154a752306664acc97c1145b5a88f5", - "size": 36683 + "path": "en/api/csharp/beta/vaults/credentials/archive.md", + "sha256": "caccecf336da431eb6edf1f964fa5c03bba5177ca4c571ac2469bb1f4b64cd8d", + "size": 9435 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/update", "status": "success", - "path": "en/api/ruby/beta/skills.md", - "sha256": "06e44ac8e0eb45f3a12b233de5c498193d71d1904950b035e61b7544d158d002", - "size": 41131 + "path": "en/api/csharp/beta/vaults/credentials/update.md", + "sha256": "00b4fda4b8d7e5eac7acdc95e47233e4f2b93d396a61fa57c7f7d818ddda2bf6", + "size": 13970 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/api/ruby/beta/agents.md", - "sha256": "606d6b6426352a745f6fb74e70470de5d76f64688317c4f3d690f4cbd6e9c876", - "size": 458754 + "path": "en/api/csharp/beta/vaults/credentials/retrieve.md", + "sha256": "484fd8131dda6a5a77349ea50332377e7afbe3bc17ec9944a7cda3b0c9bf40df", + "size": 9435 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/api/ruby/beta/deployments.md", - "sha256": "6a95fb2cc1d38f2f8038320d6470dbdaa92bdf20695c67a5e1748d8b86b767e8", - "size": 218846 + "path": "en/api/csharp/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "ee7ccd24761fb7b9ff7ef78b053c079744f5dfe6acda5948ed58deb0217a1705", + "size": 8570 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/delete", "status": "success", - "path": "en/api/ruby/beta/deployment_runs.md", - "sha256": "244b660b0896de6ce4841797bb318986b09caaa1092cdccb642e6046064280ba", - "size": 31884 + "path": "en/api/csharp/beta/vaults/credentials/delete.md", + "sha256": "04a7b6549ece6ec650f3c9f1e47d45d147fa91d5cf9576bf9ff70ad990448b13", + "size": 5142 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/vaults/credentials/create", "status": "success", - "path": "en/api/ruby/beta/user_profiles.md", - "sha256": "de2498df707abb1942aa814f91992cd774b87516f0c9bc88f31808fc91361b1f", - "size": 64367 + "path": "en/api/csharp/beta/vaults/credentials/create.md", + "sha256": "77789336697adbf13d53e2b758236bb492dae8c802fbd31b1c0f52c80b32e226", + "size": 14639 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/models", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/cancel", "status": "success", - "path": "en/api/ruby/beta/models.md", - "sha256": "249f01d9538754657258756ae17de2b7cb6949123a908f2550dda5aa2643ea26", - "size": 43509 + "path": "en/api/csharp/messages/batches/cancel.md", + "sha256": "de5f009da45b697a43dfd4cd625adc99cae3128e58e61dbbe7e718f5c40bfd52", + "size": 5323 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/list", "status": "success", - "path": "en/api/ruby/beta/vaults.md", - "sha256": "1029ec93fa6544fffc7c7fdd594d699fde011869fd710a996ec4d25c409d1f50", - "size": 84621 + "path": "en/api/csharp/messages/batches/list.md", + "sha256": "191ef019a3925f84b277d5bee45db43f6cac25e7d2f8450da52de2b4a99ba22a", + "size": 5459 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/retrieve", "status": "success", - "path": "en/api/ruby/beta/memory_stores.md", - "sha256": "9d902187515c8b6563e16f447939c24a128f1315955ef7790ac7cb57b952b5c8", - "size": 99464 + "path": "en/api/csharp/messages/batches/retrieve.md", + "sha256": "584887ff149dba037b40545ab5cf6178c800c6b5e4dba3395f9e8fb39ee61f9f", + "size": 5019 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/results", "status": "success", - "path": "en/api/ruby/beta/tunnels.md", - "sha256": "9b4df61bc2f97859328d88afe1a29faed18e276d0b738afda27fdc61bed087b9", - "size": 44947 + "path": "en/api/csharp/messages/batches/results.md", + "sha256": "9a1e2825acaf13564af0da68715d12d79c25acc82e90754de3049a8c29a9f543", + "size": 38680 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/delete", "status": "success", - "path": "en/api/ruby/beta/environments.md", - "sha256": "4a6d3e91fe29ccb467c40cc91fb10b4d3102d5337c6ebe12d55364040abf32bc", - "size": 92590 + "path": "en/api/csharp/messages/batches/delete.md", + "sha256": "6f0b992dd2c2946d0adf772e502637f0e37255d2c6683544f94e66cf8d32d200", + "size": 1739 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files", + "url": "https://platform.claude.com/docs/en/api/csharp/messages/batches/create", "status": "success", - "path": "en/api/ruby/beta/files.md", - "sha256": "d7c20c116b9a8604f1ae63b8e14a9612069a2a4ac4f918ff33a7bf92f711e05f", - "size": 22105 + "path": "en/api/csharp/messages/batches/create.md", + "sha256": "1b0a623f8ad88c562346ecc116ba426970ec92f8331651ef51eae10928a0b485", + "size": 118449 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages", + "url": "https://platform.claude.com/docs/en/api/cli/messages/count_tokens", "status": "success", - "path": "en/api/ruby/beta/messages.md", - "sha256": "dcc59da0df2228d7bc85b26b60515f7b92fbe9c48d8a3a0c981960dcb191cb13", - "size": 2955237 + "path": "en/api/cli/messages/count_tokens.md", + "sha256": "aa161c84f800e0e1002d1fea041ca7bf6bcbbd378b9bb455b80ef501f6613656", + "size": 8814 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/models/list", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches", "status": "success", - "path": "en/api/ruby/models/list.md", - "sha256": "038f0dc01a62ac3f01a289127915baf4390492503c31c1a5a87595b970f38523", - "size": 12770 + "path": "en/api/cli/messages/batches.md", + "sha256": "fcb941fb279a94d84571d928acebb43d540432fc03fa52b52a330e831ed0b4c5", + "size": 163331 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/messages/create", "status": "success", - "path": "en/api/ruby/models/retrieve.md", - "sha256": "c088a09f8e5e040477fe9c217265ae6da1c2feea5801b62bcb6ba6eee416747b", - "size": 11533 + "path": "en/api/cli/messages/create.md", + "sha256": "03472b8f709bd3987b65dd44c296be44c09d83ac08761ec3a684fd67b1379cfe", + "size": 61454 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/completions/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults", "status": "success", - "path": "en/api/ruby/completions/create.md", - "sha256": "0ebdff12a0e9a1d5c7d40fc127aead32d32032a7c69d86e7635cda331bfc4828", - "size": 12965 + "path": "en/api/cli/beta/vaults.md", + "sha256": "4d8f5500ac97c83f196531d6d5a72e78bb11bc6c08b05ebcac9b8491ff84f3f7", + "size": 50207 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs", "status": "success", - "path": "en/api/ruby/messages/create.md", - "sha256": "5cb70022f63685b6ee9feeb16615b2dac95b69adfa542a9402c8e600e0b9b3cd", - "size": 132095 + "path": "en/api/cli/beta/deployment_runs.md", + "sha256": "7ccf879197326e2a01460a3533f97275cb99c5b256cbee887c224ad363379008", + "size": 28830 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/cli/beta/webhooks", "status": "success", - "path": "en/api/ruby/messages/count_tokens.md", - "sha256": "ea84100825c108e4c5864ddd396dae3122e689a4cd33f57b9bd99ea0fbd4dec6", - "size": 91467 + "path": "en/api/cli/beta/webhooks.md", + "sha256": "c9fdede1add0bda5dd09b8bd45d5346a05eb99296a41eb5c43fd7a27e288ab8e", + "size": 37705 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches", + "url": "https://platform.claude.com/docs/en/api/cli/beta/models", "status": "success", - "path": "en/api/ruby/messages/batches.md", - "sha256": "f1856dd2c0ea3d2b92d73eff263766f211e0a1ab6794ef377359274373d718f4", - "size": 261787 + "path": "en/api/cli/beta/models.md", + "sha256": "262e9456eebb56fcf3ceb660183559400712c6ecba9879b09002f2bfcf8eb7d1", + "size": 46934 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills", "status": "success", - "path": "en/api/ruby/messages/batches/create.md", - "sha256": "e4447c3bb5659d881df539d87a673c5d66be164f77b98056c37f0609f1da36c1", - "size": 107452 + "path": "en/api/cli/beta/skills.md", + "sha256": "669c8c2890e553457c8d4376f30ba93e58d84871d1c1568849cf53757c64cf8c", + "size": 23606 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores", "status": "success", - "path": "en/api/ruby/messages/batches/list.md", - "sha256": "4d1de6dacf278bd9f8d34bb025d16f4685371ace5771829ada90396e26dd31e4", - "size": 5126 + "path": "en/api/cli/beta/memory_stores.md", + "sha256": "01f5cde5abf83e2786c46b0cdead666b9d8ab030f8ef255d74f246d6806eb39e", + "size": 71427 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages", "status": "success", - "path": "en/api/ruby/messages/batches/cancel.md", - "sha256": "f6f4be4ef805eb638926a719b3c415628bb091dd3b43185bd198333750838383", - "size": 5030 + "path": "en/api/cli/beta/messages.md", + "sha256": "3a9cbf5cb4a21927dc2621b6dd14148ef59aebd5eecea6ba746ab4ad8c381f67", + "size": 2935296 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents", "status": "success", - "path": "en/api/ruby/messages/batches/retrieve.md", - "sha256": "f78e3197b9660b1e95750de381ef235dc8ab5e4a59b82edff64b159bb2d0700a", - "size": 4722 + "path": "en/api/cli/beta/agents.md", + "sha256": "7a656b34ac7e0cbe35f713258210e437cde86aba5d2943b47bf9687b14154031", + "size": 410572 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions", "status": "success", - "path": "en/api/ruby/messages/batches/results.md", - "sha256": "d7228969287054ea5eee9b8d04ab5506f9f7e2d5d28ddf4ae5b34a7325e11893", - "size": 35751 + "path": "en/api/cli/beta/sessions.md", + "sha256": "120957df5ee1e55dcf4ead8ff1354f093a3c4207dcae541ad1410e1af89768f8", + "size": 1196982 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles", "status": "success", - "path": "en/api/ruby/messages/batches/delete.md", - "sha256": "9b9980d90ddc834c06d4e25e83b4ea1ea0864befb1136082c9a30d362cedbe45", - "size": 1597 + "path": "en/api/cli/beta/user_profiles.md", + "sha256": "32ac84df5b28ec210834fbcb69796ff5975b7148794474487bd0f2eaa3affb24", + "size": 45274 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files", "status": "success", - "path": "en/api/ruby/beta/environments/create.md", - "sha256": "61407dbafe5832fa42cfb77ea968dfe796b5e7d5146e7d824c61126dafb1d339", - "size": 9465 + "path": "en/api/cli/beta/files.md", + "sha256": "ec00adeb9fe8c4ded12ade8e60ca81045cff2820c6b3d5393840f1d26384a01d", + "size": 12411 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments", "status": "success", - "path": "en/api/ruby/beta/environments/update.md", - "sha256": "ca5ac58bafa26c6cb729e7bd149cf8ac4f50ac3de22e33a8d050bd11d57f4ae9", - "size": 9551 + "path": "en/api/cli/beta/deployments.md", + "sha256": "a88388dc7208ab58e8054cdd0af5057a427c5ec71ad1b6a331422ba4028cd645", + "size": 190892 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels", "status": "success", - "path": "en/api/ruby/beta/environments/list.md", - "sha256": "c0e9cca02f183ad57a329c748eef6a412597bf46b2c6eb45a5c191f3f27c8fad", - "size": 7148 + "path": "en/api/cli/beta/tunnels.md", + "sha256": "a6505a8e3b10e44261bf779b15788a80c1c3cc4a5fd67c40923551e2d6e5ebf8", + "size": 25172 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments", "status": "success", - "path": "en/api/ruby/beta/environments/retrieve.md", - "sha256": "aeecb41cbf10d47c9207e9d913929ff622056b9bbe66eda384782fcdf960279a", - "size": 6673 + "path": "en/api/cli/beta/environments.md", + "sha256": "11b0e93a93e9ccbce8b912af2e02d0e70a18deb4c9c48f27572d5b28b16a290e", + "size": 60825 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/delete", + "url": "https://platform.claude.com/docs/en/api/cli/models/list", "status": "success", - "path": "en/api/ruby/beta/environments/delete.md", - "sha256": "f868919727118c2898d4af374be308ad574a42a7c2b9fb5234c9cfe6c8385d09", - "size": 3385 + "path": "en/api/cli/models/list.md", + "sha256": "b33e822b4b85d34f6dab30b7419f43972a4323caa9e4b17635d6da820c217e0b", + "size": 12928 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work", + "url": "https://platform.claude.com/docs/en/api/cli/models/retrieve", "status": "success", - "path": "en/api/ruby/beta/environments/work.md", - "sha256": "8f4d5a9f5c98a072bd1ff7e540ce7d38994bc552b2c5c86db4619e76ffce0af7", - "size": 46367 + "path": "en/api/cli/models/retrieve.md", + "sha256": "9fe2e7aad7d53c10ac5af92be59ce436d4970b6faf111e3f6f817d67b48f999c", + "size": 11058 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/archive", + "url": "https://platform.claude.com/docs/en/api/cli/completions/create", "status": "success", - "path": "en/api/ruby/beta/environments/archive.md", - "sha256": "d2ce8454b150c0a53c43445a1a3707b70e517307b38e335c68d1695f5b9ea3e2", - "size": 6739 + "path": "en/api/cli/completions/create.md", + "sha256": "06d06560c4a36c8f222b3fe5e4f07c9bb2bf83360bd52357d2700f55e166c1eb", + "size": 8211 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/list", "status": "success", - "path": "en/api/ruby/beta/deployment_runs/list.md", - "sha256": "7d2d06b1579f7df714d41622f08e4d44b1b8243c50806c6241d02f448fc738f2", - "size": 10654 + "path": "en/api/cli/beta/vaults/list.md", + "sha256": "0be2556a61a43a93ef065c075bf526d08b160059da0b1eb53b05618338b587d9", + "size": 2574 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployment_runs/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/archive", "status": "success", - "path": "en/api/ruby/beta/deployment_runs/retrieve.md", - "sha256": "07b8ef0739ba6b22d9e09e99ee93cf584a8aa73eca6600474f1a0efbea2b0fd1", - "size": 9314 + "path": "en/api/cli/beta/vaults/archive.md", + "sha256": "6d96648e442d3d47a74dac68f6fd9d485c5adcedae9e939733cabac58e4ed5f5", + "size": 1883 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/update", "status": "success", - "path": "en/api/ruby/beta/vaults/create.md", - "sha256": "00f901db95a9b530ed9775e479dbf1cdca1209e697f94cc6721fd57cb709169f", - "size": 4098 + "path": "en/api/cli/beta/vaults/update.md", + "sha256": "b51a2e2e12115267e93c7ddf9b7e2db9bc72e95eef927336b16555eb98cf1bc2", + "size": 2147 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/retrieve", "status": "success", - "path": "en/api/ruby/beta/vaults/update.md", - "sha256": "b222d27767ce86629706f5028ac37b451bb624239b1c4bd2683603c91b0c034f", - "size": 4201 + "path": "en/api/cli/beta/vaults/retrieve.md", + "sha256": "14f0f8cefee33115f1793220a5d4e41c65ac405bcf79088c83a8f1e09046c5c9", + "size": 1881 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/delete", "status": "success", - "path": "en/api/ruby/beta/vaults/list.md", - "sha256": "81bf1577a4e6fec822601e948c337c552ca584c53ecd692f5478dbc2b6eed105", - "size": 4357 + "path": "en/api/cli/beta/vaults/delete.md", + "sha256": "208f0936d9b6533111a5b4b7c61556052e95f933a1b27a3eb0cbaf24a8918117", + "size": 1247 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/create", "status": "success", - "path": "en/api/ruby/beta/vaults/retrieve.md", - "sha256": "7b1d0446eaf05811a93600137e9336b16012a46398c3a4f96438a4eb0e8d4026", - "size": 3948 + "path": "en/api/cli/beta/vaults/create.md", + "sha256": "9d669784ab68caa3c042263d4c12e2428c29d851f3a9c14e53eb3b01d2bbb3ab", + "size": 2035 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials.md", - "sha256": "84ab161e585a8565841a96ff0aeb7c9af7af50adea73a561d17765d07be21e1e", - "size": 94250 + "path": "en/api/cli/beta/vaults/credentials.md", + "sha256": "adedc0cd0a43d0a31371010c38be3eebbeb10af49cec75bfea466d6720be3829", + "size": 73076 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/count_tokens", "status": "success", - "path": "en/api/ruby/beta/vaults/delete.md", - "sha256": "632e80fa91e7d721b4a6f2e9bd11929d267d592d32860b5780e379d9b9bdfefd", - "size": 3333 + "path": "en/api/cli/beta/messages/count_tokens.md", + "sha256": "ba80cd1345eac7bf437ce0192c68ced12eea4022f95b42c2cacbb3c44dd9951e", + "size": 10532 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches", "status": "success", - "path": "en/api/ruby/beta/vaults/archive.md", - "sha256": "f8d29db1e3fe0a16059b7e888bbbfbcda5f8b810686a3ecccf8af9d92dd77c56", - "size": 3950 + "path": "en/api/cli/beta/messages/batches.md", + "sha256": "5c7d64de17c3d0a83c8fbdf6f7d9add1470b1d5e62a8d96bcab58bc9bd1a48b7", + "size": 744593 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/create", "status": "success", - "path": "en/api/ruby/beta/user_profiles/create.md", - "sha256": "2ca0b0a74e52370b1dbda070b7bb88ef216ab6c9ec078b00efaacc1e227a5370", - "size": 12836 + "path": "en/api/cli/beta/messages/create.md", + "sha256": "de8340aeaa162bf7975ff0a591282ef7237a623922e082c7466bf7ec8602b8aa", + "size": 217629 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs/list", "status": "success", - "path": "en/api/ruby/beta/user_profiles/update.md", - "sha256": "5da1187daebe18b50607ccbb0288fa8bf6d7db7fd50ddf419e9e06f7c5fc8e78", - "size": 12685 + "path": "en/api/cli/beta/deployment_runs/list.md", + "sha256": "e35f7e144d34d3927cf7a88c00f39edc0675a1e72894f8b16d1072bca1f64dc2", + "size": 9084 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployment_runs/retrieve", "status": "success", - "path": "en/api/ruby/beta/user_profiles/list.md", - "sha256": "8422648c752db4cdaec8e698b3f1aef170057eb770588ef5825b8c7ec00e1d82", - "size": 9694 + "path": "en/api/cli/beta/deployment_runs/retrieve.md", + "sha256": "f1e3ad3e09096f9ae7cfd45ef65b520ba795c508d9f3948554fcaef45a5951f1", + "size": 7427 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/create_enrollment_url", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/list", "status": "success", - "path": "en/api/ruby/beta/user_profiles/create_enrollment_url.md", - "sha256": "780ffd7f0e57928eedcba54f935d6b33bb762a932644a66de34d94ec185b5319", - "size": 3793 + "path": "en/api/cli/beta/agents/list.md", + "sha256": "9227f5e87355d0d65cd82c1ef03e973b448c11665f9ed2fd80cb3f7807c1e988", + "size": 31932 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/user_profiles/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/archive", "status": "success", - "path": "en/api/ruby/beta/user_profiles/retrieve.md", - "sha256": "cd2b857962ef7248654dce3ffcae75c5c614994abda04e40ffe6bfcb7dadb421", - "size": 8654 + "path": "en/api/cli/beta/agents/archive.md", + "sha256": "10afc3f0cc9480018d92070e7148703e47396466233f50097e2352c395eaf716", + "size": 30074 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/update", "status": "success", - "path": "en/api/ruby/beta/agents/create.md", - "sha256": "731501dfc4f35c869547c9628ad7f4734be11e71f740deaaa6514b99c119dfb4", - "size": 65124 + "path": "en/api/cli/beta/agents/update.md", + "sha256": "166db44731787c55856ed762a1ebb558df524357cbe00a57a7e30f294f3d7b15", + "size": 32771 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/retrieve", "status": "success", - "path": "en/api/ruby/beta/agents/update.md", - "sha256": "edf54e1b66bf79584f2bf6f9a5c0c1031a8cff4bf648e30d496a41922d6fa69e", - "size": 65973 + "path": "en/api/cli/beta/agents/retrieve.md", + "sha256": "11ae529c871903cdf4bba847523d439dff51c7e41a52150eccdfae4cf7bce492", + "size": 30209 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/versions", "status": "success", - "path": "en/api/ruby/beta/agents/list.md", - "sha256": "eadf58253940f828326ff7af7f4ef4c74a332986d3b0793c82b9879876584f40", - "size": 30706 + "path": "en/api/cli/beta/agents/versions.md", + "sha256": "b14109c12599447bd351687540fdf47e339ea5b92cedaf4ea92882787961dc5d", + "size": 31720 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/create", "status": "success", - "path": "en/api/ruby/beta/agents/retrieve.md", - "sha256": "b89f2ddef43cd28eb6cca4557e9221021bccc90cb7253a4aad973af5a62c8a1d", - "size": 30035 + "path": "en/api/cli/beta/agents/create.md", + "sha256": "a4f01df4f5b91110c478599229baa06d569b21f0cebe2ee9fec9058e76512d26", + "size": 31851 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/versions", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/list", "status": "success", - "path": "en/api/ruby/beta/agents/versions.md", - "sha256": "c1f563fcea3e452f61e056f3ad4c6030fc16f2f6e8a07fc76a13d82e54b73c7d", - "size": 30515 + "path": "en/api/cli/beta/environments/list.md", + "sha256": "fb388e18ec683c878930062e016c8c471905e058dbe4e40d5f23e3e03520a949", + "size": 5696 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/archive", "status": "success", - "path": "en/api/ruby/beta/agents/archive.md", - "sha256": "9e6e85ab1c0eb7ff3df5f372dceba77c73ed43e65ca70c9f3d01a66cd12c9b84", - "size": 29910 + "path": "en/api/cli/beta/environments/archive.md", + "sha256": "dc854608f908ccf61fd1d78f831e26d36a2ecfcc48eaf3226db2593fdf05336a", + "size": 4749 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/models/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work", "status": "success", - "path": "en/api/ruby/beta/models/list.md", - "sha256": "a09168931a4d56f730de185dda9d3434f1e4a3fe156f9898672d4816749e88ad", - "size": 13483 + "path": "en/api/cli/beta/environments/work.md", + "sha256": "9553d9d8c442f8aa90dd1c9a56099595b9a42b81eb3210cab956f41f814ad350", + "size": 29982 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/models/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/update", "status": "success", - "path": "en/api/ruby/beta/models/retrieve.md", - "sha256": "75a5121d194b933573b39b5965a70eda3cfef50eb1d35ea592c70c83f5582c1e", - "size": 12220 + "path": "en/api/cli/beta/environments/update.md", + "sha256": "7d6286beaaaf40e2bc49fbd280926f5ceb551a3535dacac2e8b68de99b178dd8", + "size": 5440 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/retrieve", "status": "success", - "path": "en/api/ruby/beta/tunnels/create.md", - "sha256": "2f12e1ad3fbf51b8030777c02e8317621143eaca18fa13c3e088a0cb234d9636", - "size": 4362 + "path": "en/api/cli/beta/environments/retrieve.md", + "sha256": "d3f4c90279254e32b059aa1d9aaec3b90e7ffbbb9ef9f2db617bc69b4aa4345b", + "size": 4683 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/rotate_token", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/delete", "status": "success", - "path": "en/api/ruby/beta/tunnels/rotate_token.md", - "sha256": "f7d1c962675efd2aba3ee4e77d119815b0708f25ef854613c4e83eadf6d84e68", - "size": 4005 + "path": "en/api/cli/beta/environments/delete.md", + "sha256": "fcafe14bbcf3676688caf4ebaee527c7053d126a4ddd2a14ae9bccf86c948210", + "size": 1300 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/create", "status": "success", - "path": "en/api/ruby/beta/tunnels/list.md", - "sha256": "7f099f045991efa1dfd903485ac7928f4dc9178398bf9c2055b2c89649e6a31d", - "size": 4612 + "path": "en/api/cli/beta/environments/create.md", + "sha256": "4ccba80505e0f2a36856d33af468f6c18c808ce500868762519979dfad826dd2", + "size": 5343 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates", + "url": "https://platform.claude.com/docs/en/api/cli/beta/models/list", "status": "success", - "path": "en/api/ruby/beta/tunnels/certificates.md", - "sha256": "adcb908975ccc62c14635577b3a3c26379bac8fb8ef914be9b4fc339f52302fd", - "size": 19737 + "path": "en/api/cli/beta/models/list.md", + "sha256": "7d91a3252c7a8a1c29baaa97ad6daa1243eab8b462f838adca4cc5d83c213d31", + "size": 13619 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/models/retrieve", "status": "success", - "path": "en/api/ruby/beta/tunnels/retrieve.md", - "sha256": "48fa5f16dcdebbf5457c51c34f596c016ce9413ba8db5a6e7d0c7bbd9bab8c25", - "size": 4187 + "path": "en/api/cli/beta/models/retrieve.md", + "sha256": "bc9eea3423dcbf1b40f937dbf24b217ab1f607450627ca05a6cbfa04722789a3", + "size": 11690 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/reveal_token", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/list", "status": "success", - "path": "en/api/ruby/beta/tunnels/reveal_token.md", - "sha256": "091f65da22277d9abd8dba97d873a3e49273827fdd06f119a05da996ec93dd8f", - "size": 3919 + "path": "en/api/cli/beta/user_profiles/list.md", + "sha256": "8ef86b1767283b189d4cff9aadd9a0922e22cecf5037b804f4eabe1dce9d69e8", + "size": 7306 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/update", "status": "success", - "path": "en/api/ruby/beta/tunnels/archive.md", - "sha256": "53d828eb554a29865a0996a53d177f74df51a91831783238ba05dcc6fbbc5e3d", - "size": 4470 + "path": "en/api/cli/beta/user_profiles/update.md", + "sha256": "7e719f19885911a838b65e7152200bd2cda1db3462d65835e9eaf371f2359c8c", + "size": 8381 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/retrieve", "status": "success", - "path": "en/api/ruby/beta/sessions/create.md", - "sha256": "d3b9ce0759998b169242a933ef9ecad3a38f0f573bf1b0c96d46144142712c9b", - "size": 84408 + "path": "en/api/cli/beta/user_profiles/retrieve.md", + "sha256": "f7dc08106a62e813a9158985b68752f4612cb5e06025186c6fd80cc6a21f2e44", + "size": 6642 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/create_enrollment_url", "status": "success", - "path": "en/api/ruby/beta/sessions/resources.md", - "sha256": "df0b50c105a735c12c036daa007622b9db542cbbb8c5a4666382913c3bb9fa8d", - "size": 35628 + "path": "en/api/cli/beta/user_profiles/create_enrollment_url.md", + "sha256": "6fc093254afcb5945e4d2015f3aacb3e774f3a3eedbb62b53a7ac906a9df4072", + "size": 1712 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/user_profiles/create", "status": "success", - "path": "en/api/ruby/beta/sessions/update.md", - "sha256": "6d7eaa7b0ec9abb15d5487ffa56d440b28e9c35aaddcb70c89a601a72be5a929", - "size": 69664 + "path": "en/api/cli/beta/user_profiles/create.md", + "sha256": "cc8575fe4ac8d4d3ffb56e2db7549207fd2055fa8d11563a5c6eaa4caa2f9d84", + "size": 8528 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/list", "status": "success", - "path": "en/api/ruby/beta/sessions/list.md", - "sha256": "eb0c6bcd183739845c309e692a6f31781d9df9c698721b7c45f4ae0bc937dc57", - "size": 48362 + "path": "en/api/cli/beta/skills/list.md", + "sha256": "e03cc2600c9597105c27ee60cd08788047ceb336d58b4ebb308cf4250567a8cc", + "size": 3775 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/retrieve", "status": "success", - "path": "en/api/ruby/beta/sessions/threads.md", - "sha256": "3f284eb14a02a14366098d26dde8d9e3af3fb193cee16c4af6dd434acee53de4", - "size": 447667 + "path": "en/api/cli/beta/skills/retrieve.md", + "sha256": "c71bcc1cda4bf2b6db05c6a7d618457eba83eb660b7df1a2ba58bb9457248276", + "size": 2884 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/delete", "status": "success", - "path": "en/api/ruby/beta/sessions/retrieve.md", - "sha256": "d0ea683b46927d85c268c1f4c3a9b7390846da5cd81d1fd380f94c1bef3fb145", - "size": 45676 + "path": "en/api/cli/beta/skills/delete.md", + "sha256": "38343440f497c7a9016d79c91da531a65d87a47379095da8b43997c6adf6843a", + "size": 1312 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions", "status": "success", - "path": "en/api/ruby/beta/sessions/events.md", - "sha256": "97e848ae74e3ca623437b5a5d1dcf230dc9d05ad387a14565651d4496d07885c", - "size": 576962 + "path": "en/api/cli/beta/skills/versions.md", + "sha256": "816beec131ea84fe66bb2198c0044416b10a7a950e815ea9a38c6cc28fae86c5", + "size": 11695 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/create", "status": "success", - "path": "en/api/ruby/beta/sessions/delete.md", - "sha256": "6249c169aeffd0c47b21ed129794d1efcb1dba807066d6cc2e63162af9f00c9a", - "size": 3290 + "path": "en/api/cli/beta/skills/create.md", + "sha256": "1df4080a26aeeda47e17c34089d45de2044f07ce64d7326c0ff4041276de5082", + "size": 3140 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/list", "status": "success", - "path": "en/api/ruby/beta/sessions/archive.md", - "sha256": "11678bd5bb09cf8f59110b18bd04bf85427f7bef7c41380750a4f93c66a95935", - "size": 45694 + "path": "en/api/cli/beta/tunnels/list.md", + "sha256": "fe913f5afefa321503b0845f269369aab8c36934d8c22d3668c9456d5de706b8", + "size": 2859 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/unpause", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/archive", "status": "success", - "path": "en/api/ruby/beta/deployments/unpause.md", - "sha256": "2a764e75bfcd0569cb991a2fe7fbf166eece465e93fa3116f18efa7b58684c3b", - "size": 19201 + "path": "en/api/cli/beta/tunnels/archive.md", + "sha256": "be860956fbb3e0ef6a94bd26ce35314029fa420ba934caf98e1ccbf8391ca2ec", + "size": 2448 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates", "status": "success", - "path": "en/api/ruby/beta/deployments/create.md", - "sha256": "f472cacba35e0fe2fc271fd5675ff52900af82f6e75d6f4206cb87f7a35fb672", - "size": 30245 + "path": "en/api/cli/beta/tunnels/certificates.md", + "sha256": "b4db2d59e24427c3b16bdc9dabafd9f99a5a2f64074e8a6f82ca83b755c4bb00", + "size": 11839 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/retrieve", "status": "success", - "path": "en/api/ruby/beta/deployments/update.md", - "sha256": "84b2e1654a48edabf7750bdae8135c170fc6feceee68ec46117dbc0a6d5e2726", - "size": 30300 + "path": "en/api/cli/beta/tunnels/retrieve.md", + "sha256": "d194fbc7748729d25da77e1c4288fdad7204cddc511a2ca3d64421aa2f6d788a", + "size": 2165 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/rotate_token", "status": "success", - "path": "en/api/ruby/beta/deployments/list.md", - "sha256": "c32a8151ed24b5ebc874643ba65efd4e0a77692223492614ffe6e77d08fc9159", - "size": 20407 + "path": "en/api/cli/beta/tunnels/rotate_token.md", + "sha256": "ea6d83a6a8b2da96bd5dcf28188b03031cc324e2aeb3fc3fa3544e8d65c7b25e", + "size": 1974 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/reveal_token", "status": "success", - "path": "en/api/ruby/beta/deployments/retrieve.md", - "sha256": "3402268e7ca9e2091f9d4cc834e6a14f0efb0b346d8f0818206aaf2dd4c7ff52", - "size": 19172 + "path": "en/api/cli/beta/tunnels/reveal_token.md", + "sha256": "c903dd32902376e823a63e43b47ad1a17d909d0559321f8cdbf97f62aac05ae2", + "size": 1877 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/run", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/create", "status": "success", - "path": "en/api/ruby/beta/deployments/run.md", - "sha256": "5a174aa9983abeb21d91f9bc1650d44aa836abd63ebb7fa2b7cfd7428c714902", - "size": 9291 + "path": "en/api/cli/beta/tunnels/create.md", + "sha256": "01f6dfe64346985be69fd4256a41b7f96d73a725a6f3fafd1bfea94419ebd054", + "size": 2347 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/pause", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files/list", "status": "success", - "path": "en/api/ruby/beta/deployments/pause.md", - "sha256": "e71ac36950ac1fc60cf21c62915049f0e9e6b6a5e3aa9602af614ee5db9cbbae", - "size": 19185 + "path": "en/api/cli/beta/files/list.md", + "sha256": "b132bace0aec284fb5c90947a0e666f6b3fdba320cc7b1da949569af48758db8", + "size": 3588 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/deployments/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files/retrieve_metadata", "status": "success", - "path": "en/api/ruby/beta/deployments/archive.md", - "sha256": "f0cd835f6fb26cd2cc963fbee9f51b049a9791d843946528108eef5bec5f7ee5", - "size": 19201 + "path": "en/api/cli/beta/files/retrieve_metadata.md", + "sha256": "5f6eb08253f83f080128d0db41eb54e6f4cb0ff1fb6794dd1db28895d6e10ac7", + "size": 2520 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files/upload", "status": "success", - "path": "en/api/ruby/beta/skills/create.md", - "sha256": "4bbc60a9e52289d34e2975a2a37bee41fdbb20eb1e71270fa1f0be0e43b9a471", - "size": 5160 + "path": "en/api/cli/beta/files/upload.md", + "sha256": "950c65abebd6cb45b1d0d0303d99f0f8a3b85060b004db8c514fe8ca1b53a699", + "size": 2882 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files/delete", "status": "success", - "path": "en/api/ruby/beta/skills/list.md", - "sha256": "c3ab43d0dffad3da3dc2f3a31985ea903b6094ff8b1168bf8b4da98a66ef85e3", - "size": 5417 + "path": "en/api/cli/beta/files/delete.md", + "sha256": "fb3e11e605807ceef4c2176f4ac603b2723794821566314151d37ed455f83096", + "size": 1174 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/files/download", "status": "success", - "path": "en/api/ruby/beta/skills/retrieve.md", - "sha256": "c88997903905eeb7c3c42539361adc0d057e755b44e0a1c0aba5569e7c94b0f9", - "size": 4901 + "path": "en/api/cli/beta/files/download.md", + "sha256": "2d5351fb363576db620395a6102d124f4b123e3739ccacda231ad7ef1013b8a9", + "size": 923 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/unpause", "status": "success", - "path": "en/api/ruby/beta/skills/versions.md", - "sha256": "59112068a50af88f30ec9f5e2f858f2a8412f26041635805ebdc77d7e1bf10c3", - "size": 21517 + "path": "en/api/cli/beta/deployments/unpause.md", + "sha256": "5406d1bb89ff06946d5e35638188eb624e95281a9d681f7e665b3cc89cf2ded4", + "size": 17708 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/list", "status": "success", - "path": "en/api/ruby/beta/skills/delete.md", - "sha256": "3fda8745b9aaf677d39920297058cb330e9f2db5948d7f3977c224fd0304ec12", - "size": 3357 + "path": "en/api/cli/beta/deployments/list.md", + "sha256": "9c643a7f3ae2c0c978e94575f5d924e079a85af888e26ba01ecca5cfd331d959", + "size": 19288 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/archive", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memory_versions.md", - "sha256": "e7fbb903fa94e06264720bc7757e1bd76d794a9d24f1bda1c89fafe20fb56144", - "size": 40255 + "path": "en/api/cli/beta/deployments/archive.md", + "sha256": "52c57ab49a246895892bfaf26a60c211d7152ffb5580d51e8e7995e0fe4419db", + "size": 17708 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/update", "status": "success", - "path": "en/api/ruby/beta/memory_stores/create.md", - "sha256": "15cd48a7e6f583ad01e63a2b000999b42aaeeee346e4311ea522ecca78eb39a4", - "size": 6293 + "path": "en/api/cli/beta/deployments/update.md", + "sha256": "c49efb319189fce69f7a9e4536d82a2a49218bb0114d91d09a1361035ebd5b22", + "size": 19655 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/retrieve", "status": "success", - "path": "en/api/ruby/beta/memory_stores/update.md", - "sha256": "943be6a5908ae7f760c4b3d38760e3d1d8cfdc088264e3220fcf66616808939a", - "size": 6114 + "path": "en/api/cli/beta/deployments/retrieve.md", + "sha256": "147d6306aa5319eac52ba9268ad44be63902a5840ed531c0e49d1ade46be4b75", + "size": 17679 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/run", "status": "success", - "path": "en/api/ruby/beta/memory_stores/list.md", - "sha256": "3aa251dddaff84ef8bd548f83bc125abb33f9c43ebb598c2290ebea3b6bfa923", - "size": 5978 + "path": "en/api/cli/beta/deployments/run.md", + "sha256": "d13e2244b05d452e2e1fde249d0edbcd1e6bb1cea1ea0852e4583c87bc178004", + "size": 7404 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/pause", "status": "success", - "path": "en/api/ruby/beta/memory_stores/retrieve.md", - "sha256": "f026989d345a0fd5a63b1b32fd38d38e6983f9b8f4824e8f018d97d6de512917", - "size": 5344 + "path": "en/api/cli/beta/deployments/pause.md", + "sha256": "fd9a3e6f6ce6ac5e3bff1565068550b23127d2ecc10f16e3ca973f759d3cd47e", + "size": 17692 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/deployments/create", "status": "success", - "path": "en/api/ruby/beta/memory_stores/delete.md", - "sha256": "807fc6ae812f768ef5b6ae99834b8884eb69dd51ba3cf1ef1944e54fc554e367", - "size": 3637 + "path": "en/api/cli/beta/deployments/create.md", + "sha256": "e156e016d6e4d0d97125c74352df45a2035ae8f055c98afefb4762c13ccc6135", + "size": 19561 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories.md", - "sha256": "de310d013039260db50d58ec25bd9ff47aca1040a9cdcfa703219a13dcb1e6b2", - "size": 48615 + "path": "en/api/cli/beta/sessions/events.md", + "sha256": "cb3fa2222c401dd1efc4cee63b483f9d17892e8aab9b85d65287fd9b73773e81", + "size": 604489 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/list", "status": "success", - "path": "en/api/ruby/beta/memory_stores/archive.md", - "sha256": "eb96e3347b50639e4998cd2042688df0360ab440ec7ebe7b6345bc4b169fdf3a", - "size": 5441 + "path": "en/api/cli/beta/sessions/list.md", + "sha256": "4b6f59e997cfd210c2e44bd29c1f10bdcbd6753b01e5355506d0da919b1c0186", + "size": 52052 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/download", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/archive", "status": "success", - "path": "en/api/ruby/beta/files/download.md", - "sha256": "badbb85a68f6f92c9d3668d90c0ae620dd5f5586702340349e2f3c538f6bfab7", - "size": 2926 + "path": "en/api/cli/beta/sessions/archive.md", + "sha256": "fc1a60bb1b45e5364ab2b4933eacf288a391b09c5b1c1c2ea1b2657cf3e497d1", + "size": 48022 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/update", "status": "success", - "path": "en/api/ruby/beta/files/list.md", - "sha256": "58f950d36d30011e36bf9bbd4611b5994acaeb427f4384d684a289f8cc48169a", - "size": 5263 + "path": "en/api/cli/beta/sessions/update.md", + "sha256": "2d27d017a2ca1f882d7ad702698d5f214bbd9961c44519e63f9f829e2b541633", + "size": 49270 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/upload", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/retrieve", "status": "success", - "path": "en/api/ruby/beta/files/upload.md", - "sha256": "e2217cad36d4e7b6d03b3136827b3b4c7c4518ed5741a24ded01f02a5cd1b1f1", - "size": 4902 + "path": "en/api/cli/beta/sessions/retrieve.md", + "sha256": "b9606e28743233437bc6e3a44d38dd2d856c021b0fe34b7327f9b923f652c64f", + "size": 48004 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/retrieve_metadata", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources", "status": "success", - "path": "en/api/ruby/beta/files/retrieve_metadata.md", - "sha256": "595c0baba6c0f1fd3f586f8827972addbc89fd3a1b52bfda191c277aa2667142", - "size": 4538 + "path": "en/api/cli/beta/sessions/resources.md", + "sha256": "36d0935a07126ce2babf00c41914debb8b775b78ed9df4fa542b81843b0e9c7a", + "size": 21136 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/files/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/delete", "status": "success", - "path": "en/api/ruby/beta/files/delete.md", - "sha256": "e7f93b2e477cb7b712a2acd0308100ae9ba721c62c09f39efbf54d13e857d722", - "size": 3207 + "path": "en/api/cli/beta/sessions/delete.md", + "sha256": "2f3dccf59fa198b5db837444bebd0f3ffb2edbe7b26a7b7eb531c8fb7600346f", + "size": 1198 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads", "status": "success", - "path": "en/api/ruby/beta/messages/create.md", - "sha256": "878349c3599135fbe6d887eb8d0e5672c18bfaac86c0db8674708cce2ae73239", - "size": 296457 + "path": "en/api/cli/beta/sessions/threads.md", + "sha256": "8bd4e8ce912f962282b6ae30a8a715d75b6692d5100a16142bdbc44906bf2403", + "size": 482366 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/count_tokens", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/create", "status": "success", - "path": "en/api/ruby/beta/messages/count_tokens.md", - "sha256": "52f89bf71abe5297b7877e5d93cc244ec7119796bb1a99ad667f81c7a1661c10", - "size": 140287 + "path": "en/api/cli/beta/sessions/create.md", + "sha256": "c1cefe83ec9868f8e2076fa5665e8a8c6fd4553685506217c5e523ae7ddae88c", + "size": 49573 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/list", "status": "success", - "path": "en/api/ruby/beta/messages/batches.md", - "sha256": "22465e133ee28377dac437120ea2a1a7d7847458a424c70c3df6c821421eee0e", - "size": 763514 + "path": "en/api/cli/beta/memory_stores/list.md", + "sha256": "e656259f70b49f5f3f81974478e22246f9b74e461e6f592246851af24be59e5c", + "size": 4237 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions", "status": "success", - "path": "en/api/ruby/beta/messages/batches/create.md", - "sha256": "3f7fd32cd01564811db1d16b1c2b302f5528b6cb7183329823ec671c8e628599", - "size": 165114 + "path": "en/api/cli/beta/memory_stores/memory_versions.md", + "sha256": "7c65321d6ed061ae04b31abd4ac3119e02f88689e58bc28fb51ed09597824dc5", + "size": 36811 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/archive", "status": "success", - "path": "en/api/ruby/beta/messages/batches/list.md", - "sha256": "535c73d635f30d0185617b947abb6137e72add1651f315c708f5fd4dc688fe0a", - "size": 7217 + "path": "en/api/cli/beta/memory_stores/archive.md", + "sha256": "916665c4bda0102c58a3031166ce5d43f9d46dc1623c33b15dd2db04e78daa19", + "size": 3354 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/cancel", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/update", "status": "success", - "path": "en/api/ruby/beta/messages/batches/cancel.md", - "sha256": "889b6fd3dd1561efa5169d6100b324e0b0702564e5591d40733a9e2c300b9006", - "size": 7131 + "path": "en/api/cli/beta/memory_stores/update.md", + "sha256": "467eaa86b6598fd4022d424810e1617304d2030ef79f32764c60816e49d1fca0", + "size": 4051 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/retrieve", "status": "success", - "path": "en/api/ruby/beta/messages/batches/retrieve.md", - "sha256": "3dd77daebe17dc832338851c07ff48ef72580b63a87a058e7b2600f1685202e4", - "size": 6823 + "path": "en/api/cli/beta/memory_stores/retrieve.md", + "sha256": "2175cc3cb198b6f0b22ef2c617c999cdb7af9f78c2059be804113ee17c867d9e", + "size": 3257 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/results", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/delete", "status": "success", - "path": "en/api/ruby/beta/messages/batches/results.md", - "sha256": "b8eb17940450229273126adc26bf9a838f09891089585227e9b36fbbe7c8cd01", - "size": 148325 + "path": "en/api/cli/beta/memory_stores/delete.md", + "sha256": "a5a814ffaf88115b5e45b71d0b5ac25517364e367fb75bb45f5fa4afdae31581", + "size": 1532 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/messages/batches/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/create", "status": "success", - "path": "en/api/ruby/beta/messages/batches/delete.md", - "sha256": "e106b4b8b37bdfc942f3b44c24b86d6392a874c9a0c30f65697393664a7e0253", - "size": 3694 + "path": "en/api/cli/beta/memory_stores/create.md", + "sha256": "a0611244a787f7323e303fa91b9dcf1e983085868c09639f22acb47bced313ae", + "size": 4218 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories/create.md", - "sha256": "023367c27e803b46220653416925f6eb87f1a29c843828395787055f531df27e", - "size": 7100 + "path": "en/api/cli/beta/memory_stores/memories.md", + "sha256": "98e894eefcf7a30b00ec774424d1ca0cfdbbde49e82d3ae71d18ae43073a01ef", + "size": 37453 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/redact", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories/update.md", - "sha256": "9e96b9fcd061dd89bebc7dae0292d474afec7d118a8bfca73b8bd503fa0b9571", - "size": 7822 + "path": "en/api/cli/beta/memory_stores/memory_versions/redact.md", + "sha256": "853de71dfac51c3082357b15d18a7ba8f56c0f3abb0ec1da4dc3fcf1fecc619c", + "size": 8200 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/list", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories/list.md", - "sha256": "e70ecabcb012924b9f4f4edb464103df1c9935cc9567843dd79954aa91125b25", - "size": 8620 + "path": "en/api/cli/beta/memory_stores/memory_versions/list.md", + "sha256": "3f6c164ff9c787579a8ab88a347b98f4cde1dc1e262b53acda660c1f657a33ba", + "size": 9924 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memory_versions/retrieve", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories/retrieve.md", - "sha256": "f3f8c3590a6e647f27d62310c139b1bbda1aa4f5a89487cda1f1bf1bdbe7f1fa", - "size": 6618 + "path": "en/api/cli/beta/memory_stores/memory_versions/retrieve.md", + "sha256": "1f35beb6a40279aa1c23052d778c5a364d87c5ade79f18e248f02b2e4c23ab27", + "size": 8509 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memories/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/list", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memories/delete.md", - "sha256": "17b9a73b0a37980893e258b69e4f4842fee14414bbc285a63955ff603a054b4d", - "size": 4480 + "path": "en/api/cli/beta/memory_stores/memories/list.md", + "sha256": "a3b2981a06202c3494d0d023eca2af14e8d7aefcf4fa3951ce6149deb6931b17", + "size": 6664 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/update", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memory_versions/list.md", - "sha256": "e3461d311a1ce03bff9200088964d013c0a7ef46456ea71deb6f73c3ebb881f8", - "size": 11813 + "path": "en/api/cli/beta/memory_stores/memories/update.md", + "sha256": "5e8760f3765dfcf5e3e62104bf9b5363616219f00dff33c0196e22cd7304f155", + "size": 5124 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/retrieve", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memory_versions/retrieve.md", - "sha256": "3cd59cbea14747a5d4e5e965fa7b54dcc271f1eedff6c926d5b9264c4afc78c6", - "size": 9949 + "path": "en/api/cli/beta/memory_stores/memories/retrieve.md", + "sha256": "ed6ca8be8d73569adf3b12911d237ebb14f27385733af8b33db8b6498e796b4e", + "size": 4264 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/memory_stores/memory_versions/redact", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/delete", "status": "success", - "path": "en/api/ruby/beta/memory_stores/memory_versions/redact.md", - "sha256": "aec28f8120ce9f6c4ec3525edfdfb74835eb01995557c536ab8a457c89c2a375", - "size": 9339 + "path": "en/api/cli/beta/memory_stores/memories/delete.md", + "sha256": "8ef0f833b031853a39d30cc76d1690daba5eeed662938eba594a3e87ce247329", + "size": 2403 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/memory_stores/memories/create", "status": "success", - "path": "en/api/ruby/beta/skills/versions/create.md", - "sha256": "c4c60b7b7276ec65304883f2c3d601d4e0f67bf5bd7aa0d42e6d379af5b3587a", - "size": 4449 + "path": "en/api/cli/beta/memory_stores/memories/create.md", + "sha256": "7a109117ef62c5de8981fe1f75ac95dbd1f41a1e94f0763e1f18da55c9bdcb60", + "size": 4750 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/download", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/list", "status": "success", - "path": "en/api/ruby/beta/skills/versions/download.md", - "sha256": "6821db1bac4a1f3b88553d0d0036ac4049b8f9852ebc81e58aad2f24a8da5fd1", - "size": 3373 + "path": "en/api/cli/beta/sessions/resources/list.md", + "sha256": "db76dd22fed048008c84f0cb9d85ed563a39775fed72531657c39b14da559ed1", + "size": 4805 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/update", "status": "success", - "path": "en/api/ruby/beta/skills/versions/list.md", - "sha256": "6c0d043c88828f6cfdc0e1095261f10f738973e0aa961598e872f4fd771bc929", - "size": 4550 + "path": "en/api/cli/beta/sessions/resources/update.md", + "sha256": "29686d6daeba5e81c3f0105a2522b38fc003bc0ebcb5a2f7e5ca82b5275cbe26", + "size": 4263 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/retrieve", "status": "success", - "path": "en/api/ruby/beta/skills/versions/retrieve.md", - "sha256": "019148c3f1ab7f525fa3b0e3facfdab570db490d81f4f50ed634da8939981efa", - "size": 4545 + "path": "en/api/cli/beta/sessions/resources/retrieve.md", + "sha256": "d985e7b204668d1deb37ed2528516a530455bebd942cf75d7f15ecfbead76daa", + "size": 4033 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/skills/versions/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/delete", "status": "success", - "path": "en/api/ruby/beta/skills/versions/delete.md", - "sha256": "b0ebc38affd383b77b0a9a54ab533c496b3e335a72782f19394bdebcf22c0601", - "size": 3730 + "path": "en/api/cli/beta/sessions/resources/delete.md", + "sha256": "3bde61a29b0739cfb1983faa82dc866569cb25d2432911a6782a03c3533adda7", + "size": 1376 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/resources/add", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/list.md", - "sha256": "713b8c1b8cb0ac2a9c983cf8f389b77c0164fa7283bfb4de16654ded0855acb7", - "size": 33969 + "path": "en/api/cli/beta/sessions/resources/add.md", + "sha256": "56b3df2890d874b9a72c336c62c05b409cd0a318e307550a8a17098a7e035a71", + "size": 1863 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/retrieve.md", - "sha256": "3a09d547efb0f157f84d86af9bf01e6b325a64b3a8a9924040b694b66b18e60b", - "size": 33177 + "path": "en/api/cli/beta/sessions/threads/events.md", + "sha256": "fb0fb4885ec9042df002c6e8dbee73f04e10af9592917efb729991216ba28cdb", + "size": 215988 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/list", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/events.md", - "sha256": "e0df956027ae424c450aae97a184295a2e972b3d74677d6d3854ce3d88bc01e7", - "size": 198859 + "path": "en/api/cli/beta/sessions/threads/list.md", + "sha256": "0b36f7d3b02fae854555bec19a1902a9a71e61d504e9f5351ab4f62aae824124", + "size": 35944 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/archive", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/archive.md", - "sha256": "e87411266201a34ec0fe56fbde3ccbb7ca1ba01f82cd3e93d3f03de258c8a173", - "size": 33195 + "path": "en/api/cli/beta/sessions/threads/archive.md", + "sha256": "0b6fdf583c501b63b2dde3042233b91200ed76e8a689ef9375e470b97cbe2519", + "size": 34109 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/retrieve", "status": "success", - "path": "en/api/ruby/beta/sessions/resources/update.md", - "sha256": "941ee2657efa1adbf26073fa6c5ae1701b5a5f23e65bc9905e32aef37499852b", - "size": 6187 + "path": "en/api/cli/beta/sessions/threads/retrieve.md", + "sha256": "52a909e2bca74ee68b7ce3d59ad3ff88457baf852f4aade5d9b25602c37ed5b0", + "size": 34091 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/list", "status": "success", - "path": "en/api/ruby/beta/sessions/resources/list.md", - "sha256": "bf93b44708d0a1392fef98dfee4b47b1e45aa26b4510379e9e7ddf68dcf73bcf", - "size": 6469 + "path": "en/api/cli/beta/sessions/events/list.md", + "sha256": "29d00eaf02933693757ff9512201a93358a64856e6b61f84e390f3badd844e7c", + "size": 109063 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/stream", "status": "success", - "path": "en/api/ruby/beta/sessions/resources/retrieve.md", - "sha256": "12da017135bad34366bfcf1648073be80ccda46ec220e9fcc05436c618a32d46", - "size": 5966 + "path": "en/api/cli/beta/sessions/events/stream.md", + "sha256": "9fee1c9170cd76261b7b15250d7f981f6f6539f565db262b30d0e1ccb08760f0", + "size": 107885 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/add", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/events/send", "status": "success", - "path": "en/api/ruby/beta/sessions/resources/add.md", - "sha256": "aceaedd692e7423d1af4ddcb06b5827161e384945879dd566ab67994de5ec9f7", - "size": 3932 + "path": "en/api/cli/beta/sessions/events/send.md", + "sha256": "08cf5a9452895c58efa9bb3c2b000e10cd9a2dbf962c8b279e500a7156077c0a", + "size": 13958 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/resources/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events/list", "status": "success", - "path": "en/api/ruby/beta/sessions/resources/delete.md", - "sha256": "0f1533b9653b82821670ce236ed50a3f92df14bbef318a3bd4fc93d2625dbdb3", - "size": 3492 + "path": "en/api/cli/beta/sessions/threads/events/list.md", + "sha256": "242d056d1909ddf7679762d3616d3ed8ce7c84d266cae3c40835dbaba2481c64", + "size": 108054 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/send", + "url": "https://platform.claude.com/docs/en/api/cli/beta/sessions/threads/events/stream", "status": "success", - "path": "en/api/ruby/beta/sessions/events/send.md", - "sha256": "2f4c520dceb0d6dff1f1649832e82a2e1282ee2ab39b2da4af631d40a4179a79", - "size": 25629 + "path": "en/api/cli/beta/sessions/threads/events/stream.md", + "sha256": "0562c3ff3113ed747d027e6fa9456073d36e1e3233d36baf0ceb4b7e1fe18536", + "size": 108068 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/list", "status": "success", - "path": "en/api/ruby/beta/sessions/events/list.md", - "sha256": "3bb8f00dd6cf5e6e2f7a0edd8cb4a658656a02f4be83fc823d576bf8f851cf61", - "size": 100241 + "path": "en/api/cli/beta/tunnels/certificates/list.md", + "sha256": "e3d394dd2f3c85afbca59b5be8aefc29137626f17e20bbd7e3598c8004ba5ab3", + "size": 3203 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/events/stream", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/archive", "status": "success", - "path": "en/api/ruby/beta/sessions/events/stream.md", - "sha256": "c319462f01ac0f4c53a283e22c31870ee9a425a4fedcc2ecb54e96beed8255e3", - "size": 100890 + "path": "en/api/cli/beta/tunnels/certificates/archive.md", + "sha256": "743fbf139513366a9c41de11e197c5cbd3f53ad33859df85731e6d6db6d8e5fd", + "size": 2778 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/retrieve", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/events/list.md", - "sha256": "28c6dfa4060adc57cb972e2d84777e8f502c7fdd1f8764314371e5a3dbd981f9", - "size": 97914 + "path": "en/api/cli/beta/tunnels/certificates/retrieve.md", + "sha256": "0bd406317b91376c452c518b1df2ade60fc0c57e623e3a7aed1d4c15644a849b", + "size": 2541 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/sessions/threads/events/stream", + "url": "https://platform.claude.com/docs/en/api/cli/beta/tunnels/certificates/create", "status": "success", - "path": "en/api/ruby/beta/sessions/threads/events/stream.md", - "sha256": "9fab6001f9e73671c7626633f963cb05fb43033a3e428686686fd8605f7ab593", - "size": 101080 + "path": "en/api/cli/beta/tunnels/certificates/create.md", + "sha256": "a2f2fd8f4d8196b71cfd12715232b611e5fd4d7e2c66c28586b2c6f9cbaa5373", + "size": 2791 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/list", "status": "success", - "path": "en/api/ruby/beta/tunnels/certificates/create.md", - "sha256": "059523435498b3c3808eada8ced46a6bb8d62cc30e628194399de441fe6ec46c", - "size": 4841 + "path": "en/api/cli/beta/skills/versions/list.md", + "sha256": "18c3f54776b541cd4611ce1adcd4f788a6332a988b72582195bba4e84bfcba61", + "size": 2865 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/retrieve", "status": "success", - "path": "en/api/ruby/beta/tunnels/certificates/list.md", - "sha256": "73ab9e76d954dd65e1e9fe25458db1b9b8216ba730ba0ac5836bc03ce5c15ce8", - "size": 4965 + "path": "en/api/cli/beta/skills/versions/retrieve.md", + "sha256": "03f707ccaf033507dc314928cf0d79580b8cd9e081ad02f82edc7bd2723e3b76", + "size": 2506 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/delete", "status": "success", - "path": "en/api/ruby/beta/tunnels/certificates/retrieve.md", - "sha256": "6210bdd9b6414a9bcce618d18d977ce3bbe3d982ba774d8515d40115e95ac4b2", - "size": 4591 + "path": "en/api/cli/beta/skills/versions/delete.md", + "sha256": "01c99eb3d1d6af29a06749927f3e9089c899d9d700c3366f8247472bafa3bc15", + "size": 1667 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/tunnels/certificates/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/download", "status": "success", - "path": "en/api/ruby/beta/tunnels/certificates/archive.md", - "sha256": "07fcb2a8ccd2f60a3b63b3883d73dd6b85b775d727c44cd921927eb2f00a5610", - "size": 4828 + "path": "en/api/cli/beta/skills/versions/download.md", + "sha256": "31e27f79e9d2afb50d4e7d62066aca25609ad63ee5db2e6d2aa74a85c748ac91", + "size": 1374 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/agents/versions/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/skills/versions/create", "status": "success", - "path": "en/api/ruby/beta/agents/versions/list.md", - "sha256": "6f7e4d76c8ca87b46070195e59c422ba221272278c8aeea78afd1b0ae9fb9e97", - "size": 30514 + "path": "en/api/cli/beta/skills/versions/create.md", + "sha256": "a817820864a052a85a52dcf90d321e74fef95d807516a175dbdc5b162a243e04", + "size": 2396 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/create", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/list", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/create.md", - "sha256": "3f73f7927bb106b76d4772a751a047164ae8c6f9aaac67d5e33d312588af1832", - "size": 13151 + "path": "en/api/cli/beta/environments/work/list.md", + "sha256": "3886a008af273e24b289047b4a524b675cec77849f09e0821a79e04a587d4246", + "size": 3394 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/heartbeat", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/update.md", - "sha256": "bd3c0c957efbb1b92c5f0fdef22e5d31d39c96f293a71ac63a7433e685607160", - "size": 12699 + "path": "en/api/cli/beta/environments/work/heartbeat.md", + "sha256": "e09c6c9b61eeac10a1353ce5089e945740b51acdbaa03d79bbe5a320fec761c2", + "size": 2231 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/update", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/list.md", - "sha256": "03a3d3b5c0137b8aa4805e2382cabd7902d4b29423693f5af8eaa7e4c2e446a1", - "size": 8508 + "path": "en/api/cli/beta/environments/work/update.md", + "sha256": "ece6e7e6e0d577319ca5b113ed6202a94896de294df2afb1e059e82a283067c4", + "size": 3654 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/mcp_oauth_validate", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/retrieve", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/mcp_oauth_validate.md", - "sha256": "e4b026f29f825fd9aef4234cac6f2b4d82d8e690e50f551edfc532c8a6220c82", - "size": 6898 + "path": "en/api/cli/beta/environments/work/retrieve.md", + "sha256": "7373d973da1b73c94aab8c5a01e2a138ad2b6497531db9beeff756e057a9fa55", + "size": 3477 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/poll", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/retrieve.md", - "sha256": "ea40e519e35c5117b3d92ab28ea6af13329bc4ed89d172f6f1b704c6326d217e", - "size": 8091 + "path": "en/api/cli/beta/environments/work/poll.md", + "sha256": "5648b8288bb8f6a7b52b9bc688bd2ccab0e5ad1b36f48579b07397fc089465b5", + "size": 3608 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/delete", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/stop", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/delete.md", - "sha256": "da1a680bd0f06d6807a6ed113b7b82c55d560aee69a48dd3cfefb1ae12c3248c", - "size": 3623 + "path": "en/api/cli/beta/environments/work/stop.md", + "sha256": "51d3c0e4b8b00afe39e150d3a1f79f013a4ee2d16de070c284507d1caf76a3b3", + "size": 3554 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/vaults/credentials/archive", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/ack", "status": "success", - "path": "en/api/ruby/beta/vaults/credentials/archive.md", - "sha256": "47b4d8ab16f048b0f5bdf6fef9ef1ea66dba68b75d5a1b01947d585116d3d3c8", - "size": 8093 + "path": "en/api/cli/beta/environments/work/ack.md", + "sha256": "347d7f3248309a90c16eab13bb98dba36bbc6775a16138949e857d25642a34d7", + "size": 3159 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/update", + "url": "https://platform.claude.com/docs/en/api/cli/beta/environments/work/stats", "status": "success", - "path": "en/api/ruby/beta/environments/work/update.md", - "sha256": "0ef71280608d2ecbd9abab9dcd12ba6d94cd07e950d709425c25babc6cfcaadc", - "size": 5723 + "path": "en/api/cli/beta/environments/work/stats.md", + "sha256": "8a299d0e8e08334644ba66d4b12a32d742fe53f4689f7eef8b582858faec4553", + "size": 1887 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/list", + "url": "https://platform.claude.com/docs/en/api/cli/beta/agents/versions/list", "status": "success", - "path": "en/api/ruby/beta/environments/work/list.md", - "sha256": "c5cc8431557bc196d98ca142613c02b2cf7e0fd11c0473cc1b8737e40d67af7f", - "size": 5384 + "path": "en/api/cli/beta/agents/versions/list.md", + "sha256": "a815bd807579c95506c28b273e53daf00ef5f2e9b9548ebef7f0542f5a906bce", + "size": 31719 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/stop", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/cancel", "status": "success", - "path": "en/api/ruby/beta/environments/work/stop.md", - "sha256": "2f6562dc8df427d46910fdab4d906125ad244e1863ce9df143c76941d0ebac7e", - "size": 5598 + "path": "en/api/cli/beta/messages/batches/cancel.md", + "sha256": "12fb7f02e5a0f127e7f90b3abc28ea67012c5d7f9a16a43922bdadb6967d5451", + "size": 5075 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/retrieve", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/list", "status": "success", - "path": "en/api/ruby/beta/environments/work/retrieve.md", - "sha256": "96aba425f1c4b3889dbcb83b001a656408bff1c9d353b90f07ccf5f5e7034e8c", - "size": 5535 + "path": "en/api/cli/beta/messages/batches/list.md", + "sha256": "4229a6a7add01d69478ba1202c766ac611ad9a87a2ccfbfe35d59096dbd6b473", + "size": 5672 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/ack", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/retrieve", "status": "success", - "path": "en/api/ruby/beta/environments/work/ack.md", - "sha256": "197b5058446de4c7197e15b95f30b40ed5356e0e10897fed5a2ffee8e450e59b", - "size": 5228 + "path": "en/api/cli/beta/messages/batches/retrieve.md", + "sha256": "23f2641f9b081ffc1cf12eda4f7d90e3ba036cde8eebb31b06238aa4d3e72655", + "size": 4767 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/stats", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/results", "status": "success", - "path": "en/api/ruby/beta/environments/work/stats.md", - "sha256": "ab24dc5fa7a96b59fc113b090c3c11bf86af95fdfedcb2ad724f29e3681d9959", - "size": 3974 + "path": "en/api/cli/beta/messages/batches/results.md", + "sha256": "e34b13d0eb393a0bfa041b27e703dc288ef440265418b346aeb985a1e2eb82bd", + "size": 184650 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/heartbeat", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/delete", "status": "success", - "path": "en/api/ruby/beta/environments/work/heartbeat.md", - "sha256": "97976e8201a7ab898a04a84ee328ca0b7bd4ae5e8260d1ef60efdd4b6b7eb5e9", - "size": 4309 + "path": "en/api/cli/beta/messages/batches/delete.md", + "sha256": "62c08e9a0b1822a76eb28a40516183cf3296366cc4e5c9484fd8051896fc13d5", + "size": 1626 }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/environments/work/poll", + "url": "https://platform.claude.com/docs/en/api/cli/beta/messages/batches/create", "status": "success", - "path": "en/api/ruby/beta/environments/work/poll.md", - "sha256": "512d291d73052d6579090f7481324459f30b6fc6ce8646bf6b1fa1f9e85aea06", - "size": 5650 + "path": "en/api/cli/beta/messages/batches/create.md", + "sha256": "bce74f592896e0faea29eee7e4929f40d90d8aadf203b747d7cc1352ac286d20", + "size": 5325 }, { - "url": "https://code.claude.com/docs/en/plugin-marketplaces", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/list", "status": "success", - "path": "en/docs/claude-code/plugin-marketplaces.md", - "sha256": "d016e2a495335b74acb363c28cc83f516a5c8df3954e64937841edde7271bc8c", - "size": 13855 + "path": "en/api/cli/beta/vaults/credentials/list.md", + "sha256": "9bf2a9c947c667689ac9e4475c36a901d3ba537fa79cbf226748586e18300430", + "size": 6907 }, { - "url": "https://code.claude.com/docs/en/slash-commands", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/archive", "status": "success", - "path": "en/docs/claude-code/slash-commands.md", - "sha256": "df82f2aaebe552f82d1b4d89f3ad6f156520ad3e8f404644df32ed41a68a823b", - "size": 110552 + "path": "en/api/cli/beta/vaults/credentials/archive.md", + "sha256": "2895f8704922e6aa634efed1a5f6ca01894444fa561367be4621c5fe660f0289", + "size": 6074 }, { - "url": "https://code.claude.com/docs/en/plugins-reference", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/update", "status": "success", - "path": "en/docs/claude-code/plugins-reference.md", - "sha256": "2af4d8d137d49ce2f1c47fa1cc9d527217d8ba93e146b2b2b5baf221a076ae28", - "size": 41985 + "path": "en/api/cli/beta/vaults/credentials/update.md", + "sha256": "7fe209bfe607a8a7385290e1c21d48fbde7af105106c818438e5cd51e0d18153", + "size": 6628 }, { - "url": "https://code.claude.com/docs/en/plugin-hints", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/retrieve", "status": "success", - "path": "en/docs/claude-code/plugin-hints.md", - "sha256": "cae42089de7d22257f486031fcff3698a3b9e6bdcc642778014fcfc603d570eb", - "size": 6662 + "path": "en/api/cli/beta/vaults/credentials/retrieve.md", + "sha256": "45f3ba1bee4c0b2d6bb274e427a9437485372e9a0d3787a875f34525c48c6c08", + "size": 6072 }, { - "url": "https://code.claude.com/docs/en/plugin-relevance", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/mcp_oauth_validate", "status": "success", - "path": "en/docs/claude-code/plugin-relevance.md", - "sha256": "bed8ccb839090c1ea1d9ca8654e280905276bd44c57f80b68fa4e4b75c02b93a", - "size": 12863 + "path": "en/api/cli/beta/vaults/credentials/mcp_oauth_validate.md", + "sha256": "a389a392bcff0c25b74bb99f055fb3e63d6a4b7c60062cf6936634827efb45b6", + "size": 5034 }, { - "url": "https://code.claude.com/docs/en/ultraplan", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/delete", "status": "success", - "path": "en/docs/claude-code/ultraplan.md", - "sha256": "140170a1baf128531aa98be28c5b8592440969cd386a21ab5707def73354aabd", - "size": 1050 + "path": "en/api/cli/beta/vaults/credentials/delete.md", + "sha256": "3ad0fe8ade52e21bed65f7cf5416f852f3ea65a98fa8a638f5efe9f89893af4c", + "size": 1520 }, { - "url": "https://code.claude.com/docs/en/discover-plugins", + "url": "https://platform.claude.com/docs/en/api/cli/beta/vaults/credentials/create", "status": "success", - "path": "en/docs/claude-code/discover-plugins.md", - "sha256": "2af08db4214c45b94d140ebb6ae7407f85ee7cc92059095605cc5934a6f8bb51", - "size": 31337 + "path": "en/api/cli/beta/vaults/credentials/create.md", + "sha256": "a7c01211c070a77801aae2a238f9e029cd140af75d277cf16e2175d31f2b631d", + "size": 6512 }, { - "url": "https://code.claude.com/docs/en/desktop-changelog", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/cancel", "status": "success", - "path": "en/docs/claude-code/desktop-changelog.md", - "sha256": "d0115c65f4c78d31054ad886a3a07fc838df1c23d537e6790c6f6a4882bce2a8", - "size": 164099 + "path": "en/api/cli/messages/batches/cancel.md", + "sha256": "b388420b49cd5bbe7430fe75bd1dbc5f1ee4b5914fe7db9c06bb9dcdc4ccd004", + "size": 4924 }, { - "url": "https://code.claude.com/docs/en/iam", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/list", "status": "success", - "path": "en/docs/claude-code/iam.md", - "sha256": "7eee08423ba09f648ad55d2a977d2783960450b5867e1629b23386341293a81d", - "size": 30701 + "path": "en/api/cli/messages/batches/list.md", + "sha256": "19125d83ad70a6f6085e5167e2052cb8d738a3566f61df198f7ddaa988ba9087", + "size": 5518 }, { - "url": "https://code.claude.com/docs/en/web-scheduled-tasks", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/retrieve", "status": "success", - "path": "en/docs/claude-code/web-scheduled-tasks.md", - "sha256": "f77b6715d462c6695f9e949a082313cc480fedef553305761a2f187c289e5474", - "size": 40156 + "path": "en/api/cli/messages/batches/retrieve.md", + "sha256": "b111c11e3f83bb31e1bd35200739fbdca845a7008bd8a64fff0b44746b8c8f8d", + "size": 4616 }, { - "url": "https://code.claude.com/docs/en/plugins", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/results", "status": "success", - "path": "en/docs/claude-code/plugins.md", - "sha256": "3d758b5da01f42cf2201c4f4d38a7ac24dbf76e7f31d03cf77632e4d720535cf", - "size": 13310 + "path": "en/api/cli/messages/batches/results.md", + "sha256": "abedc8f68f5277703ef5ff5b67a8f310293d7d89f6539ff71d6441fd4c87eae9", + "size": 36613 }, { - "url": "https://code.claude.com/docs/en/plugin-dependencies", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/delete", "status": "success", - "path": "en/docs/claude-code/plugin-dependencies.md", - "sha256": "429195438ab959715ee4d09e29b98163372f93e33fcc14d9efc87bcebfc0c3e2", - "size": 17135 + "path": "en/api/cli/messages/batches/delete.md", + "sha256": "22c0d47301b6e5d99a2011d16ec197483a331e8acd537d49004041296abbc499", + "size": 1475 }, { - "url": "https://code.claude.com/docs/en/agent-sdk/slash-commands", + "url": "https://platform.claude.com/docs/en/api/cli/messages/batches/create", "status": "success", - "path": "en/docs/claude-code/agent-sdk/slash-commands.md", - "sha256": "ba547726732fd543fa07f96bc243fb597d578d8546df1373b721ead01dab0646", - "size": 26910 + "path": "en/api/cli/messages/batches/create.md", + "sha256": "cb1a4bd11289a1245d9bf71736f6fa418d8ec5c4b10a797d16872924c79291f3", + "size": 5174 }, { "url": "https://raw.githubusercontent.com/anthropics/claude-cookbooks/main/.claude/agents/code-reviewer.md", @@ -29339,8 +29346,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-python/CHANGELOG.md", - "sha256": "234b1a8d88e9532641284349dd640aeaf48287c06bcaa2d9379ee0b5b1083e3f", - "size": 269714 + "sha256": "9054c84b7d2f62bfb904633c9f5995ecc2c8bc7ca10859427330432995ba579e", + "size": 270145 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/CLAUDE.md", @@ -29353,22 +29360,22 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/CONTRIBUTING.md", "status": "success", "path": "github/anthropic-sdk-python/CONTRIBUTING.md", - "sha256": "86f621e57cb6cd7f46463e70e87fe09ba04498f3999d081cbf8c5c39e058818d", - "size": 4684 + "sha256": "8cdac838c6143cfcc97463d011a01fc78d4a414433c013b115d931111d1c1537", + "size": 4844 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/MIGRATION.md", "status": "success", "path": "github/anthropic-sdk-python/MIGRATION.md", - "sha256": "2163448f25e2d5819608f607da2f66f776ecbea5c618625904ce28d77a526615", - "size": 24606 + "sha256": "16e020e190bd481f96e8b4189d56e04717407071b77a92e68647dc15f1c0cd51", + "size": 24771 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/README.md", "status": "success", "path": "github/anthropic-sdk-python/README.md", - "sha256": "05c7f018e77a7a0fd94679317f03a5720bbf257f1e43bfdd25162e42afb5a35e", - "size": 3343 + "sha256": "85442f47953b128c335414dccafd1de0c4ec1def3464accd051d940002e10f86", + "size": 3527 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/REVIEW.md", @@ -29388,8 +29395,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/api.md", "status": "success", "path": "github/anthropic-sdk-python/api.md", - "sha256": "9fd3dc6dd8a6404821805fb0c683e754017a008be5b4680a4cfc83429fed394d", - "size": 196605 + "sha256": "99e8dea610116e6cfa9705b55a9dd19f717d34cb3aa56a8d9cf524b09d8b865c", + "size": 196817 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/browser-toolset.md", @@ -29451,36 +29458,36 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/CHANGELOG.md", - "sha256": "425948c52deba4cf495dbdd366cb3c4939f27f9d03c4b1b873d0c57cb889ba31", - "size": 248846 + "sha256": "c3661a38cc829a1f6266455bea4113bc9c63cd22d0c9d7b0f455830d304aa959", + "size": 249436 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/CLAUDE.md", "status": "success", "path": "github/anthropic-sdk-typescript/CLAUDE.md", - "sha256": "2d33e9b96e16c67cab675b203501221ec97bc9e966655fcc184b5132131d1f63", - "size": 30094 + "sha256": "53e567176b7df0ba202b99270771d7a7dcad6b6d9676147566c67c41f87f7ecb", + "size": 31067 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/CONTRIBUTING.md", "status": "success", "path": "github/anthropic-sdk-typescript/CONTRIBUTING.md", - "sha256": "27d1cbaf2c387b7c60d8a46e959ade377a2c102b27cc3776286a2cbf9fff7ee5", - "size": 3204 + "sha256": "71a7b03f0aa9a4e3601c6a11546c17485239f18f10fe4ab9376746a11fd47ef4", + "size": 3364 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/MIGRATION.md", "status": "success", "path": "github/anthropic-sdk-typescript/MIGRATION.md", - "sha256": "649a2661ebee2566c9728af0fcc22ab11b604a83b66987cf1ff0be6412bb2a5b", - "size": 14783 + "sha256": "a72c5600a4653481faa0dce3fce1ed89cba0924bbcbe4d5fb2985b21cbc6f14c", + "size": 181 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/README.md", "status": "success", "path": "github/anthropic-sdk-typescript/README.md", - "sha256": "d4000198eef15e280880d006194efd53aee0289e816dfe87fd0b2de8d7c39dbb", - "size": 4621 + "sha256": "118454d96cc1001f17356cf7f4b6f52d72ed213aaf607990ac73149025554764", + "size": 4805 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/REVIEW.md", @@ -29500,8 +29507,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/api.md", "status": "success", "path": "github/anthropic-sdk-typescript/api.md", - "sha256": "2f3336ba08efcca685944e5c6406e8dad061662c613e5c106b5e1fd43c78b32b", - "size": 257428 + "sha256": "0aa05dd839d97d2c7c9a3da765e5bea2d91ecb3d81718c480a05727df9459dbd", + "size": 258148 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/browser-toolset.md", @@ -29535,15 +29542,15 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/helpers.md", "status": "success", "path": "github/anthropic-sdk-typescript/helpers.md", - "sha256": "6d8288c6f3691bfedccad8cc2a1f1680e4d13211f72911bcef8766c3cc7b299b", - "size": 35083 + "sha256": "732825d52649fcee5078fabedcf0ae2775abad82056f7136e12c0e21e58102be", + "size": 35139 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/aws-sdk/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/packages/aws-sdk/CHANGELOG.md", - "sha256": "0d8fef5c540c2e058bc9f8a6aaa0579ac694ab2c127e730370dc0f355800d3c3", - "size": 13602 + "sha256": "02b62e552a17c80b5a1f4fa3a474802ce5b3fc0dd555c040e3d08a592cff465f", + "size": 13873 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/aws-sdk/README.md", @@ -29556,8 +29563,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/bedrock-sdk/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/packages/bedrock-sdk/CHANGELOG.md", - "sha256": "5cefb5ccb21d63529d49b5f1b9f054e5e1f88931c77e05e659b8cf8b76a8b541", - "size": 52985 + "sha256": "51835346e2335cc6645cc79b31e913070533aa5c5be23d9fad94124f3d2a6f00", + "size": 53265 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/bedrock-sdk/README.md", @@ -29570,8 +29577,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/foundry-sdk/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/packages/foundry-sdk/CHANGELOG.md", - "sha256": "9c095b8717dc8591fbe6b134ff9a0970351114a391d5f69819b134b8c53db0a8", - "size": 9782 + "sha256": "8f37604eaeb7963d19871479d800d6b6993387e34694ada75fe356bb87504239", + "size": 10061 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/foundry-sdk/README.md", @@ -29584,8 +29591,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/google-cloud-sdk/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/packages/google-cloud-sdk/CHANGELOG.md", - "sha256": "1b24dd63d0f8b5ca00f4c65f8109472c01232361784a3d40f5774305ddf3c31e", - "size": 8278 + "sha256": "0e907f03b217838a63ded941054942c339ef4ed36d83aab132173fb771af2d24", + "size": 8567 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/google-cloud-sdk/README.md", @@ -29598,8 +29605,8 @@ "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/vertex-sdk/CHANGELOG.md", "status": "success", "path": "github/anthropic-sdk-typescript/packages/vertex-sdk/CHANGELOG.md", - "sha256": "fac56d0ee11c33e747b87117cc8488e65785377c78f04f028ffa9a782b8f4b78", - "size": 31956 + "sha256": "bc09ec2319a3e5116469cdaeaa3cda1db89bd46203ae6d99e4bb9f851fc0952c", + "size": 32234 }, { "url": "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/packages/vertex-sdk/README.md", @@ -29654,525 +29661,485 @@ "url": "https://platform.claude.com/docs/en/agent-sdk/stop-reasons", "reason": "moved -> https://code.claude.com/docs/en/agent-sdk" }, + { + "url": "https://platform.claude.com/docs/en/api/admin", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization" + }, { "url": "https://platform.claude.com/docs/en/agents-and-tools/claude-for-sheets", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/admin", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization" + "url": "https://code.claude.com/docs/en/sdk/migration-guide", + "reason": "moved -> https://code.claude.com/docs/en/agent-sdk" }, { - "url": "https://platform.claude.com/docs/en/api/sdks/cli", + "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/classification", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics" + "url": "https://platform.claude.com/docs/en/api/sdks/cli", + "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/admin/usage_report", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report" + "url": "https://platform.claude.com/docs/en/api/compliance/code", + "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code" }, { - "url": "https://platform.claude.com/docs/en/api/admin/api_keys", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys" + "url": "https://platform.claude.com/docs/en/api/admin/organizations", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization" }, { - "url": "https://platform.claude.com/docs/en/api/admin/cost_report", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/cost_report" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys" }, { "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces" + "url": "https://platform.claude.com/docs/en/api/admin/api_keys", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rate_limits", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rate_limits" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules" }, { "url": "https://platform.claude.com/docs/en/api/admin/service_accounts", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits" - }, - { - "url": "https://platform.claude.com/docs/en/api/admin/users", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users" + "url": "https://platform.claude.com/docs/en/api/admin/cost_report", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/cost_report" }, { - "url": "https://platform.claude.com/docs/en/api/admin/organizations", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization" + "url": "https://platform.claude.com/docs/en/api/admin/rate_limits", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rate_limits" }, { "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles" }, - { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups" - }, - { - "url": "https://platform.claude.com/docs/en/api/admin/invites", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites" - }, { "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules" - }, - { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys" - }, - { - "url": "https://platform.claude.com/docs/en/api/compliance/code", - "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code" + "url": "https://platform.claude.com/docs/en/api/admin/analytics", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics" }, { - "url": "https://platform.claude.com/docs/en/api/go/beta/webhooks/unwrap", - "reason": "HTTP 404" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces" }, { - "url": "https://platform.claude.com/docs/en/api/cli/beta/webhooks/unwrap", - "reason": "HTTP 404" + "url": "https://platform.claude.com/docs/en/api/admin/users", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users" }, { - "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts", - "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits" }, { - "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/list" + "url": "https://platform.claude.com/docs/en/api/admin/invites", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites" }, { - "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/retrieve_version", - "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/retrieve_version" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups" }, { - "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/delete" + "url": "https://platform.claude.com/docs/en/api/admin/usage_report", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report" }, { - "url": "https://platform.claude.com/docs/en/api/beta/webhooks/unwrap", + "url": "https://platform.claude.com/docs/en/api/typescript/beta/webhooks/unwrap", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/spend_limits/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/set" - }, - { - "url": "https://platform.claude.com/docs/en/api/beta/organization/spend_limits/list_effective", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/effective/list" - }, - { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/chat_projects", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects" - }, - { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/retrieve_summaries", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list" - }, - { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report" + "url": "https://platform.claude.com/docs/en/api/python/beta/webhooks/unwrap", + "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report" + "url": "https://platform.claude.com/docs/en/api/ruby/beta/webhooks/unwrap", + "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/list" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost/list_by_user", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/update" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage/list_by_user", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/chat_projects/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/delete" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/add" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/create" }, { - "url": "https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/remove" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report" }, { - "url": "https://platform.claude.com/docs/en/api/csharp/beta/webhooks/unwrap", - "reason": "HTTP 404" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/retrieve_summaries", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_claude_code", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_claude_code" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/chat_projects", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects" }, { - "url": "https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_messages", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_messages" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/connectors", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/connectors" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/set" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/list_effective", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/effective/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/skills", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/skills" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/plugins", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/plugins" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/delete" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/users", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/users" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/artifacts", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/artifacts" }, { "url": "https://platform.claude.com/docs/en/api/admin/rate_limits/list", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rate_limits/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/cost_report/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/cost_report/retrieve" - }, - { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/create" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/update" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/list" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/list_effective", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/effective/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/delete" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/set" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/delete" + "url": "https://platform.claude.com/docs/en/api/admin/api_keys/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/organizations/me", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/api_keys/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/create" + "url": "https://platform.claude.com/docs/en/api/admin/api_keys/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/update" + "url": "https://platform.claude.com/docs/en/api/admin/users/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/list" + "url": "https://platform.claude.com/docs/en/api/admin/users/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces" + "url": "https://platform.claude.com/docs/en/api/admin/users/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/users/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/remove" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/archive", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/archive" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/permissions", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/permissions" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/create" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/update" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/list" + "url": "https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_claude_code", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_claude_code" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_messages", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_messages" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/validate", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/validate" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/external_keys/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/delete" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/archive", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/invites/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/create" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/invites/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/list" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/invites/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/workspaces", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/workspaces" }, { - "url": "https://platform.claude.com/docs/en/api/admin/invites/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/delete" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/create" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/update" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/archive", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/list" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/archive", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/archive" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/permissions", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/permissions" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/list" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/rate_limits", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/rate_limits" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/chat_projects", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/skills", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/skills" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/archive", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/retrieve_summaries", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/connectors", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/connectors" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/users", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/users" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report" + "url": "https://platform.claude.com/docs/en/api/admin/organizations/me", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/plugins", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/plugins" + "url": "https://platform.claude.com/docs/en/api/admin/cost_report/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/cost_report/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/artifacts", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/artifacts" + "url": "https://platform.claude.com/docs/en/api/admin/invites/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/rotate_token", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/rotate_token" + "url": "https://platform.claude.com/docs/en/api/admin/invites/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/list" + "url": "https://platform.claude.com/docs/en/api/admin/invites/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/delete" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/invites/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/invites/create" }, { "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/reveal_token", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/reveal_token" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/list" }, { "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/archive", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/users/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/update" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/users/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/list" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/rotate_token", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/rotate_token" }, { - "url": "https://platform.claude.com/docs/en/api/admin/users/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/reveal_token", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/reveal_token" }, { - "url": "https://platform.claude.com/docs/en/api/admin/users/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/users/remove" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/create" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/update" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/list" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/validate", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/validate" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/workspaces", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/workspaces" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/delete" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/external_keys/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/external_keys/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/archive", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/archive" + "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/api_keys/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/update" + "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/archive", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/api_keys/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/list" + "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/api_keys/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/api_keys/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/create" + "url": "https://platform.claude.com/docs/en/api/admin/federation_issuers/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/issuers/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/update" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/list" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/archive", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/archive" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/rate_limits", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/rate_limits" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts" + "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/create" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/remove" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/archive", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/archive" + "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/add" }, { "url": "https://platform.claude.com/docs/en/api/admin/workspaces/rate_limits/list", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/rate_limits/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/add" - }, - { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/update" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/list" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/remove" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/remove" }, { "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/create", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/add" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/update", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/update" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/list" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/update", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/update" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/workspaces/members/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/members/remove" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/remove" }, { - "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/workspaces/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/workspaces/add" + "url": "https://platform.claude.com/docs/en/api/admin/workspaces/service_accounts/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/workspaces/service_accounts/add" }, { "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/workspaces/list", @@ -30183,303 +30150,351 @@ "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/workspaces/remove" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/create" + "url": "https://platform.claude.com/docs/en/api/admin/federation_rules/workspaces/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/federation/rules/workspaces/add" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/permissions/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/permissions/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/retrieve" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/mcp_tunnels/tunnel_certificates/archive", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/mcp_tunnels/tunnel_certificates/archive" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/retrieve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/retrieve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/approve", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/approve" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost/list_by_user", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/deny", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/deny" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost/list_by_user", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage/list_by_user", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/cost/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report/list" }, { "url": "https://platform.claude.com/docs/en/api/admin/analytics/connectors/list", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/connectors/list" }, - { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/artifacts/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/artifacts/list" - }, { "url": "https://platform.claude.com/docs/en/api/admin/analytics/users/list", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/users/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/chat_projects/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/artifacts/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/artifacts/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/admin/analytics/skills/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/skills/list" }, { "url": "https://platform.claude.com/docs/en/api/admin/analytics/plugins/list", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/plugins/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/analytics/skills/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/skills/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/chat_projects/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_roles/permissions/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/permissions/list" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage/list_by_user", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/create", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/add" + "url": "https://platform.claude.com/docs/en/api/admin/analytics/usage/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/list" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/service_accounts/workspaces/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/service_accounts/workspaces/remove" + "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/remove" }, { "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members/create", "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/add" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/list" + "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts", + "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts" }, { - "url": "https://platform.claude.com/docs/en/api/admin/rbac_groups/members/delete", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/remove" + "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/retrieve_version", + "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/retrieve_version" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/deny", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/deny" + "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/list" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/list", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/list" + "url": "https://platform.claude.com/docs/en/api/compliance/code/artifacts/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/compliance/apps/code/artifacts/delete" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/retrieve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/retrieve" + "url": "https://platform.claude.com/docs/en/api/go/beta/webhooks/unwrap", + "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/admin/spend_limits/increase_requests/approve", - "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/increase_requests/approve" + "url": "https://platform.claude.com/docs/en/api/java/beta/webhooks/unwrap", + "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/typescript/beta/webhooks/unwrap", + "url": "https://platform.claude.com/docs/en/api/csharp/beta/webhooks/unwrap", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/python/beta/webhooks/unwrap", + "url": "https://platform.claude.com/docs/en/api/cli/beta/webhooks/unwrap", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/java/beta/webhooks/unwrap", + "url": "https://platform.claude.com/docs/en/api/beta/webhooks/unwrap", "reason": "HTTP 404" }, { - "url": "https://platform.claude.com/docs/en/api/ruby/beta/webhooks/unwrap", - "reason": "HTTP 404" + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report" }, { - "url": "https://platform.claude.com/docs/en/models/opus-5/migration-guide", - "reason": "moved -> https://platform.claude.com/docs/en/models/opus-5-5/migration-guide" + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/retrieve_summaries", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/chat_projects", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/spend_limits/list_effective", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/effective/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/spend_limits/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/spend_limits/set" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost/list_by_user", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/cost/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/cost_report/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/chat_projects/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/apps/chat/projects/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage/list_by_user", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/analytics/usage/list", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/analytics/usage_report/list" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/delete", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/remove" + }, + { + "url": "https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/create", + "reason": "moved -> https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/add" + }, + { + "url": "https://platform.claude.com/docs/en/models/haiku-4-5/migration-guide", + "reason": "moved -> https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide" }, { "url": "https://platform.claude.com/docs/en/models/opus-5/whats-new-opus-5", "reason": "moved -> https://platform.claude.com/docs/en/models/opus-5/overview" }, { - "url": "https://platform.claude.com/docs/en/models/fable-5/migration-guide", - "reason": "moved -> https://platform.claude.com/docs/en/models/fable-5-1/migration-guide" + "url": "https://platform.claude.com/docs/en/models/opus-5/migration-guide", + "reason": "moved -> https://platform.claude.com/docs/en/models/opus-5-5/migration-guide" }, { "url": "https://platform.claude.com/docs/en/models/fable-5/introducing-claude-fable-5-and-claude-mythos-5", "reason": "moved -> https://platform.claude.com/docs/en/models/fable-5/overview" }, { - "url": "https://platform.claude.com/docs/en/models/sonnet-5/migration-guide", - "reason": "moved -> https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide" + "url": "https://platform.claude.com/docs/en/models/fable-5/migration-guide", + "reason": "moved -> https://platform.claude.com/docs/en/models/fable-5-1/migration-guide" }, { "url": "https://platform.claude.com/docs/en/models/sonnet-5/whats-new-sonnet-5", "reason": "moved -> https://platform.claude.com/docs/en/models/sonnet-5/overview" }, { - "url": "https://platform.claude.com/docs/en/models/haiku-4-5/migration-guide", - "reason": "moved -> https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide" + "url": "https://platform.claude.com/docs/en/models/sonnet-5/migration-guide", + "reason": "moved -> https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/polyglot-superpowers", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/prose-polisher", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/csv-converter", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/mindfulness-mentor", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/mindfulness-mentor", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/culinary-creator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/function-fabricator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/second-grade-simplifier", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/python-bug-buster", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/simile-savant", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/sci-fi-scenario-simulator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/email-extractor", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/grammar-genie", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/meeting-scribe", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/cite-your-sources", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/perspectives-ponderer", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/dream-interpreter", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/tongue-twister", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/efficiency-estimator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/career-coach", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/excel-formula-expert", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/socratic-sage", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/riddle-me-this", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/function-fabricator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/brand-builder", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/memo-maestro", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/vr-fitness-innovator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/latex-legend", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/philosophical-musings", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/neologism-creator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/tongue-twister", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/spreadsheet-sorcerer", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/pun-dit", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/vr-fitness-innovator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/data-organizer", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/code-consultant", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/pii-purifier", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/library", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/library", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/pun-dit", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/simile-savant", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/philosophical-musings", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/emoji-encoder", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/excel-formula-expert", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/socratic-sage", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/hal-the-humorous-helper", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/ethical-dilemma-navigator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/portmanteau-poet", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/second-grade-simplifier", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/corporate-clairvoyant", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/tweet-tone-detector", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/ethical-dilemma-navigator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/alien-anthropologist", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/riddle-me-this", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/code-clarifier", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/time-travel-consultant", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/prose-polisher", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/mood-colorizer", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/email-extractor", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/dream-interpreter", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/latex-legend", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/lesson-planner", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/airport-code-analyst", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/alien-anthropologist", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/google-apps-scripter", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/efficiency-estimator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/perspectives-ponderer", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/interview-question-crafter", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/corporate-clairvoyant", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/sci-fi-scenario-simulator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/idiom-illuminator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/review-classifier", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/git-gud", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/code-clarifier", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/culinary-creator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/csv-converter", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/lesson-planner", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/idiom-illuminator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { @@ -30487,19 +30502,19 @@ "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/memo-maestro", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/sql-sorcerer", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/review-classifier", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/babels-broadcasts", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/meeting-scribe", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/trivia-generator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/storytelling-sidekick", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/pii-purifier", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { @@ -30507,97 +30522,89 @@ "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/neologism-creator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/polyglot-superpowers", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/spreadsheet-sorcerer", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/master-moderator", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/interview-question-crafter", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/direction-decoder", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/hal-the-humorous-helper", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/git-gud", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/mood-colorizer", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/airport-code-analyst", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/career-coach", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/grammar-genie", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/code-consultant", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/product-naming-pro", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/master-moderator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/alliteration-alchemist", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/grading-guru", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/futuristic-fashion-advisor", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/time-travel-consultant", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/brand-builder", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/sql-sorcerer", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/emoji-encoder", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/trivia-generator", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/tweet-tone-detector", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/direction-decoder", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/google-apps-scripter", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/portmanteau-poet", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/storytelling-sidekick", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/babels-broadcasts", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/python-bug-buster", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/futuristic-fashion-advisor", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/data-organizer", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/alliteration-alchemist", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/grading-guru", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, { - "url": "https://platform.claude.com/docs/en/resources/prompt-library/product-naming-pro", + "url": "https://platform.claude.com/docs/en/resources/prompt-library/cite-your-sources", "reason": "moved -> https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices" }, - { - "url": "https://code.claude.com/docs/en/sdk/migration-guide", - "reason": "moved -> https://code.claude.com/docs/en/agent-sdk" - }, - { - "url": "https://platform.claude.com/docs/en/about-claude/use-case-guides/classification", - "reason": "HTTP 404" - }, { "url": "https://modelcontextprotocol.io/community/interest-groups/primitive-grouping", "reason": "moved -> https://modelcontextprotocol.io/community/working-groups/progressive-disclosure" }, - { - "url": "https://modelcontextprotocol.io/community/working-groups/agents", - "reason": "moved -> https://modelcontextprotocol.io/community/interest-groups/agents" - }, { "url": "https://modelcontextprotocol.io/community/working-groups/triggers-events", "reason": "moved -> https://modelcontextprotocol.io/community/working-groups/tasks-events" }, + { + "url": "https://modelcontextprotocol.io/community/working-groups/agents", + "reason": "moved -> https://modelcontextprotocol.io/community/interest-groups/agents" + }, { "url": "https://modelcontextprotocol.io/specification/draft/basic/utilities/mrtr", "reason": "HTTP 404" @@ -30607,43 +30614,47 @@ "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/11174660-online-safety-contacts", - "reason": "moved -> https://support.claude.com/en/articles/11174660-point-of-contact-for-authorities-and-regulators" + "url": "https://support.claude.com/en/articles/12922929-building-desktop-extensions-with-mcpb", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/9796807-creating-and-managing-workspaces-in-the-claude-console", - "reason": "moved -> https://support.claude.com/en/articles/9796807-create-and-manage-workspaces-in-the-claude-console" + "url": "https://support.claude.com/en/articles/9264804-how-can-i-cancel-my-claude-pro-subscription-on-the-claude-app-for-ios", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/12922832-local-mcp-server-submission-guide", + "url": "https://support.claude.com/en/articles/12922490-remote-mcp-server-submission-guide", "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/12618689-claude-code-on-the-web", - "reason": "moved -> https://support.claude.com/en/articles/12618689-use-claude-code-in-the-cloud" + "url": "https://support.claude.com/en/articles/14465370-use-claude-for-word", + "reason": "moved -> https://claude.com/docs/office-agents/word" }, { - "url": "https://support.claude.com/en/articles/13851150-install-financial-services-plugins", - "reason": "moved -> https://academy.claude.com/tutorials/install-financial-services-plugins-for-cowork" + "url": "https://support.claude.com/en/articles/14503689-mcp-connectors", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/9612889-how-can-i-uninstall-claude-for-android", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/14503804-classification-banner-in-claude-for-government", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/14503643-set-up-scim-in-claude-for-government", - "reason": "moved -> https://claude.com/docs/government/overview" + "url": "https://support.claude.com/en/articles/9547008-publish-and-share-artifacts", + "reason": "moved -> https://support.claude.com/en/articles/9547008-share-artifacts" }, { - "url": "https://support.claude.com/en/articles/9927533-disable-public-projects-for-your-organization", - "reason": "moved -> https://support.claude.com/en/articles/9927533-control-project-sharing-for-your-organization" + "url": "https://support.claude.com/en/articles/15282265-claude-enterprise-activation-promo-for-claude-code-and-cowork", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/14503675-organization-instructions-in-claude-for-government", - "reason": "moved -> https://claude.com/docs/government/overview" + "url": "https://support.claude.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them", + "reason": "moved -> https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them" }, { - "url": "https://support.claude.com/en/articles/8114526-how-will-i-be-billed-for-claude-api-use", + "url": "https://support.claude.com/en/articles/11049762-choose-a-claude-plan", + "reason": "HTTP 404" + }, + { + "url": "https://support.claude.com/en/articles/9612889-how-can-i-uninstall-claude-for-android", "reason": "HTTP 404" }, { @@ -30651,159 +30662,151 @@ "reason": "moved -> https://support.claude.com/en/articles/14729249-use-live-artifacts-in-claude-cowork" }, { - "url": "https://support.claude.com/en/articles/15424964-claude-fable-5-on-your-plan", - "reason": "moved -> https://support.claude.com/en/articles/15424964-claude-fable-models-on-your-plan" + "url": "https://support.claude.com/en/articles/9927533-disable-public-projects-for-your-organization", + "reason": "moved -> https://support.claude.com/en/articles/9927533-control-project-sharing-for-your-organization" }, { - "url": "https://support.claude.com/en/articles/15282265-claude-enterprise-activation-promo-for-claude-code-and-cowork", + "url": "https://support.claude.com/en/articles/10722177-sharing-prompts-in-the-claude-console", "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/14503794-model-availability-in-claude-for-government", - "reason": "moved -> https://claude.com/docs/government/overview" - }, - { - "url": "https://support.claude.com/en/articles/10366473-where-can-i-find-full-receipts-and-invoices-for-my-claude-api-and-console-payments", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/13346458-customizing-your-console-appearance-settings", + "reason": "moved -> https://support.claude.com/en/articles/13346458-customize-your-console-appearance-settings" }, { - "url": "https://support.claude.com/en/articles/13945233-use-claude-for-microsoft-365-with-third-party-platforms", - "reason": "moved -> https://claude.com/docs/office-agents/third-party-platforms" + "url": "https://support.claude.com/en/articles/9796807-creating-and-managing-workspaces-in-the-claude-console", + "reason": "moved -> https://support.claude.com/en/articles/9796807-create-and-manage-workspaces-in-the-claude-console" }, { - "url": "https://support.claude.com/en/articles/14479591-use-dictation-in-office-agents", - "reason": "moved -> https://claude.com/docs/office-agents/dictation" + "url": "https://support.claude.com/en/articles/13163666-holiday-2025-usage-promotion", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/14503775-mcp-web-search", + "url": "https://support.claude.com/en/articles/14503675-organization-instructions-in-claude-for-government", "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/14503590-get-started-with-claude-for-government", - "reason": "moved -> https://claude.com/docs/government/overview" + "url": "https://support.claude.com/en/articles/13443764-inviting-members-to-the-claude-console", + "reason": "moved -> https://support.claude.com/en/articles/13443764-invite-members-to-the-claude-console" }, { - "url": "https://support.claude.com/en/articles/14465370-use-claude-for-word", - "reason": "moved -> https://claude.com/docs/office-agents/word" + "url": "https://support.claude.com/en/articles/9767949-api-key-best-practices-keeping-your-keys-safe-and-secure", + "reason": "moved -> https://support.claude.com/en/articles/9767949-api-key-best-practices-keep-your-keys-safe-and-secure" }, { - "url": "https://support.claude.com/en/articles/16989529-invite-people-outside-your-organization-to-an-artifact", - "reason": "moved -> https://support.claude.com/en/articles/9547008-share-artifacts" + "url": "https://support.claude.com/en/articles/13521390-use-claude-for-powerpoint", + "reason": "moved -> https://claude.com/docs/office-agents/powerpoint" }, { - "url": "https://support.claude.com/en/articles/14503689-mcp-connectors", - "reason": "moved -> https://claude.com/docs/government/overview" + "url": "https://support.claude.com/en/articles/13756069-public-sector-faqs", + "reason": "moved -> https://claude.com/solutions/government" }, { - "url": "https://support.claude.com/en/articles/9547008-publish-and-share-artifacts", - "reason": "moved -> https://support.claude.com/en/articles/9547008-share-artifacts" + "url": "https://support.claude.com/en/articles/14503794-model-availability-in-claude-for-government", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/13892150-work-across-microsoft-365-apps", - "reason": "moved -> https://claude.com/docs/office-agents/work-across-apps" + "url": "https://support.claude.com/en/articles/15424964-claude-fable-5-on-your-plan", + "reason": "moved -> https://support.claude.com/en/articles/15424964-claude-fable-models-on-your-plan" }, { - "url": "https://support.claude.com/en/articles/16049681-why-claude-switched-models-in-your-conversation-with-opus-5", - "reason": "moved -> https://support.claude.com/en/articles/16049681-why-claude-switched-models-in-your-conversation-with-opus-5-or-opus-5-5" + "url": "https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5", + "reason": "moved -> https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5-or-fable-5-1" }, { - "url": "https://support.claude.com/en/articles/12922929-building-desktop-extensions-with-mcpb", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/16989529-invite-people-outside-your-organization-to-an-artifact", + "reason": "moved -> https://support.claude.com/en/articles/9547008-share-artifacts" }, { - "url": "https://support.claude.com/en/articles/14503804-classification-banner-in-claude-for-government", + "url": "https://support.claude.com/en/articles/14503590-get-started-with-claude-for-government", "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/17274727-artifact-usage-promotion", - "reason": "HTTP 404" - }, - { - "url": "https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet", - "reason": "moved -> https://support.claude.com/en/articles/14604842-cyber-verification-program" + "url": "https://support.claude.com/en/articles/13892150-work-across-microsoft-365-apps", + "reason": "moved -> https://claude.com/docs/office-agents/work-across-apps" }, { - "url": "https://support.claude.com/en/articles/13163666-holiday-2025-usage-promotion", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/9876003-i-have-a-paid-claude-subscription-pro-max-team-or-enterprise-plans-why-do-i-have-to-pay-separately-to-use-the-claude-api-and-console", + "reason": "moved -> https://support.claude.com/en/articles/9876003-i-have-a-paid-claude-subscription-pro-max-team-or-enterprise-plans-why-is-claude-api-usage-billed-separately-from-my-paid-claude-plan" }, { - "url": "https://support.claude.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them", - "reason": "moved -> https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them" + "url": "https://support.claude.com/en/articles/14503643-set-up-scim-in-claude-for-government", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/14855664-use-claude-for-outlook", - "reason": "moved -> https://claude.com/docs/office-agents/outlook" + "url": "https://support.claude.com/en/articles/10366473-where-can-i-find-full-receipts-and-invoices-for-my-claude-api-and-console-payments", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/12650343-use-claude-for-excel", - "reason": "moved -> https://claude.com/docs/office-agents/excel" + "url": "https://support.claude.com/en/articles/8114526-how-will-i-be-billed-for-claude-api-use", + "reason": "HTTP 404" }, { "url": "https://support.claude.com/en/articles/8606395-how-large-is-the-claude-api-s-context-window", "reason": "moved -> https://platform.claude.com/docs/en/models/overview" }, { - "url": "https://support.claude.com/en/articles/9264804-how-can-i-cancel-my-claude-pro-subscription-on-the-claude-app-for-ios", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/13851150-install-financial-services-plugins", + "reason": "moved -> https://academy.claude.com/tutorials/install-financial-services-plugins-for-cowork" }, { - "url": "https://support.claude.com/en/articles/13346458-customizing-your-console-appearance-settings", - "reason": "moved -> https://support.claude.com/en/articles/13346458-customize-your-console-appearance-settings" + "url": "https://support.claude.com/en/articles/16049681-why-claude-switched-models-in-your-conversation-with-opus-5", + "reason": "moved -> https://support.claude.com/en/articles/16049681-why-claude-switched-models-in-your-conversation-with-opus-5-or-opus-5-5" }, { - "url": "https://support.claude.com/en/articles/11049762-choose-a-claude-plan", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/13945233-use-claude-for-microsoft-365-with-third-party-platforms", + "reason": "moved -> https://claude.com/docs/office-agents/third-party-platforms" }, { - "url": "https://support.claude.com/en/articles/13521390-use-claude-for-powerpoint", - "reason": "moved -> https://claude.com/docs/office-agents/powerpoint" + "url": "https://support.claude.com/en/articles/14479591-use-dictation-in-office-agents", + "reason": "moved -> https://claude.com/docs/office-agents/dictation" }, { - "url": "https://support.claude.com/en/articles/14503703-mcp-individual-connectors", - "reason": "moved -> https://claude.com/docs/government/overview" + "url": "https://support.claude.com/en/articles/14855664-use-claude-for-outlook", + "reason": "moved -> https://claude.com/docs/office-agents/outlook" }, { - "url": "https://support.claude.com/en/articles/10722177-sharing-prompts-in-the-claude-console", + "url": "https://support.claude.com/en/articles/11503834-build-custom-connectors-via-remote-mcp-servers", "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/9767949-api-key-best-practices-keeping-your-keys-safe-and-secure", - "reason": "moved -> https://support.claude.com/en/articles/9767949-api-key-best-practices-keep-your-keys-safe-and-secure" + "url": "https://support.claude.com/en/articles/14503775-mcp-web-search", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/13443764-inviting-members-to-the-claude-console", - "reason": "moved -> https://support.claude.com/en/articles/13443764-invite-members-to-the-claude-console" + "url": "https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet", + "reason": "moved -> https://support.claude.com/en/articles/14604842-cyber-verification-program" }, { - "url": "https://support.claude.com/en/articles/13756069-public-sector-faqs", - "reason": "moved -> https://claude.com/solutions/government" + "url": "https://support.claude.com/en/articles/12650343-use-claude-for-excel", + "reason": "moved -> https://claude.com/docs/office-agents/excel" }, { - "url": "https://support.claude.com/en/articles/11503834-build-custom-connectors-via-remote-mcp-servers", - "reason": "HTTP 404" + "url": "https://support.claude.com/en/articles/14503613-sso-login", + "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5", - "reason": "moved -> https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5-or-fable-5-1" + "url": "https://support.claude.com/en/articles/17274727-artifact-usage-promotion", + "reason": "HTTP 404" }, { - "url": "https://support.claude.com/en/articles/9876003-i-have-a-paid-claude-subscription-pro-max-team-or-enterprise-plans-why-do-i-have-to-pay-separately-to-use-the-claude-api-and-console", - "reason": "moved -> https://support.claude.com/en/articles/9876003-i-have-a-paid-claude-subscription-pro-max-team-or-enterprise-plans-why-is-claude-api-usage-billed-separately-from-my-paid-claude-plan" + "url": "https://support.claude.com/en/articles/12618689-claude-code-on-the-web", + "reason": "moved -> https://support.claude.com/en/articles/12618689-use-claude-code-in-the-cloud" }, { - "url": "https://support.claude.com/en/articles/14503613-sso-login", + "url": "https://support.claude.com/en/articles/14503703-mcp-individual-connectors", "reason": "moved -> https://claude.com/docs/government/overview" }, { - "url": "https://support.claude.com/en/articles/12922490-remote-mcp-server-submission-guide", + "url": "https://support.claude.com/en/articles/12922832-local-mcp-server-submission-guide", "reason": "HTTP 404" }, { - "url": "https://claude.com/docs/connectors/overview", - "reason": "moved -> https://claude.com/docs/connectors/getting-started" + "url": "https://support.claude.com/en/articles/11174660-online-safety-contacts", + "reason": "moved -> https://support.claude.com/en/articles/11174660-point-of-contact-for-authorities-and-regulators" }, { - "url": "https://claude.com/docs/claude-science/run-on-windows", + "url": "https://claude.com/docs/claude-science/run-on-windows-wsl", "reason": "moved -> https://claude.com/docs/claude-science/get-started" }, { @@ -30811,13 +30814,17 @@ "reason": "moved -> https://claude.com/docs/claude-science/comments" }, { - "url": "https://claude.com/docs/claude-science/run-on-windows-wsl", + "url": "https://claude.com/docs/claude-science/run-on-windows", "reason": "moved -> https://claude.com/docs/claude-science/get-started" }, { "url": "https://claude.com/docs/claude-science/whats-not-available-yet", "reason": "moved -> https://claude.com/docs/claude-science/admin-controls" }, + { + "url": "https://claude.com/docs/connectors/overview", + "reason": "moved -> https://claude.com/docs/connectors/getting-started" + }, { "url": "https://claude.com/docs/connectors/custom/remote-mcp", "reason": "moved -> https://claude.com/docs/connectors/custom/add-unlisted" @@ -30840,8 +30847,8 @@ } ], "summary": { - "total": 4532, - "downloaded": 4234, + "total": 4533, + "downloaded": 4235, "skipped": 0, "failed": 0, "dead": 298, diff --git a/content/claude/government/changelog.md b/content/claude/government/changelog.md index 56a0b205f1..30ceeec7fa 100644 --- a/content/claude/government/changelog.md +++ b/content/claude/government/changelog.md @@ -6,6 +6,20 @@ > Release notes for Claude for Government +**2026.10.21.1** + +* Fixed the tenant portal's Identity and access page so that it says its SCIM details couldn't load instead of looking as if SCIM had never been set up. +* (breaking) Changed **Claude Desktop home** where a setting enforced at a higher level conflicts with the choice: members on Claude Desktop 1.52386.0 or later may lose Chat, Advanced file analysis or Cowork after a required relaunch. +* Changed Claude Desktop for members who have **Cowork in Claude Desktop** off and no **Claude Desktop home** chosen: from November 9, 2026 (UTC), they may be asked to relaunch and then see the new home screen, still without Cowork. +* Changed the Code tab in Claude Desktop to ask the member before each command Claude runs in its Terminal panel, even in bypass-permissions or Auto mode, while **Blocked shell commands** lists any command. +* Improved directory sync (SCIM) so that one tenant's very large sync no longer holds up directory changes in other tenants. +* Added a **Chat only** choice to the **Claude Desktop home** setting on the Config pages, which gives members Chat without Advanced file analysis or Cowork; with this choice the new home screen shows on Claude Desktop 2.2553.0 or later. + +**2026.10.18.1** + +* Changed the scope bar dropdown on the Config pages to list **A directory group** before any group has synced. +* Changed the browser page at the end of app sign-in to tell a member with no seat that an administrator has to assign one. + **Claude Code 2.1.302** * Changed unattended runs of the Claude Code command-line tool, such as `claude -p`, where **Auto mode** is set to **Allowed**: on Claude Code 2.1.302 or later they start in Auto mode only when Auto mode is chosen for them. @@ -14,10 +28,43 @@ * Changed **Managed hooks** on Windows devices without Git for Windows: on Claude Code 2.1.299 or later, a managed hook written as a Bash command that checks a tool call or a permission request blocks that action when the command fails. +**2026.10.14.2** + +* Added **Callback port** and **Callback host** to the **OAuth (pre-registered app)** option for connectors under Config > Integrations, for sign-in providers that accept the redirect only on a registered port or host; the Compliance API records both. + +**2026.10.14.1** + +* Fixed sign-in sending some tenants' members to a page that does not exist when single sign-on had never been connected: sign-in now shows a message instead, and the tenant portal's Identity and access page shows single sign-on as Not configured. +* Fixed the seat tier form losing what was typed in Name and Sort order when a save was refused. +* Changed the Compliance API to return only the most recent 30 days of activity; requests reaching further back succeed and return only events from the last 30 days. +* Changed the error for a chat or token-count request that is over the size limit for a single request: it is now a 413 `request_too_large` error whose "Request too large" message says to start a new conversation or send fewer or smaller attachments. +* Changed the tenant Config page to make a tenant admin choose whether organizations may set their own value the first time they set **Telemetry endpoint**, **Telemetry headers**, or **Connectors**; **Connectors** didn't offer this choice before. +* Added a **Default model** setting to seat tiers, with an **Always start with the default model** option that needs Claude Desktop 2.110.0 or later; seat tier create and update activities from the Compliance API include both settings. +* Added the **Scheduled tasks** setting under Config > Product availability, on by default; turning it off stops scheduled tasks in Cowork and Code on Claude Desktop 2.110.0 or later. + +**2026.10.07.1** + +* Improved screen reader support for the seat tier picker on the Admin Console's Users page. +* Changed usage limits, spend caps and usage pages to count requests with long prompts at a model's higher price for them, where a model has one. +* Added the **Terminal panel tools** setting under Integrations, which lets Claude run commands in the Code tab's Terminal panel and open, list or stop its tabs; it is on by default and off while Shell commands is off. + +**2026.10.02.1** + +* Changed the tenant portal's Seats and Billing pages and its billing-account picker to list billing accounts A to Z by name. +* Added an **Open Claude Desktop** button to the Account tab of the web portal: it opens Claude Desktop on the member's computer, and shows for members who have a seat tier and have Claude Desktop turned on. + **2026.10.01.1** * Added a **New members start here** option to self-managed seat tiers, so you can pick the tier new members start on. +**2026.09.30.1** + +* Fixed the Config page describing an empty **Restart deadline for configuration changes** as 1 hour; an empty field uses Claude Desktop's default, which is 24 hours on up-to-date versions. +* Changed the Config page's Product availability rows to read "Coming soon" for a product Anthropic has not yet made available to your tenant, instead of showing a switch that could be turned on without effect. +* Changed Claude Desktop's Claude for Government Web import banner so that it can come back a few days after a member skips it, until they run the import or have skipped it a few times; this needs Claude Desktop 2.16120.0 or later. +* Improved the User email addresses pages in the organization portal and the tenant portal: a list of more than 450 addresses is shown in parts of up to 450, each with its own Copy button. +* Added the `People.Read`, `Team.ReadBasic.All` and `Channel.ReadBasic.All` permissions to the Microsoft 365 connector's **Read access** list under Config > Integrations, which let Claude search for people and list a member's teams and channels; they require Claude Desktop 1.32885.1 or later. + **2026.09.29.1** * Changed directory sync so that a member who leaves a group mapped to a self-managed seat tier with no seat limit keeps that seat tier until another group's mapping or an admin moves them. @@ -25,6 +72,10 @@ * Added a **Copy user email addresses** button to the tenant portal's Organizations page: it opens a page where tenant admins can copy the email addresses of everyone in the tenant who has not been deactivated, all together or one organization at a time. * Added **Move up**, **Move down**, **Move to top**, and **Move to bottom** to each sign-in rule, provisioning rule, and directory group row in the tenant portal, so they can be reordered without dragging. +**2026.09.25.1** + +* Added the **Block reads outside workspace folders** setting under Sessions and access, which stops Claude's file tools in a Claude Desktop Code session from reading outside its project folder and the Allowed workspace folders. + **2026.09.24.2** * Fixed the keyboard focus outline on scrollable tables in the Admin Console being hard to see. diff --git a/content/claude/government/config/overview.md b/content/claude/government/config/overview.md index cc2273150b..a40385c8d2 100644 --- a/content/claude/government/config/overview.md +++ b/content/claude/government/config/overview.md @@ -61,9 +61,9 @@ Settings that may contain secrets, such as telemetry headers, are never echoed b ## When changes take effect -Settings that govern the admin portal, such as whether organizations may manage seat tiers, apply immediately. Settings that govern the Claude applications themselves, such as the Claude Desktop banner, product availability, and telemetry endpoint, are delivered to each member's application the next time it refreshes its configuration, which happens when the application is launched, when the member signs in, and periodically while the application runs. You do not need to push anything. Most changes take effect when the member restarts the application. Claude Desktop prompts for that restart, and requires it once the [Restart deadline for configuration changes](/docs/government/config/settings#restart-deadline-for-configuration-changes) has passed. On Claude Desktop 2.2553.0 and later, a few settings take effect in a running application without a restart, such as the **Claude Desktop banner** and the two switches under [Member-added plugins and marketplaces](/docs/government/config/settings#member-added-plugins-and-marketplaces). +Settings that govern the admin portal, such as whether organizations may manage seat tiers, apply immediately. Settings that govern the Claude applications themselves, such as the Claude Desktop banner, product availability, and telemetry endpoint, are delivered to each member's application the next time it refreshes its configuration, which happens when the application is launched, when the member signs in, and periodically while the application runs. You do not need to push anything. Most changes take effect when the member restarts the application. Claude Desktop prompts for that restart, and requires it once the [Restart deadline for configuration changes](/docs/government/config/settings#restart-deadline-for-configuration-changes) has passed. On Claude Desktop 2.2553.0 and later, a few settings take effect in a running application without a restart, such as the **Claude Desktop banner** and the [two switches that let members add plugins](/docs/government/config/settings#member-added-plugins-and-marketplaces). -Lowering the session idle timeout applies to new sign-ins only, and so does raising or removing the maximum session length. Lowering the maximum session length, or setting one for the first time, also reaches members who are already signed in, taking up to one idle timeout period to do so, as described under [Maximum session length](/docs/government/config/settings#maximum-session-length). +Lowering the session idle timeout applies to new sign-ins only, and so does raising or removing the maximum session length. Lowering the maximum session length, or setting one for the first time, also reaches members who are already signed in, taking up to one idle timeout period to do so. ## Working with the list @@ -134,7 +134,7 @@ The Config page shows the same list of settings at both levels, and almost all o * **Preview impact appears only at the tenant level.** See [Previewing impact](#previewing-impact) above. * **Group priority is set at the tenant level.** Organization owners see the priority order for reference but cannot change it. * **Tenant administrators can open any organization's Config page** and act on that organization's behalf. Organization owners see only their own organization. -* **Inherited connectors and plugins are labeled at the organization level.** Connectors and plugins the tenant has added appear on the organization page with an **Inherited from your tenant** badge; see [The Connectors card](/docs/government/connectors/overview#the-connectors-card) and [Tool and connector cards](/docs/government/config/settings#tool-and-connector-cards). +* **Inherited connectors and plugins are labeled at the organization level.** Connectors and plugins the tenant has added appear on the organization page with an **Inherited from your tenant** badge; see [The Connectors card](/docs/government/connectors/overview#the-connectors-card). For more detail see [Config at the tenant level](/docs/government/tenant-admin/configuration) and [Config at the organization level](/docs/government/org-admin/configuration). diff --git a/content/claude/government/config/plugins-and-connectors.md b/content/claude/government/config/plugins-and-connectors.md index 7fe8243b62..e80023547d 100644 --- a/content/claude/government/config/plugins-and-connectors.md +++ b/content/claude/government/config/plugins-and-connectors.md @@ -8,7 +8,7 @@ > **Who this is for:** Tenant administrators and organization owners who deliver plugins and connectors to the members they manage. -You add plugins on the **Plugins** card and connectors on the **Connectors** card of the **Config** page in the admin portal. The card controls themselves are described under [Tool and connector cards](/docs/government/config/settings#tool-and-connector-cards), and this page covers the tasks around them, from choosing between a plugin and a connector to keeping plugins up to date. To distribute skills to members, bundle them in a plugin, as described under [Skills for administrators](/docs/government/desktop/skills#skills-for-administrators). +You add plugins on the **Plugins** card and connectors on the **Connectors** card of the **Config** page in the admin portal. The cards themselves are listed under [Integrations](/docs/government/config/settings#integrations) in Available settings, and this page covers the tasks around them, from choosing between a plugin and a connector to keeping plugins up to date. To distribute skills to members, bundle them in a plugin, as described under [Skills for administrators](/docs/government/desktop/skills#skills-for-administrators). ## Plugins versus connectors @@ -44,7 +44,7 @@ A package is marked **Runs code** when it declares components that can run code The upload preview marks any plugin that declares components that can run code on the member's machine, for example hooks or an [MCP server](/docs/connectors/getting-started), and you confirm that you trust such a package before it is added. For a marketplace archive, one confirmation covers every marked plugin in the batch. After you add it, the plugin's row on the **Plugins** card keeps a **Runs code** marker, so you can see at a glance which of the plugins you have added contain these components. -The marker reflects what a plugin declares. In Claude for Government, a marked plugin's hooks run on the member's machine at defined points during a session. Claude Desktop can also run a local MCP server that the plugin declares on the member's machine, or connect to a remote one. If a plugin's remote MCP server does not connect, check the **Member-added connectors** setting on the **Connectors** card, described under **Claude Code** in [Available settings](/docs/government/config/settings). +The marker reflects what a plugin declares. In Claude for Government, a marked plugin's hooks run on the member's machine at defined points during a session. Claude Desktop can also run a local MCP server that the plugin declares on the member's machine, or connect to a remote one. If a plugin's remote MCP server does not connect, check [**Member-added connectors**](/docs/government/config/settings#member-added-connectors) and the **Blocked connectors** list on the **Connectors** card. Treat the marker as a prompt to review the package yourself. You are responsible for the plugins you distribute to members, so read each plugin's contents before you upload it. @@ -54,17 +54,17 @@ Each plugin on the **Plugins** card has an install behavior that you set when yo You do not need to push anything for a plugin to reach members. Claude Desktop syncs your organization's plugin list when it starts and periodically while it runs, so an auto-installed plugin appears on its own, and a member who already has the application open receives it at the next sync. A member can remove a plugin you installed automatically, and it stays removed on the device where they removed it. -Two switches, **Let members add plugin marketplaces** and **Let members add their own plugins**, control whether members can also add plugins of their own in Claude Desktop, as described under [Member-added plugins and marketplaces](/docs/government/config/settings#member-added-plugins-and-marketplaces). Both are off by default. Plugins that members add are separate from the ones you add and do not appear on the **Plugins** card. +Two switches, **Let members add plugin marketplaces** and **Let members add their own plugins**, control whether members can also add plugins of their own in Claude Desktop, as described under [Integrations](/docs/government/config/settings#member-added-plugins-and-marketplaces) in Available settings. Both are off by default. Plugins that members add are separate from the ones you add and do not appear on the **Plugins** card. ## Where plugins are added -Plugins are added at the tenant or organization level. Plugins the tenant adds flow to every organization and appear on each organization's **Plugins** card under **From levels above**, as described under [Tool and connector cards](/docs/government/config/settings#tool-and-connector-cards). A tenant administrator can lock the plugin list, which makes it read-only for organizations, following the lock behavior in [How Config works](/docs/government/config/overview#locks). [Group levels](/docs/government/config/overview#group-specific-settings) inherit the plugins of their tenant or organization, so the **Plugins** card is read-only when you view a group. +Plugins are added at the tenant or organization level. Plugins the tenant adds flow to every organization and appear on each organization's **Plugins** card under **From levels above**. A tenant administrator can lock the plugin list, which makes it read-only for organizations, following the lock behavior in [How Config works](/docs/government/config/overview#locks). [Group levels](/docs/government/config/overview#group-specific-settings) inherit the plugins of their tenant or organization, so the **Plugins** card is read-only when you view a group. ## Update or remove a plugin To update a plugin, upload the new version's archive. Because its name matches the plugin you added, the upload updates that plugin, the preview marks the update before you save, and members who have the plugin receive the new version automatically. -To remove a plugin, click its remove icon and save the change. Removing a plugin stops delivering it, and there is not currently a way to uninstall a plugin remotely from members' devices, so members who already installed it keep their copy until they remove it themselves, as described under [Tool and connector cards](/docs/government/config/settings#tool-and-connector-cards). +To remove a plugin, click its remove icon and save the change. Claude for Government stops delivering the plugin, and Claude Desktop removes it for members who have it the next time it [syncs your organization's plugin list](#install-behavior). After that sync the plugin's hooks no longer run. A new chat cannot use the plugin's skills or commands, but a chat the member was using at the time can still use them. ## Connector tool policies for members diff --git a/content/claude/government/config/settings.md b/content/claude/government/config/settings.md index b2bc065a55..cadcfe05a2 100644 --- a/content/claude/government/config/settings.md +++ b/content/claude/government/config/settings.md @@ -4,273 +4,168 @@ # Available settings -> Reference for the product settings on the Config page in Claude for Government, including session timeout, maximum session length, organization instructions, telemetry, automatic updates, Claude Desktop banner, product availability, member-added plugins, member skill creation, and the tool and connector cards. +> Config page settings in Claude for Government, such as session timeouts, network and folder access, tool approvals, connectors, plugins, telemetry, and updates. > **Who this is for:** Tenant administrators and organization owners who set product behavior for the people they manage. -This page describes the settings on the **Config** page in the admin portal. Each setting is written once here and can be set at both the tenant and organization level unless noted otherwise. For how the levels combine, what locking does, and how to compare and preview, see [How Config works](/docs/government/config/overview). +Find each setting on the **Config** page in the admin portal under its category in that page's sidebar. Each setting can be set at both the tenant and organization level unless noted otherwise. To set a value for a directory group, see [Group-specific settings](/docs/government/config/overview#group-specific-settings). For how the levels combine, what locking does, when a change reaches members, and how to compare and preview, see [How Config works](/docs/government/config/overview). -## Settings list +Where **Applies to** gives a version, earlier versions ignore the setting. The **Config** page can show settings that are not listed here. -### Session idle timeout +## Product availability -Controls how long a member can stay inactive before being signed out. The value must be a whole number of minutes from 15 to 5,760 (96 hours), and the default is 1,440 minutes (24 hours) until your tenant sets a value. This is a restriction, so organizations and groups can only set a shorter timeout than the tenant. +These switches control which Claude products and features are available to members. -### Maximum session length +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Claude Desktop** | Makes Claude Desktop available. | On | Claude Desktop | +| **Claude Desktop home** | Chooses what members see in Claude Desktop: **Standard**, **Simple**, **Chat only**, or **Off**. **Separate settings** leaves it to the Chat, file analysis, and Cowork switches. | **Separate settings** | Claude Desktop 1.52386.0 or later | +| **Chat in Claude Desktop** | Lets members chat with Claude in Claude Desktop, for quick questions and drafting. Without Chat, members cannot open their existing chats. | On | Claude Desktop | +| **Advanced file analysis in Chat** | Lets Claude run code in a sandbox for data analysis in Chat. Only takes effect where **Shell commands** and **Chat in Claude Desktop** are both on. Without this setting, Claude cannot read Word, Excel, or PowerPoint files that members attach in Chat. | On | Claude Desktop | +| **Cowork in Claude Desktop** | Lets members give Claude longer tasks, such as research, analysis, and drafting documents, which it works through on its own in Claude Desktop. Without Cowork, members cannot continue their Cowork tasks. | On | Claude Desktop | +| **Code in Claude Desktop** | Lets members use Claude Code inside Claude Desktop to write and run code. Without Code, members cannot open their existing Code sessions. | On | Claude Desktop | +| **Scheduled tasks** | Lets members set up [tasks that Claude runs on a schedule](/docs/third-party/claude-desktop/configuration#scheduledtasksenabled). Turning it off also turns off scheduling in Claude Code, such as `/loop`. | On | Claude Desktop 2.110.0 or later, Claude Code | +| **Claude Code** | Makes the [Claude Code command-line tool](/docs/government/deploy-claude-code/configure) available. | Off | Claude Code | +| **Claude for Microsoft 365** | Makes [Claude for Microsoft 365](/docs/government/deploy-microsoft-365/configure), the add-in for Excel, Word, and PowerPoint, available. | Off | Claude for Microsoft 365 | -Controls how long a member can stay signed in before they have to sign in again, even if they are active the whole time. The value must be a whole number of minutes from 60 to 525,600 (365 days), and by default there is no maximum. The maximum is an absolute limit on a session's lifetime that is independent of the session idle timeout, and a session ends as soon as it reaches either limit. This is a restriction, so each level can set or shorten the maximum but not lengthen it past what the level above allows, and the value that takes effect is always the shortest one in the chain. +Turning off **Claude Desktop**, **Claude Code**, or **Claude for Microsoft 365** stops the members the setting applies to from using that application. An organization cannot turn on a product that the tenant has turned off. These switches turn applications off, not accounts, and are not a security boundary: to cut one member off from everything at once, deactivate their account (see [Deactivated users](/docs/government/org-admin/users#deactivated-users)). -A shorter maximum, or a new maximum where there was none before, also applies to members who are already signed in. Open sessions pick up the change while the member is active rather than instantly, so allow up to one session idle timeout period (24 hours by default) for it to reach everyone who is currently signed in. Any session that has not picked it up by then has already expired from inactivity. The maximum always counts from when the member originally signed in, so a session that is already older than the new maximum ends when it picks up the change and the member is prompted to sign in again. A longer maximum, or removing the maximum set at your level by clearing the value or resetting the setting, applies only at each member's next sign-in. Sessions that are already open keep the limit they already have, and raising or removing the maximum does not restore sessions that a shorter value has already shortened or ended. +The **Claude Desktop home** row appears once your agency has access to it, and it then holds the Chat, Advanced file analysis, and Cowork switches. A choice other than **Separate settings** overrides those switches, unless a level above has locked one. If you choose **Off**, keep Code turned on, or Claude Desktop has nothing to open. Under **Separate settings**, if Chat, Cowork, and Code are all turned off, Claude Desktop keeps Cowork on. -When a session ends because it reached the maximum, the member signs in again, just as they do after the idle timeout. Your identity provider decides whether that sign-in asks the member to authenticate again (for example with a password, a multi-factor prompt, or a PIV card) or passes them straight through, according to its own session and re-authentication policy. Examples of that policy are the sign-in frequency control in Microsoft Entra Conditional Access and authentication policies in Okta. If you want members to authenticate again when they sign back in after reaching the maximum, set your identity provider's re-authentication interval to no longer than the maximum session length. +## Sessions and access -### Let organizations manage their own seat tiers +These settings cover session limits, the network hosts and folders Claude Desktop may use, and Claude for Microsoft 365 features. -Controls whether organization owners may create and edit self-managed seat tiers on the [Tiers](/docs/government/org-admin/seat-tiers) page, in addition to the Anthropic-managed ones. Only tenant administrators can change this setting; it is always read-only at the organization level, and organization owners cannot grant themselves the capability. When it is off, the **New seat tier** button and the edit and delete controls on the Tiers page are hidden, and the **Reset usage limits** action on the [Users](/docs/government/org-admin/users) page is also unavailable. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Session idle timeout** | How long a member can stay inactive before being signed out, from 15 to 5,760 minutes (96 hours). Organizations and groups can only set a shorter timeout than the tenant. | 1,440 minutes (24 hours) | All products | +| **Maximum session length** | The longest a member can stay signed in, even while active, before they have to sign in again, from 60 to 525,600 minutes (365 days). Each level can set or shorten the maximum but not lengthen it past what the level above allows. | No maximum | All products | +| [**Allowed network hosts**](#allowed-network-hosts) | A list of hostnames that tools in Claude Desktop may reach, for example to install packages or fetch web pages. | **Claude connection only** | Claude Desktop | +| **IPv6 in the sandbox** | Lets tools in the sandbox [reach IPv6-only hosts](/docs/third-party/claude-desktop/configuration#coworkvmipv6enabled) through the computer's own IPv6 connection. **Allowed network hosts** still applies. | Off | Claude Desktop 1.52386.0 or later on macOS and Windows | +| [**Allowed workspace folders**](#allowed-workspace-folders) | Which folders members can pick as a project folder in Claude Desktop. | **Any folder** | Claude Desktop | +| **Block reads outside workspace folders** | Stops Claude's file tools in Code sessions in Claude Desktop from reading files outside the session's project folder and any folders listed in **Allowed workspace folders**. Its effect on the shell commands Claude runs [differs by operating system](/docs/third-party/claude-desktop/code#applied-as-managed-policy). | Off | Claude Desktop 1.46388.1 or later | +| **Attach files to chat**, on the **Microsoft 365 features** card | Lets members attach files to chat by picking, dragging, or pasting them. | On | Claude for Microsoft 365 | +| **Accept all edits**, on the **Microsoft 365 features** card | Lets members switch to **Accept all edits**, where Claude makes most edits to the open file without asking. Turning it off also turns off **Skip all permissions**. | On | Claude for Microsoft 365 | +| **File access rules (Microsoft 365)** | Rules that block Claude on files with chosen Microsoft sensitivity labels, or block attaching them. A rule can **Block** matching files or **Allow only matching files**. If the add-in cannot read a file's label, the file counts as blocked for every feature that has a rule covering it. | None | Claude for Microsoft 365 | +| **Request headers (Claude for Microsoft 365)** | Extra headers Claude for Microsoft 365 sends with each request to Claude. Each member's add-in receives them. Headers are hidden after you save them. | None | Claude for Microsoft 365 | -> [!NOTE] -> -> **Set at the tenant level only.** This setting is read-only for organization owners. +**Maximum session length** always counts from when the member originally signed in, so a session that is already older than the new maximum ends when it [picks up the change](/docs/government/config/overview#when-changes-take-effect) and the member is prompted to sign in again. Your identity provider decides whether that sign-in asks the member to authenticate again or passes them straight through. -### Compliance API - -Controls whether the [Compliance API](/docs/government/org-admin/compliance-api) is available. When it is off, organization owners and tenant administrators cannot create new keys and every request to the API returns an error, including requests made with keys that were valid before. Listing and revoking existing keys remains available even when this is off, so that an exposed key can still be revoked. - -> [!NOTE] -> -> **Set at the tenant level only.** This setting is read-only for organization owners. - -### Organization instructions - -Instructions that Claude follows for everyone in your organization, in every product: Claude Desktop (Chat, Cowork, and Code), the Claude Code command-line tool, and Claude for Microsoft 365. Use them for rules that should apply to every conversation, such as compliance requirements, data handling, or formatting standards. Enter the instructions as plain text. - -A change takes effect from each member's next message, including in conversations that are already open, and needs no application update or restart. Members do not see the instructions in their applications. Instructions set at the organization level replace the tenant's instructions for that organization rather than adding to them, so repeat anything from the tenant level that should still apply. A tenant administrator who wants the same instructions in every organization can set them at the tenant level and [lock](/docs/government/config/overview#locks) the setting. - -Organization instructions guide how Claude responds, and they are not an enforced restriction. To restrict what Claude can do, for example which network hosts it can reach, use **Allowed network hosts** and the other settings on this page. - -> [!NOTE] -> -> **Set at the tenant and organization levels only.** This setting cannot be set for a group. - -### Telemetry endpoint - -The base address of the collector where Claude applications send usage telemetry using the [OpenTelemetry](https://opentelemetry.io/) protocol (OTLP), for example `https://otel-collector.example.gov:4318`. Each application appends the OTLP request paths it uses, such as `/v1/logs` and `/v1/metrics`, so enter the address without those suffixes. Leaving the value empty disables telemetry. - -The value must begin with `https://` and may include a port and a path prefix. Its host must be a hostname or a private-network address, and a public IP address is refused. - -Point this address at a receiver that accepts OTLP over HTTP in both its protobuf and JSON encodings. An [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) does this by default and conventionally listens for OTLP over HTTP on port 4318. If your logging or SIEM platform accepts only its own HTTP ingestion format, run an OpenTelemetry Collector that receives OTLP and forwards to that platform, and enter the collector's address here. - -Each application connects to this address from the member's device rather than through the Claude for Government service. The collector must therefore be reachable from your members' networks and must present a TLS certificate that their operating system trusts. - -Members pick up a new or changed endpoint the next time they start Claude Desktop. Once a member has signed in and the app has loaded their configuration from Claude for Government, it takes its telemetry settings from that configuration alone and ignores telemetry keys set on the device itself, such as the `otlp*` keys in the Claude Desktop [configuration reference](/docs/third-party/claude-desktop/configuration). From then on your collector receives OpenTelemetry logs and metrics for each member's Claude Desktop activity under three `service.name` values: - -* `cowork` for Chat and Cowork activity -* `claude-code-desktop` for Code sessions -* `claude-desktop` for events from the application itself, errors only by default - -Each conversation turn produces events such as `user_prompt`, `api_request`, and `tool_result` that record the model, token counts, durations, and tool names. Every record from Claude Desktop carries the member's sign-in email address as the `enduser.id` resource attribute and their operating-system login name as `process.owner`. Message text, file contents, and tool output are included only for the categories you select in **Telemetry content capture**. See the [event reference in Monitoring](/docs/cowork/monitoring#events) for each event's attributes. - -> [!NOTE] -> -> On Claude Desktop versions earlier than 1.37937.0, and for a member who has not signed in again since updating to that version or later, `enduser.id` carries the operating-system login name. - -Claude Desktop keeps working when the collector refuses requests or cannot be reached, and members see no error. To confirm telemetry is arriving, check your collector's own request logs or metrics for requests to `/v1/logs` after a member has restarted Claude Desktop and sent a message. - -Claude for Microsoft 365 and the Claude Code command-line tool send their records to the same collector, each under its own `service.name`, and identify the member by their sign-in email address as `user.email`: - -* `office-agent` for Claude for Microsoft 365. The add-in sends its telemetry from the add-in pane, a web page loaded from your Claude for Government host, so the collector must also accept [cross-origin requests from that host](/docs/government/deploy-microsoft-365/configure#before-you-begin). See [What the collector receives](/docs/office-agents/opentelemetry#what-the-collector-receives) for the add-in's records and their attributes. -* `claude-code` for the Claude Code command-line tool. See [Monitoring](https://code.claude.com/docs/en/monitoring-usage) in the Claude Code documentation for its records and their attributes. - -### Telemetry headers - -Headers sent with every telemetry request, typically the credential your collector requires. Each member's app receives these headers and sends its telemetry directly, so use a credential that can only send data to your collector. Leave the setting empty if your collector does not require one. Because the value may contain a secret, it is never displayed after you save it; you see only that it is set. - -Click **Add header**, then enter the header's name and value, for example `Authorization` and `Bearer `, and add a row for each additional header. A value can contain spaces and `=` characters, but not a comma. Because saved headers are hidden, the headers you enter later replace all of the saved ones when you save, so enter every header again when you add or change one. - -### Telemetry content capture - -The content that Claude applications add to the telemetry they send to your collector, chosen from **Prompts**, **Claude's responses**, **Tool inputs**, **Tool results**, and **Full requests and responses**. Nothing is selected by default, so the export records activity such as models, token counts, durations, and tool names without any message or tool text. - -**Tool results** content is delivered only while **Telemetry traces** is on. Captured content goes only to your collector and is never sent to Anthropic. [Content capture](/docs/third-party/claude-desktop/telemetry#content-capture) in the Claude Desktop telemetry reference shows what each category adds. - -### Application event level (Claude Desktop) - -How much of Claude Desktop's own event log goes to your collector, in addition to the usage telemetry from Chat, Cowork, and Code. These records arrive under the `claude-desktop` service name. The default, **Errors only**, sends failures such as a crash or a request that could not complete. **Off** sends no application events while usage telemetry is still sent, the two levels between **Errors only** and **Debug** add warnings and then routine events such as sign-in, updates, and settings changes, and **Debug** adds verbose diagnostic events for use while troubleshooting with support. At **Informational** and **Debug**, the application events also include each conversation's title. The title text is sent only when **Prompts** is selected in **Telemetry content capture**. - -### Telemetry resource attributes - -Labels added to every telemetry record sent to your collector, such as your agency or environment name, so the collector can tell where each record comes from. Click **Add attribute**, then enter the attribute's name and value, for example `deployment.environment` and `production`. Attribute names are case-sensitive. A value can be up to 255 characters long when it uses only English letters, digits, and the characters `-`, `.`, `_`, and `~`. Any other character counts as three or more, so a space counts as three and an accented letter such as `é` counts as six. A list set at a more specific level, such as an organization, replaces the whole list inherited from the level above rather than adding to it, so repeat any attributes that should still apply. - -### Telemetry traces - -When on, each application also sends traces to the `/v1/traces` path of the address in **Telemetry endpoint**, so your monitoring tools can follow the events of one request together. The setting is off by default and is in beta. Traces carry message and tool content only for the categories selected in **Telemetry content capture**. For what a trace contains, see [Traces](/docs/third-party/claude-desktop/telemetry#traces-beta) for Claude Desktop and the [span reference](/docs/office-agents/opentelemetry#span-reference) for Claude for Microsoft 365. - -> [!NOTE] -> -> In Claude Desktop, **Telemetry traces** requires version 1.22209.0 or later. Earlier versions ignore the setting. - -### Block automatic updates - -Stops Claude Desktop on macOS and Windows from downloading and installing updates automatically. It is off by default, so Claude Desktop keeps itself updated on those systems. Turn it on only if your agency distributes Claude Desktop updates itself, and [lock](/docs/government/config/overview#locks) it if the levels below yours should not be able to turn updates back on. - -Claude Desktop applies this setting once a member has signed in and the app has loaded their configuration from Claude for Government. With that configuration loaded, the app follows this setting even when it is off, so a `disableAutoUpdates` value in the device's configuration profile does not stop a signed-in member's app from updating. When the app starts without a signed-in member, for example on a newly deployed device or when a member has to sign in again because their session expired, it follows the profile value instead, if one is set. To make sure macOS and Windows devices never update themselves, turn this setting on and also have your IT administrators set `disableAutoUpdates` in the profile, as described under [Automatic updates](/docs/government/deploy-desktop/configure#automatic-updates) on the Connect Claude Desktop to Claude for Government page. - -On Linux, apt installs Claude Desktop updates, and neither **Block automatic updates** nor `disableAutoUpdates` changes them. To keep Linux devices on the versions your agency distributes, follow the Linux steps under [Automatic updates](/docs/government/deploy-desktop/configure#automatic-updates). - -### Restart deadline for updates - -How long a member can put off restarting Claude Desktop to install an update that the app has downloaded, as a whole number of hours from 1 to 72. When the deadline passes, the app restarts to install the update without waiting for the computer to be idle. Leave the value empty to allow 72 hours, after which the app restarts only once the computer is idle. While **Block automatic updates** is on, this setting has no effect, because the app downloads no updates. - -> [!NOTE] -> -> Members who are running Claude Desktop when you change **Block automatic updates** or **Restart deadline for updates** may need to restart the app to pick up the change. - -### Restart deadline for configuration changes - -How long a member can put off restarting Claude Desktop after the app detects a configuration change, as a whole number of hours from 0 to 336 (14 days). When the deadline passes, the app shows a restart dialog that the member cannot dismiss, and restarts on its own once the member has been inactive for 2 minutes and Claude has no task in progress. A value of 0 requires the restart as soon as the app detects the change. Leave the value empty to allow 24 hours. - -### Claude Desktop banner - -A persistent banner shown at the top of Claude Desktop. You can set the text, colors, and an optional link, and preview the result as you edit. Banner text may be up to 200 characters, leading and trailing spaces are rejected, colors must be valid hex codes, and the link (if set) must begin with `https://`. An empty banner is valid and simply hides it. - -The system-use notification shown at sign-in is separate from this banner. It is fixed text and cannot be edited. Use the Claude Desktop banner setting if you need a configurable message inside the application. - -### Show the Claude for Government Web import banner - -Shows a banner on Claude Desktop's home screen inviting members to [import their conversations and projects from Claude for Government Web](/docs/government/desktop/import). Members see the banner only in organizations where Anthropic has enabled the import. The switch is off by default. - -> [!NOTE] -> -> **Show the Claude for Government Web import banner** applies to Claude Desktop 2.9939.2 and later. Earlier versions ignore the setting. - -### Product availability - -A group of separate switches that control which Claude products and features are available to members. Each switch appears as its own row: **Claude Desktop**, **Chat in Claude Desktop**, **Advanced file analysis in Chat**, **Cowork in Claude Desktop**, **Code in Claude Desktop**, **Scheduled tasks**, **Claude Code**, and **Claude for Microsoft 365**. These switches are on by default, except for **Claude Code** and **Claude for Microsoft 365**. - -Turning off **Claude Code** or **Claude for Microsoft 365** stops the members the setting applies to from using that application. Turning off **Claude Desktop** stops the app from receiving your organization's settings. These switches turn applications off, not accounts, and are not a security boundary: to cut one member off from everything at once, deactivate their account (see [Deactivated users](/docs/government/org-admin/users#deactivated-users)). Turning off any of the other switches removes that feature from Claude Desktop, as described below. - -The **Chat in Claude Desktop**, **Cowork in Claude Desktop**, and **Code in Claude Desktop** switches each make one part of the app available to members. Chat is for simple conversations, Cowork is for longer tasks that Claude works through on its own in a local workspace folder, and Code is for software development. The **Claude Code** switch is separate and applies to the standalone Claude Code command-line tool. To set up Claude Code on agency devices, see [Connect Claude Code to Claude for Government](/docs/government/deploy-claude-code/configure). - -When Chat and Cowork are both available, Claude Desktop presents them together as **Home** in its sidebar, next to **Code**. From Home, a member chooses **Chat** or **Cowork** in the message box, and the sidebar lists their chats and tasks together. - -Turning a switch off also changes this layout. For example, with **Chat in Claude Desktop** off, the sidebar shows **Cowork** in place of Home and the message box offers no choice, and with **Cowork in Claude Desktop** off, the message box offers Chat only. If Chat, Cowork, and Code are all turned off, Claude Desktop keeps Cowork on. - -> [!NOTE] -> -> This layout applies to Claude Desktop 1.26832.0 and later. Earlier versions show **Chat**, **Cowork**, and **Code** as three separate tabs, controlled by the same switches. - -The **Claude Desktop home** setting chooses what members see in Claude Desktop. **Standard** gives them Chat with file analysis, plus Cowork. **Simple** gives them Chat with file analysis, without Cowork. **Off** gives them neither, which leaves only Code. If you choose **Off**, keep Code turned on, or Claude Desktop has nothing to open. While the setting has a value, it overrides the separate Chat, file analysis, and Cowork switches, including a directory group's. By default it is not set, and those switches apply. - -> [!NOTE] -> -> **Claude Desktop home** needs Claude Desktop 1.52386.0 or later. Earlier versions ignore it and follow the switches. - -The **Scheduled tasks** switch controls whether members can set up tasks that Claude runs on a schedule. With it off, Claude Desktop hides the pages for them, Claude cannot schedule anything in the app, and tasks members already set up are kept but do not run. - -> [!NOTE] -> -> **Scheduled tasks** needs Claude Desktop 2.110.0 or later. Earlier versions ignore it. - -### Claude Code - -The **Claude Code** section of the **Config** page holds your organization's settings for Claude Code. Claude for Government delivers them to the command-line tool after a member signs in, and in Claude Desktop 2.9939.2 or later they can also reach Code sessions. While Claude Code is in [early access](/docs/government/deploy-claude-code/configure), the section appears once your agency has access. - -* **Blocked shell commands**: command names, such as `curl` or `ssh`, that Claude Code never runs with its Bash and PowerShell tools. None are blocked by default. -* **Managed hooks**: hooks that run in every member's Claude Code sessions, such as a command that writes an audit record after each tool use. None are set by default. -* **Member-added hooks**: whether hooks and custom status lines that members set up in their own or their projects' settings run as well. **Blocked** by default. Managed hooks still run, and in Claude Desktop so do hooks inside plugins. -* **Plugin sources**: where members can install Claude Code plugins from, one of **None**, **Approved sources only** with an **Approved plugin sources** list, or **Any source** with a **Blocked plugin sources** list. **None** by default. The two switches under [Member-added plugins and marketplaces](#member-added-plugins-and-marketplaces) narrow **Any source**. While **Let members add plugin marketplaces** is off, members install only from the **Approved plugin sources** list. While **Let members add their own plugins** is off, they cannot add a source of their own from a file or folder on their machine. -* **Sideloaded plugins**: whether members can load plugins, agents, or connector files with a command-line flag. **Blocked** by default. -* **Minimum Claude Code version**: Claude Code below this version does not start and tells the member to update. No minimum by default. -* **Maximum Claude Code version**: Claude Code above this version does not start. No maximum by default. -* **Opening from the browser**: whether links in web pages and editors can open Claude Code with a prompt filled in. **Blocked** by default. -* **Shell command sandbox**: whether members' shell commands run inside Claude Code's sandbox. The default, **Claude Code default**, leaves that to Claude Code's own settings. **Off** runs the commands without the sandbox, for workspaces where it cannot start, such as containers. - -Related controls sit outside this section. Under [Tool and connector cards](#tool-and-connector-cards), the **Shell commands**, **Web fetch**, and **Web search** cards turn a whole tool off for Claude Code or make it ask every time. The **Member-added connectors** setting on the **Connectors** card sets which other connectors members can use in Claude Code, beyond web search and the ones you add there: **None** (the default), **Only these**, or **Any connector**. In Claude Desktop 2.2553.0 or later it also governs connectors delivered inside plugins: a remote one connects under **Any connector** or when its address is listed under **Only these**, and a local MCP server does not start under **None** or **Only these**. [Bypass-permissions mode and Auto mode](#bypass-permissions-mode-and-auto-mode) apply to Claude Code as described there. Under [Product availability](#product-availability), **Scheduled tasks** also turns off scheduling in Claude Code, such as `/loop`. - -Connectors you add on the **Connectors** card reach the Claude Code command-line tool when you tick **Claude Code** under **Apply to**, as [Connectors](/docs/government/connectors/overview) describes. - -### Bypass-permissions mode and Auto mode - -**Bypass-permissions mode** controls whether members can start Claude Code in bypass-permissions mode, which skips permission prompts. **Auto mode** controls whether members can switch the Claude Code command-line tool, and Cowork and Code in Claude Desktop, to Auto mode, in which Claude approves routine actions itself and still asks about risky ones; when it is **Allowed**, new Code sessions in Claude Desktop 2.9939.2 or later and new interactive sessions in the Claude Code command-line tool 2.1.283 or later start in it on models that support Auto mode, unless another mode is chosen. Both are **Blocked** by default. Both settings appear on the **Config** page, and take effect, together with the [**Claude Code**](#claude-code) section. - -### Member-added plugins and marketplaces - -Two switches that control whether members can add plugins of their own in Claude Desktop. **Let members add plugin marketplaces** lets members add plugin marketplaces and install plugins from them. **Let members add their own plugins** lets members upload plugin files or have Claude create a plugin for them. Both switches are off by default. - -While a switch is off, Claude Desktop hides the corresponding controls from members. Plugins that members uploaded or created earlier keep working. Marketplaces that members added earlier are hidden while **Let members add plugin marketplaces** is off. - -> [!NOTE] -> -> Hiding marketplaces that members added earlier needs Claude Desktop 2.16120.0 or later. - -### Let members add their own connectors - -Controls whether members can add connectors of their own in Claude Desktop, as local MCP servers under **Settings**, then **Developer**. The **Let members add their own connectors** switch is off by default. It sets Claude Desktop's [`isLocalDevMcpEnabled`](/docs/third-party/claude-desktop/configuration#islocaldevmcpenabled) key. While the switch is off, Claude Desktop ignores connectors that members already added under **Developer**. +### Allowed network hosts -### Let members create skills +The list covers [web fetch and shell commands](/docs/third-party/claude-desktop/configuration#coworkegressallowedhosts) in Chat and Cowork, and the [sandboxed shell commands](/docs/government/security/security-and-data-handling#code-in-claude-desktop) of Code sessions on macOS and Linux. Web search, connectors, and the app's own connections do not use this list. -Controls whether members can create or upload skills of their own. The **Let members create skills** switch is on by default. +Entries are hostnames or wildcard patterns such as `*.example.com`, and match by name, not by the address a name resolves to. -While the switch is off, members cannot create new skills or upload skill files, and Claude does not offer to create or update skills in conversations. Skills that members already made, skills your organization provides, and built-in skills keep working. +### Allowed workspace folders -### Allowed network hosts +Check **Block all workspace folders** to allow none, in which case Claude can still work in Chat and Cowork in folders it creates inside its own sandbox. Subfolders of a listed folder are included. The setting does not stop the shell commands Claude runs in a Code session from reading files elsewhere on the device, and [Code in Claude Desktop](/docs/government/security/security-and-data-handling#code-in-claude-desktop) describes what confines those commands on each operating system. -A list of hostnames that tools in Claude Desktop may reach, for example to install packages or fetch web pages. This covers the tools Claude uses during Cowork tasks, web fetch in Chat, and the sandboxed shell commands of Code sessions on macOS and Linux. For how the list applies to Code sessions on each operating system, see [Code in Claude Desktop](/docs/government/security/security-and-data-handling#code-in-claude-desktop). The connection to Claude is always allowed and does not need to be listed. An empty list shows as **Claude connection only**. Use **Add package registries** to add npm, PyPI, GitHub, crates.io, and other common registries so that Claude can install libraries; hosts added this way appear together as a single **Package registries** pill with a count. +* **Windows and Mac**: a list with only Windows entries leaves Mac users with no allowed folder, so include a Mac path as well, or one that starts with `~`, which stands for each member's home folder on both Windows and Mac. +* **Synced folders**: on Windows, `~/Documents` refers to the local Documents folder in the user profile, not one redirected to OneDrive. For that one, use [a variable](/docs/third-party/claude-desktop/configuration#allowedworkspacefolders) such as `%OneDriveCommercial%` or `%OneDrive%`. For Code sessions and other work that creates many files, consider listing a local folder that is not synced, such as `~/ClaudeWork`. -Entries are hostnames or wildcard patterns such as `*.example.com`, which matches subdomains at any depth but not `example.com` itself, so list both if you need both. The list does not accept IP addresses or ports, and unless you allow all traffic with a `*` entry, the tools this list covers cannot reach a destination by its IP address. Web search, connectors, and the app's own connections, such as sign-in, updates, and telemetry export, do not use this list. Web fetch refuses localhost and private-network addresses regardless of what the list contains. Because entries match by name, a hostname you list is reachable even when it resolves inside your network, so treat the list as one layer alongside your own network controls. +## Claude Code -### Allowed workspace folders +Claude for Government delivers these settings to the command-line tool after a member signs in, and in Claude Desktop 2.9939.2 or later they can also reach Code sessions. While Claude Code is in [early access](/docs/government/deploy-claude-code/configure), the section appears once your agency has access. -Controls which folders members can pick as a project folder in Claude Desktop, and where Claude can read and write files. Leave it unset to allow any folder. Add folder paths to limit members to those locations, or check **Block all workspace folders** to allow none, in which case Claude can still work in Chat and Cowork in folders it creates inside its own sandbox. A Code session starts only in a folder this setting permits and Claude's file tools stay inside the permitted folders, but the setting does not stop the shell commands Claude runs in a Code session from reading files elsewhere on the device, and [Code in Claude Desktop](/docs/government/security/security-and-data-handling#code-in-claude-desktop) describes what confines those commands on each operating system. You can list Windows and Mac paths together, and each device uses only the paths for its platform. An unset value shows as **Any folder** and an empty list shows as **No folders**. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Blocked shell commands** | Command names, such as `curl` or `ssh`, that Claude Code applies as [deny rules](https://code.claude.com/docs/en/permissions#bash) for its Bash and PowerShell tools. | None blocked | Claude Code | +| **Managed hooks** | [Hooks](https://code.claude.com/docs/en/hooks) that run in every member's Claude Code sessions, such as a command that writes an audit record after each tool use. | None | Claude Code | +| **Member-added hooks** | Whether hooks and custom status lines that members set up in their own or their projects' settings run as well. Managed hooks still run, and in Claude Desktop so do hooks inside plugins. | **Blocked** | Claude Code | +| **Plugin sources** | Where members can install Claude Code plugins from, one of **None**, **Approved sources only** with an **Approved plugin sources** list, or **Any source** with a **Blocked plugin sources** list. | **None** | Claude Code | +| **Sideloaded plugins** | Whether members can load plugins, agents, or connector files with a command-line flag. | **Blocked** | Claude Code command-line tool | +| **Minimum Claude Code version** | Claude Code below this version does not start and tells the member to update. | No minimum | Claude Code | +| **Maximum Claude Code version** | Claude Code above this version does not start. | No maximum | Claude Code | +| **Opening from the browser** | Whether Claude Code sets itself up to open from links in web pages and editors, with a prompt filled in. | **Blocked** | Claude Code | +| **Shell command sandbox** | Lets you turn off [Claude Code's sandbox](/docs/government/security/security-and-data-handling#code-in-claude-desktop) for workspaces where it cannot start, such as containers. | **Claude Code default**, which leaves that to Claude Code's own settings | Claude Code | -Write each entry as an absolute path. A path can start with `~`, which stands for each member's home folder on both Windows and Mac; write these with forward slashes, for example `~/ClaudeWork`, and they resolve on both platforms. A path can also use one of the per-user variables `%OneDrive%`, `%OneDriveCommercial%`, `%OneDriveConsumer%`, `%APPDATA%`, `%LOCALAPPDATA%`, and `%USERNAME%`. A device ignores an entry whose variable it does not define, so a list with only Windows entries leaves Mac users with no allowed folder. Include a `~` path or a Mac path as well. Subfolders of a listed folder are included, Claude Desktop creates a listed folder that does not exist yet when a member opens the folder picker, and the picker opens in one of the listed folders. +Two switches under [Integrations](#integrations) narrow **Any source**: while **Let members add plugin marketplaces** is off, members install only from the **Approved plugin sources** list, and while **Let members add their own plugins** is off, they cannot add a source of their own from a file or folder on their machine. -If your agency redirects Desktop and Documents to OneDrive or another sync client, consider listing a local folder that is not synced, such as `~/ClaudeWork`, for Code sessions and other work that creates many files or scripts. Keep synced folders for documents and finished work. A member can start a Code session in any folder the list permits, synced or not. One list applies to Cowork and Code sessions alike, so ask members to choose the local folder when they start a Code session. To point at the synced Documents folder on Windows, use `%OneDriveCommercial%` or `%OneDrive%`, for example `%OneDriveCommercial%\Documents\ClaudeOutput`, because `~/Documents` refers to the local Documents folder in the user profile, not the redirected one. What the sync client uploads, including whether it skips particular file types, is controlled by your sync client's policies rather than by Claude for Government. +Settings in other categories govern Claude Code too, such as **Scheduled tasks** under [Product availability](#product-availability) and **Member-added connectors** under [Integrations](#integrations). -### Block reads outside workspace folders +## Claude behavior -Turn this on to stop Claude's file tools in Claude Desktop Code sessions from reading files outside the session's project folder and any folders listed in [**Allowed workspace folders**](#allowed-workspace-folders). The setting is off by default and sets Claude Desktop's [`blockReadsOutsideWorkingDirectories`](/docs/third-party/claude-desktop/configuration#blockreadsoutsideworkingdirectories) key. Its effect on the shell commands Claude runs differs by operating system, and that key's entry describes it. +This setting shapes how Claude responds. -> [!NOTE] -> -> **Block reads outside workspace folders** needs Claude Desktop 1.46388.1 or later. Earlier versions ignore it. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Organization instructions** | Instructions Claude follows for everyone in your organization, in every product. | None | All products | -### Microsoft 365 features +Organization instructions guide how Claude responds, and they are not an enforced restriction. Members do not see the instructions in their applications. Instructions set at the organization level replace the tenant's instructions for that organization rather than adding to them. A change takes effect from each member's next message. -The **Claude for Microsoft 365** switch under [Product availability](#product-availability) turns the add-in for Excel, Word, and PowerPoint on or off for members. The **Attach files to chat** switch on the **Microsoft 365 features** card, under **Sessions and access**, is on by default; turning it off stops members from attaching files to conversations in the add-in. +## Appearance -### File access rules (Microsoft 365) +These settings change what members see in Claude Desktop. -Rules for the Claude for Microsoft 365 add-in, under **Sessions and access**, that block its features depending on a file's Microsoft Purview sensitivity label. There are no rules by default. Click **Add rule**, then choose what the rule does (**Block**, or **Allow only matching files**), the **Feature** it governs, which files it **Applies to**, and one or more label conditions. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Claude Desktop banner** | A persistent banner shown at the top of Claude Desktop. | Off | Claude Desktop | +| **Show the Claude for Government Web import banner** | Shows a banner on Claude Desktop's home screen inviting members to [import their conversations and projects from Claude for Government Web](/docs/government/desktop/import). Members see the banner only in organizations where Anthropic has enabled the import. | Off | Claude Desktop 2.9939.2 or later | -When a rule blocks Claude on the open file, members see a "Claude is unavailable for this document" screen, and a blocked attachment is refused with a message that names the file. A file whose label the add-in cannot read counts as blocked for any feature that has a rule for that file type. +The system-use notification shown at sign-in is separate from the **Claude Desktop banner**. It is fixed text and cannot be edited. -## Tool and connector cards +## Integrations -Alongside the settings list, the Config page shows cards for the built-in tools (Web search, Web fetch, Shell commands, and Terminal panel tools), the built-in connector (Microsoft 365), a **Connectors** card for the ones you add yourself, and a **Plugins** card for plugin packages you upload. A connector is an integration that lets Claude reach an external service on a user's behalf. +The tool and connector cards and related settings cover connectors, plugins, and the tools Claude can use. -The **Web search** card controls whether Claude can search the web in Claude Desktop. It is off by default. When you turn it on you are shown a short description of how search works and asked to acknowledge it before the setting is saved. A **Require approval for each search** sub-setting sits below the toggle and becomes available once web search is on; it is on by default, and turning it off lets each member choose whether to approve every search or allow searches to run automatically. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Web search** | Lets Claude search the web. Turning it on asks you to acknowledge a short description of [how search works](/docs/government/security/security-and-data-handling#web-search-and-web-fetch). | Off | Claude Desktop, Claude Code | +| **Require approval for each search** | Asks the member to approve every search before it runs. When this is off, each member chooses whether to approve each search or allow searches automatically. | On | Claude Desktop, Claude Code | +| **Microsoft 365** | The Microsoft 365 connector, which is separate from the Claude for Microsoft 365 add-in, lets members reach [your agency's Microsoft 365 content](/docs/government/connectors/microsoft-365), including SharePoint, OneDrive, Outlook, and Teams, from Claude Desktop. Each member signs in with their own Microsoft account. | Off until you enter a **Tenant ID** and **Client ID** | Claude Desktop | +| **Connectors** | [Connectors](/docs/government/connectors/overview) that let Claude reach your systems. Each is defined once and applied to the products you choose. | None | All products | +| **Member-added connectors**, on the **Connectors** card | Which other connectors members can use in Claude Code, beyond web search and the ones you add: **None**, **Only these**, or **Any connector**. | **None** | Claude Code, Claude Desktop 2.2553.0 or later | +| **Blocked connectors**, under **Any connector** | Connectors that Claude Code does not connect. Entries by server URL also block plugins' servers in Claude Desktop. An entry by **Server name** matches [the name a connector is given](https://code.claude.com/docs/en/managed-mcp#how-servername-entries-match), not the server it reaches. | None | Claude Code, Claude Desktop 2.16120.0 or later | +| **Plugins** | [Plugin packages](/docs/government/config/plugins-and-connectors) you upload and deliver to members in Claude Desktop. | None | Claude Desktop | +| **Let members add plugin marketplaces** | Lets members add plugin marketplaces and install plugins from them. While it is off, it also narrows [**Plugin sources**](#plugin-sources) in Claude Code. Marketplaces that members added earlier are hidden while it is off, which needs Claude Desktop 2.16120.0 or later. | Off | Claude Desktop, Claude Code | +| **Let members add their own plugins** | Lets members upload plugin files or have Claude create a plugin for them. While it is off, it also narrows [**Plugin sources**](#plugin-sources) in Claude Code. Plugins that members uploaded or created earlier stay installed. | Off | Claude Desktop, Claude Code | +| **Let members add their own connectors** | Lets members add connectors of their own in Claude Desktop, as local MCP servers under **Settings**, then **Developer**. While the switch is off, Claude Desktop ignores connectors that members already added under **Developer**. | Off | Claude Desktop | +| **Let members create skills** | Lets members [create or upload skills](/docs/third-party/claude-desktop/configuration#skillcreationenabled) of their own. Skills that members already made keep working. | On | Claude Desktop, Claude for Microsoft 365 | +| **Web fetch** | Lets Claude fetch web pages. See [**Allowed network hosts**](#allowed-network-hosts). | On | Claude Desktop, Claude Code | +| **Require approval for each fetch** | Asks the member to approve every page fetch before it runs. When this is off, fetches in Chat and Cowork run without asking, and Code sessions follow [Claude Code's usual permission rules](https://code.claude.com/docs/en/permissions). | Off | Claude Desktop, Claude Code | +| **Shell commands** | Lets Claude run shell commands during tasks. Turning this off also turns off **Advanced file analysis in Chat**. | On | Claude Desktop, Claude Code | +| **Require approval for each command** | In Claude Desktop, asks the member to approve every shell command before it runs. When this is off, commands [can run without asking](/docs/government/security/security-and-data-handling#approvals-and-auto-mode). | Off | Claude Desktop, Claude Code | +| **Terminal panel tools** | Lets Claude run commands in the Code tab's Terminal panel in Claude Desktop. These commands [run as the user outside of Claude's sandbox](/docs/government/security/security-and-data-handling#code-in-claude-desktop). Turning off **Shell commands** turns these tools off as well. | On | Claude Desktop | +| **Bypass-permissions mode** | Whether members can use the mode that skips permission prompts: bypass-permissions mode in Claude Code, **Skip all permissions** in Claude for Microsoft 365. | **Blocked** | Claude Code, Claude for Microsoft 365 | +| **Auto mode** | Whether members can switch to [Auto mode](https://code.claude.com/docs/en/permission-modes). [Approvals and Auto mode](/docs/government/security/security-and-data-handling#approvals-and-auto-mode) says which sessions start in it. | **Blocked** | Claude Code, Claude Desktop | -Once you turn web search on, each member's Claude Desktop picks it up the next time the app starts and shows it in the message box's **+** menu, under **Connectors**, as a **Web Search** switch that the member can turn off for themselves. If one member has no **Web Search** switch after restarting Claude Desktop while others do, select [**Compare config across levels**](/docs/government/config/overview#comparing-settings-across-levels) at the top of the Config page and type the member's name into the search box to check whether another level, such as a [directory group](/docs/government/config/overview#group-specific-settings), turns web search off for them. If every level shows web search on, check whether that member's network is blocking it, as described in the troubleshooting table in [Connect Claude Desktop to Claude for Government](/docs/government/deploy-desktop/configure#troubleshooting). +* **Member-added connectors**: in Claude Desktop it also governs connectors delivered inside plugins. A plugin's connector can connect only under **Any connector** or when listed under **Only these**. +* **Member-added connectors**, **Bypass-permissions mode**, and **Auto mode**: these take effect once your agency has the [**Claude Code**](#claude-code) section. In Claude for Microsoft 365, **Bypass-permissions mode** instead takes effect once your agency has the [**Microsoft 365 features**](#microsoft-365-features) card. -The **Web fetch** card controls whether Claude can fetch web pages in Claude Desktop. It is on by default, and fetches are subject to the Allowed network hosts list above. A **Require approval for each fetch** sub-setting sits below the toggle. Turning it on asks the member to approve every page fetch before it runs; when it is off (the default), fetches in Chat and Cowork run without asking, and Code sessions follow [Claude Code's usual permission rules](https://code.claude.com/docs/en/permissions). +## Compliance and telemetry -The **Shell commands** card controls whether Claude can run shell commands during tasks in Claude Desktop. It is on by default, and turning it off also turns off Advanced file analysis in Chat. A **Require approval for each command** sub-setting sits below the toggle. Turning it on asks the member to approve every shell command before it runs; when it is off (the default), Cowork runs sandbox commands without asking, as does Chat on Claude Desktop 2.110.0 or later, and Code sessions follow [Claude Code's usual permission rules](/docs/government/security/security-and-data-handling#code-in-claude-desktop). On Claude Desktop versions earlier than 2.110.0, Chat asks before each command regardless of this setting. +These settings cover usage telemetry export to your own collector and Claude Desktop updates. -The **Terminal panel tools** card controls whether Claude can run commands in the Code tab's Terminal panel in Claude Desktop, and open, list, or stop its tabs. It is on by default, and turning off the **Shell commands** card turns these tools off as well. See [Code in Claude Desktop](/docs/government/security/security-and-data-handling#code-in-claude-desktop) for how those commands run. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| [**Telemetry endpoint**](#telemetry-endpoint) | The base address of your [OpenTelemetry](https://opentelemetry.io/) collector, such as `https://otel-collector.example.gov:4318`. Each product adds its own paths and sends its telemetry directly from members' devices, so the collector must be reachable from their networks. | Empty, which turns telemetry off | All products | +| **Telemetry headers** | Headers each product sends with every telemetry request, such as an Authorization header carrying your collector's token. Each member's app receives these headers and sends its telemetry directly, so use a credential that can only send data to your collector. | None | All products | +| **Telemetry content capture** | [Content](/docs/third-party/claude-desktop/telemetry#content-capture) each product adds to the telemetry it sends to your collector: **Prompts**, **Claude's responses**, **Tool inputs**, **Tool results**, and **Full requests and responses**. Captured content goes only to your collector and is never sent to Anthropic. | No content captured | All products | +| **Application event level (Claude Desktop)** | How much of [Claude Desktop's own event log](/docs/third-party/claude-desktop/configuration#otlpdesktoploglevel) is sent to your collector, in addition to usage telemetry: **Off**, **Errors only**, **Warnings and errors**, **Informational**, or **Debug**. | **Errors only** | Claude Desktop | +| **Telemetry resource attributes** | Labels added to every telemetry record each product sends, such as your agency or environment name, so your collector can tell where each record comes from. | Not set | All products | +| **Telemetry traces** (beta) | Adds [traces](/docs/third-party/claude-desktop/telemetry#traces-beta), so that the events of one request can be followed together. Traces carry message and tool content only for the categories selected in **Telemetry content capture**. | Off | All products; Claude Desktop 1.22209.0 or later | +| **Block automatic updates** | Stops Claude Desktop from downloading and installing updates automatically. Turn this on only if your organization distributes Claude Desktop updates itself. For devices where no member is signed in, and for Linux, see [Automatic updates](/docs/government/deploy-desktop/configure#automatic-updates). | Off | Claude Desktop on macOS and Windows | +| **Restart deadline for updates** | How long a member can put off restarting Claude Desktop to install a downloaded update, from 1 to 72 hours. | [Claude Desktop's default](/docs/third-party/claude-desktop/configuration#autoupdaterenforcementhours) | Claude Desktop | +| **Restart deadline for configuration changes** | How long a member can put off restarting Claude Desktop after the app detects a configuration change, from 0 to 336 hours (14 days). | [Claude Desktop's default](/docs/third-party/claude-desktop/configuration#relaunchenforcementhours) | Claude Desktop | -The **Microsoft 365** card lets members reach your agency's Microsoft 365 content, including SharePoint, OneDrive, Outlook, and Teams, from Claude Desktop. Each member signs in with their own Microsoft account. Enter the **Tenant ID** and **Client ID** from an application you register in Microsoft Entra, choose the **Azure cloud** your Microsoft tenant is in, and select which Microsoft Graph permissions to allow under **Access**. The connector is off while Tenant ID and Client ID are both blank. See [Set up the Microsoft 365 connector](/docs/government/connectors/microsoft-365) for the full walkthrough. +* **Telemetry headers**: the headers you enter replace all of the saved ones when you save, so enter every header again when you add or change one. +* **Telemetry content capture**: **Tool results** adds tool output only while **Telemetry traces** is on. **Full requests and responses** can carry tool output with traces on or off. +* **Application event level (Claude Desktop)**: at **Informational** and **Debug**, the application events also include each conversation's title, and the title text is sent only when **Prompts** is selected in **Telemetry content capture**. +* **Telemetry resource attributes**: a list set at an organization or group replaces the inherited list, so repeat any attributes that should still apply. -The **Connectors** card lists the Model Context Protocol servers you have added for your own systems. Each connector is defined once and applied to the products you choose. See the [Connectors](/docs/government/connectors/overview) page for how to add and manage them. +### Telemetry endpoint -The **Plugins** card lets you upload plugin packages and deliver them to members in Claude Desktop. A plugin bundles skills, slash commands, and sub-agents for Claude Desktop, and can also carry hooks and declare connectors; see [Manage plugins and connectors](/docs/government/config/plugins-and-connectors) for how each component behaves in Claude for Government and the [Plugins overview](/docs/plugins/overview) for what a plugin can contain. Plugins are delivered only to Claude Desktop. +Once a member has signed in and the app has loaded their configuration from Claude for Government, it takes its telemetry settings from that configuration alone and ignores any set on the device itself. Claude Desktop keeps working when the collector refuses requests or cannot be reached, and members see no error. For what the collector must accept, and how to confirm that telemetry is arriving, see [Collector endpoint and headers](/docs/third-party/claude-desktop/telemetry#collector-endpoint-and-headers). For Claude for Microsoft 365, the collector must also accept [cross-origin requests from your Claude for Government host](/docs/government/deploy-microsoft-365/configure#before-you-begin). -Click **Add plugins** and drop a `.zip` file. The file can be a single plugin package or a whole marketplace archive, for example the **Download ZIP** of a GitHub repository that holds several plugins. A preview shows each plugin's name, version, and description, and marks any plugin that declares components that can run code on the member's machine, for example hooks or an MCP server. In Claude for Government, a plugin's hooks run on the member's machine at defined points during a session, and Claude Desktop can start or connect to an MCP server the plugin declares. For those plugins, you confirm that you trust the package before it is added. See [Plugins that run code](/docs/government/config/plugins-and-connectors#plugins-that-run-code) for what the marker means and how these components behave in Claude for Government. +Each record [identifies the member](/docs/third-party/claude-desktop/telemetry#user-attribution). See what [Claude Desktop](/docs/cowork/monitoring#events), [Claude for Microsoft 365](/docs/office-agents/opentelemetry#what-the-collector-receives), and [Claude Code](https://code.claude.com/docs/en/monitoring-usage) send. -Each plugin you add appears as a row with an **Auto-install** or **Members choose** control. **Auto-install** installs the plugin for every member automatically, and **Members choose** makes it available for members to install themselves. Click the remove icon to queue a plugin for removal. Changes you make in these rows are staged: nothing is applied until you click **Save changes**, and **Discard** clears the pending changes. Plugins you add through the **Add plugins** dialog take effect as soon as you confirm them in that dialog. Removing a plugin stops delivering it, and members who already installed it keep their copy until they remove it themselves. +## Admin Console -At the organization level, plugins the tenant has added appear under a **From levels above** heading with an **Inherited from your tenant** badge. You can see them there but cannot change or remove them. Upload a plugin with the same name at your organization level to take priority over one. +Only tenant administrators can change **Let organizations manage their own seat tiers** and **Compliance API**, which are read-only for organization owners. -> [!TIP] -> -> The Claude for Government deployment may include additional settings that are not listed above. Any extra setting follows the same chain, status badges, and edit and reset behavior. +| Setting | What it does | Default | Applies to | +| - | - | - | - | +| **Let organizations manage their own seat tiers** | Lets organization owners create and edit self-managed seat tiers on the [Tiers](/docs/government/org-admin/seat-tiers) page, in addition to the Anthropic-managed ones. When it is off, the **Reset usage limits** action on the [Users](/docs/government/org-admin/users) page is also unavailable. | On | Admin Console | +| **Compliance API** | Controls whether the [Compliance API](/docs/government/org-admin/compliance-api) is available. When this is off, requests are refused and existing keys stay listed so you can revoke them. | On | Admin Console | +| **Organization Analytics connector** | Makes the Organization Analytics connector available to organization owners in Claude Desktop. When this is off, requests to it are refused. | Off | Claude Desktop | diff --git a/content/claude/third-party/claude-desktop/admin-console.md b/content/claude/third-party/claude-desktop/admin-console.md index 339bfa6f1e..d55af377d3 100644 --- a/content/claude/third-party/claude-desktop/admin-console.md +++ b/content/claude/third-party/claude-desktop/admin-console.md @@ -207,17 +207,17 @@ On the **Plugins** page under Desktop 3P, list the [plugin marketplaces](/docs/t ### Telemetry defaults -The telemetry categories, keys, and egress hosts on [Telemetry and egress](/docs/third-party/claude-desktop/telemetry) apply unchanged. Essential and non-essential telemetry are on until you turn them off on the **Telemetry & updates** page. The **Keep only your organization ID and restrictions on disk** switch on the same page also stops crash and performance reports, as described under [Configuration kept on devices](#configuration-kept-on-devices). The app attributes crash reports and product analytics to your organization automatically, and also attributes product analytics to the signed-in user's Claude account. An OpenTelemetry collector that you configure on the same page must use an `https://` endpoint. +The telemetry categories, keys, and egress hosts on [Telemetry and egress](/docs/third-party/claude-desktop/telemetry) apply unchanged. Essential and non-essential telemetry are on until you turn them off on the **Telemetry & updates** page. The **Keep only your organization ID and restrictions on disk** switch on the same page also stops crash reports, as described under [Configuration kept on devices](#configuration-kept-on-devices). The app attributes crash reports and product analytics to your organization automatically, and also attributes product analytics to the signed-in user's Claude account. An OpenTelemetry collector that you configure on the same page must use an `https://` endpoint. ### Configuration kept on devices -From Claude Desktop 2.7032.0, each device keeps a copy of part of the last configuration it downloaded from the admin console, and applies it at the next launch, before the app has downloaded the current configuration. The copy holds your organization's ID and name, the **Block essential telemetry** and **Block nonessential telemetry** switches, the **Microsoft 365 native sign-in broker** setting, and restrictions you have set, such as **Block nonessential services** turned on or **Allow user-added MCP servers** turned off. It doesn't hold lists, such as the folders and network hosts the app may use, or whether Chat, Cowork, and Code are available. Signing out of Claude Desktop deletes the copy. +From Claude Desktop 2.7032.0, each device keeps a copy of part of the last configuration it downloaded from the admin console, and applies it at the next launch, before the app has downloaded the current configuration. The copy holds your organization's ID and name, the **Block essential telemetry** and **Block nonessential telemetry** switches, the **Microsoft 365 native sign-in broker** and **Default Quick Entry shortcut** settings, and restrictions, such as **Block nonessential services** turned on or **Allow user-added MCP servers** turned off. It doesn't hold lists, such as the folders and network hosts the app may use, or whether Chat, Cowork, and Code are available. Signing out of Claude Desktop deletes the copy. -To keep less on devices, open **Organization settings**, go to the **Telemetry & updates** page under **Desktop 3P**, and turn on the **Keep only your organization ID and restrictions on disk** switch. The copy then holds only your organization ID and the restrictions you have set. Releases before 2.7032.0 keep the whole configuration except secrets, and ignore the switch. +To keep less on devices, open **Organization settings**, go to the **Telemetry & updates** page under **Desktop 3P**, and turn on the **Keep only your organization ID and restrictions on disk** switch. The copy then holds only your organization ID and restrictions. Releases before 2.7032.0 keep the whole configuration except secrets, and ignore the switch. When you turn on the switch, a running app trims its copy at its next configuration check (every 10 minutes by default), without a relaunch. An app that isn't running trims its copy at the next launch that downloads the configuration. Turning on the switch has two effects for users: -* From the first launch after a device trims its copy, the app sends no crash or performance reports to Anthropic, even while the **Block essential telemetry** switch is off. An app that is already running keeps sending reports until it relaunches. For support, you then collect logs from affected devices yourself, as described under [Essential telemetry](/docs/third-party/claude-desktop/telemetry#essential-telemetry). +* From the first launch after a device trims its copy, the app sends no crash reports to Anthropic, even while the **Block essential telemetry** switch is off. Error stack traces and performance timings still leave the device while the **Block essential telemetry** switch is off. An app that is already running keeps sending crash reports until it relaunches. For support, you then collect logs from affected devices yourself, as described under [Essential telemetry](/docs/third-party/claude-desktop/telemetry#essential-telemetry). * The sign-in screen can't show your organization's name until the app has downloaded the configuration. ### Usage analytics diff --git a/content/claude/third-party/claude-desktop/connectors-salesforce.md b/content/claude/third-party/claude-desktop/connectors-salesforce.md index a311b8d44d..cd1e2207a3 100644 --- a/content/claude/third-party/claude-desktop/connectors-salesforce.md +++ b/content/claude/third-party/claude-desktop/connectors-salesforce.md @@ -10,9 +10,15 @@ The Salesforce plugin and Salesforce's hosted MCP server let Claude work with yo ## Set up Salesforce +> [!NOTE] +> +> If your org runs on Salesforce Government Cloud, confirm with Salesforce whether its hosted MCP servers are available there before you start. + **1. Prepare your Salesforce org** -In Salesforce Setup, turn on **Enable MCP Service**, then create an External Client App for Claude Desktop with these OAuth settings: +In Salesforce Setup, turn on **Enable MCP Service**. Then enter `MCP Servers` in the **Quick Find** box, select **MCP Servers** under **API Catalog**, click the **Salesforce Servers** tab, and activate the **headless-360** server. Until the server is active, Claude Desktop can't connect to it through the entry you add in step 3, even when a user's Salesforce sign-in succeeds. Salesforce's [Activate MCP Servers](https://developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/activate-mcp-servers.html) guide covers activation. + +Also in Setup, create an External Client App for Claude Desktop with these OAuth settings: * The callback URL `http://127.0.0.1:53280/callback` * The OAuth scopes `mcp_api` and `refresh_token` @@ -69,7 +75,7 @@ Keep the name exactly as shown. The Salesforce plugin defines an MCP server with Enter exactly one URL as the authorization server. To send users to your org's My Domain login page instead of the shared Salesforce login page, enter that URL, for example `["https://yourorg.my.salesforce.com"]`. -For a Salesforce sandbox org, create the External Client App in the sandbox and enter the sandbox's login URL as the authorization server, for example `["https://test.salesforce.com"]`. Set the URL to `https://api.salesforce.com/platform/mcp/v1/sandbox/platform/headless-360`. +For a Salesforce sandbox org, complete step 1 in the sandbox and enter the sandbox's login URL as the authorization server, for example `["https://test.salesforce.com"]`. Set the URL to `https://api.salesforce.com/platform/mcp/v1/sandbox/platform/headless-360`. Devices need git installed to fetch the marketplace, and outbound HTTPS access to `github.com`, `api.salesforce.com`, and your Salesforce login host. diff --git a/content/claude/third-party/claude-desktop/telemetry.md b/content/claude/third-party/claude-desktop/telemetry.md index 809ac3794c..02eeaa133d 100644 --- a/content/claude/third-party/claude-desktop/telemetry.md +++ b/content/claude/third-party/claude-desktop/telemetry.md @@ -24,7 +24,7 @@ Crash reports, error stack traces, and performance timings. Contains diagnostic | - | - | - | | `disableEssentialTelemetry` | `false` | No crash or error data leaves the device. | -On Claude Desktop 2.7032.0 and later, the [**Keep only your organization ID and restrictions on disk**](/docs/third-party/claude-desktop/admin-console#configuration-kept-on-devices) switch in the [Enterprise Admin Console](/docs/third-party/claude-desktop/admin-console) also stops the app's crash and performance reports, even while `disableEssentialTelemetry` is `false`. +On Claude Desktop 2.7032.0 and later, the [**Keep only your organization ID and restrictions on disk**](/docs/third-party/claude-desktop/admin-console#configuration-kept-on-devices) switch in the [Enterprise Admin Console](/docs/third-party/claude-desktop/admin-console) also stops the app's crash reports, even while `disableEssentialTelemetry` is `false`. Error stack traces and performance timings still leave the device while `disableEssentialTelemetry` is `false`. > [!WARNING] > diff --git a/content/en/about-claude/additional-resources.md b/content/en/about-claude/additional-resources.md index bf0a0cb9ec..34ed485352 100644 --- a/content/en/about-claude/additional-resources.md +++ b/content/en/about-claude/additional-resources.md @@ -15,7 +15,7 @@ description: Learning resources and documentation formats optimized for AI inges Step-by-step lessons on building with Claude. - + Replicable code samples and implementations. diff --git a/content/en/about-claude/api-credits-for-subscribers.md b/content/en/about-claude/api-credits-for-subscribers.md index 4e54c8b373..d3c360d9e7 100644 --- a/content/en/about-claude/api-credits-for-subscribers.md +++ b/content/en/about-claude/api-credits-for-subscribers.md @@ -10,7 +10,7 @@ Claude Max and Team plans include monthly credits for the Claude API. To claim t Claude Platform on AWS, Amazon Bedrock, Google Cloud, and Microsoft Foundry: These credits apply only to the Claude API in the Claude Console. They can't be used on other platforms. -## At a glance +## Summary | Topic | Details | | -------------------------------------- | ------------------------------------------------------------------------- | @@ -22,7 +22,7 @@ Claude Max and Team plans include monthly credits for the Claude API. To claim t | **Expiry** | End of each billing cycle (or monthly for annual plans), with no rollover | | **Payment method for Claude Platform** | Not required | -## API credits amounts +## API credit amounts | Plan | Monthly credit | | --------------------------------------------- | -------------------------------------------------------------------- | @@ -43,7 +43,7 @@ Claude Max and Team plans include monthly credits for the Claude API. To claim t ## Claim your credits -### Before you begin +### Before you start You need both of the following roles: @@ -62,7 +62,7 @@ If you don't have a Claude Console organization, create one in the Console at [p - In the **API credits** section, choose the Console organization that should receive the credits, then accept the [program terms](https://www.anthropic.com/legal/credit-terms) by linking. + In the **API credits** section, select the Console organization that should receive the credits, then accept the [program terms](https://www.anthropic.com/legal/credit-terms) by linking. @@ -74,7 +74,7 @@ If you don't have a Claude Console organization, create one in the Console at [p Each plan links to one Console organization, and each Console organization can receive credits from one plan. You can't change the linked organization yourself, so link the organization you plan to build in. To change it later, [contact support](https://support.claude.com/en/articles/9015913-how-to-get-support). -Subscribers who aren't eligible don't see API credits in their settings page. If you think you should be eligible but don't see the API credits, [reach out to support](https://support.claude.com/en/articles/9015913-how-to-get-support). +Subscribers who aren't eligible don't see API credits in their settings page. If you think you should be eligible but don't see the API credits, [contact support](https://support.claude.com/en/articles/9015913-how-to-get-support). ## What the credits cover @@ -103,7 +103,7 @@ These API credits can only be used on the Claude Platform. The following table s Credits don't change how [rate limits and spend limits](https://platform.claude.com/docs/en/api/rate-limits) work: -* Usage paid with credits counts toward your organization's [monthly spend cap](https://platform.claude.com/docs/en/api/rate-limits#spend-limits). Spend caps reset on the first of each calendar month, while credits refresh on your billing cycle (or monthly for annual plans). +* Usage paid with credits counts toward your organization's [monthly spend cap](https://platform.claude.com/docs/en/api/rate-limits#spend-limits). Spend caps reset on the first of each calendar month, whereas credits refresh on your billing cycle (or monthly for annual plans). * Organizations linked to an eligible plan move up to at least the Start tier. If their monthly credits are over $200 USD, they move up to at least the Build tier. * Claiming credits doesn't otherwise change your [usage tier](https://platform.claude.com/docs/en/api/rate-limits#about-rate-limits), and these credits don't count toward moving to a higher tier. @@ -134,9 +134,9 @@ Credit balance too low · Add funds: https://platform.claude.com/settings/billin | Upgrade from Max to Team | The Max link ends. A Team owner can claim the team's credits after the Team plan has been active for 7 days. | | Add or remove Team seats | Seats added to your plan count from the next billing month's credit. Seats you remove stay on your plan until it renews, so the credit might be lower after that. The pool stays capped at $500 USD. | -## Make your credits go further +## Use your credits efficiently -Your monthly cost depends mainly on the model you choose and how often your application runs. To stretch your credits: +Your monthly cost depends mainly on the model you choose and how often your application runs. To use fewer credits: * Choose a model that fits each task. To learn how, see [Choosing the right model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model). * Use [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for repeated context. diff --git a/content/en/about-claude/glossary.md b/content/en/about-claude/glossary.md index f455788bcb..0145672eca 100644 --- a/content/en/about-claude/glossary.md +++ b/content/en/about-claude/glossary.md @@ -6,7 +6,7 @@ description: These concepts are not unique to Claude. This page presents a brief ## Context window -The "context window" refers to the amount of text a language model can look back on and reference when generating new text. This is different from the large corpus of data the language model was trained on, and instead represents a "working memory" for the model. A larger context window allows the model to process and respond to more complex and lengthy prompts, while a smaller context window may limit the model's ability to handle longer prompts or maintain coherence over extended conversations. +The "context window" refers to the amount of text a language model can look back on and reference when generating new text. This is different from the large corpus of data the language model was trained on, and instead represents a "working memory" for the model. A larger context window allows the model to process and respond to more complex and lengthy prompts, whereas a smaller context window might limit the model's ability to handle longer prompts or maintain coherence over extended conversations. See the [guide to understanding context windows](https://platform.claude.com/docs/en/build-with-claude/context-windows) to learn more. @@ -32,34 +32,34 @@ Large language models (LLMs) are AI language models with many parameters that ar ## MCP (Model Context Protocol) -Model Context Protocol (MCP) is an open protocol that standardizes how applications provide context to LLMs. Like a USB-C port for AI applications, MCP provides a unified way to connect AI models to different data sources and tools. MCP enables AI systems to maintain consistent context across interactions and access external resources in a standardized manner. See the [MCP documentation](https://modelcontextprotocol.io/) to learn more. +Model Context Protocol (MCP) is an open protocol that standardizes how applications provide context to LLMs. Like a USB-C port for AI applications, MCP provides a unified way to connect AI models to different data sources and tools. MCP allows AI systems to maintain consistent context across interactions and access external resources in a standardized manner. See the [MCP documentation](https://modelcontextprotocol.io/) to learn more. ## MCP connector -The MCP connector is a feature that allows API users to connect to MCP servers directly from the Messages API without building an MCP client. This enables seamless integration with MCP-compatible tools and services through the Claude API. The MCP connector supports features such as tool calling and is available in beta. See the [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) documentation to learn more. +The MCP connector is a feature that allows API users to connect to MCP servers directly from the Messages API without building an MCP client. This allows seamless integration with MCP-compatible tools and services through the Claude API. The MCP connector supports features such as tool calling and is available in beta. See the [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) documentation to learn more. ## Pretraining -Pretraining is the initial process of training language models on a large unlabeled corpus of text. In Claude's case, autoregressive language models (such as Claude's underlying model) are pretrained to predict the next word, given the previous context of text in the document. These pretrained models are not inherently good at answering questions or following instructions, and often require deep skill in prompt engineering to elicit desired behaviors. Fine-tuning and RLHF are used to refine these pretrained models, making them more useful for a wide range of tasks. +Pretraining is the initial process of training language models on a large unlabeled corpus of text. In Claude's case, autoregressive language models (such as Claude's underlying model) are pretrained to predict the next word, given the previous context of text in the document. These pretrained models are not inherently good at answering questions or following instructions, and often require deep skill in prompt engineering to elicit the behaviors you want. Fine-tuning and RLHF are used to refine these pretrained models, making them more useful for a wide range of tasks. -## RAG (Retrieval augmented generation) +## RAG (retrieval augmented generation) Retrieval augmented generation (RAG) is a technique that combines information retrieval with language model generation to improve the accuracy and relevance of the generated text, and to better ground the model's response in evidence. In RAG, a language model is augmented with an external knowledge base or a set of documents that is passed into the context window. The data is retrieved at runtime when a query is sent to the model, although the model itself does not necessarily retrieve the data (but can with [tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) and a retrieval function). When generating text, relevant information first must be retrieved from the knowledge base based on the input prompt, and then passed to the model along with the original query. The model uses this information to guide the output it generates. This allows the model to access and use information beyond its training data, reducing the reliance on memorization and improving the factual accuracy of the generated text. RAG can be particularly useful for tasks that require up-to-date information, domain-specific knowledge, or explicit citation of sources. However, the effectiveness of RAG depends on the quality and relevance of the external knowledge base and the knowledge that is retrieved at runtime. ## RLHF -Reinforcement Learning from Human Feedback (RLHF) is a technique used to train a pretrained language model to behave in ways that are consistent with human preferences. This can include helping the model follow instructions more effectively or act more like a chatbot. Human feedback consists of ranking a set of two or more example texts, and the reinforcement learning process encourages the model to prefer outputs that are similar to the higher-ranked ones. Claude has been trained using RLHF to be a more helpful assistant. For more details, you can read [Anthropic's paper on the subject](https://arxiv.org/abs/2204.05862). +Reinforcement learning from human feedback (RLHF) is a technique used to train a pretrained language model to behave in ways that are consistent with human preferences. This can include helping the model follow instructions more effectively or act more like a chatbot. Human feedback consists of ranking a set of two or more example texts, and the reinforcement learning process encourages the model to prefer outputs that are similar to the higher-ranked ones. Claude has been trained using RLHF to be a more helpful assistant. For more details, you can read Anthropic's [paper on RLHF](https://arxiv.org/abs/2204.05862). ## Temperature -Temperature is a parameter that controls the randomness of a model's predictions during text generation. Higher temperatures lead to more creative and diverse outputs, allowing for multiple variations in phrasing and, in the case of fiction, variation in answers as well. Lower temperatures result in more conservative and deterministic outputs that stick to the most probable phrasing and answers. Adjusting the temperature enables users to encourage a language model to explore rare, uncommon, or surprising word choices and sequences, rather than only selecting the most likely predictions. +Temperature is a parameter that controls the randomness of a model's predictions during text generation. Higher temperatures lead to more creative and diverse outputs, allowing for multiple variations in phrasing and, in the case of fiction, variation in answers as well. Lower temperatures result in more conservative and deterministic outputs that stick to the most probable phrasing and answers. Adjusting the temperature allows users to encourage a language model to explore rare, uncommon, or surprising word choices and sequences, rather than only selecting the most likely predictions. -Users may encounter non-determinism in APIs. Even with temperature set to 0, the results will not be fully deterministic and identical inputs may produce different outputs across API calls. This applies both to Anthropic's first-party inference service and to inference through third-party cloud providers. +Users might encounter non-determinism in APIs. Even with temperature set to 0, the results will not be fully deterministic, and identical inputs might produce different outputs across API calls. This applies both to Anthropic's first-party inference service and to inference through third-party cloud providers. -## TTFT (Time to first token) +## TTFT (time to first token) -Time to First Token (TTFT) is a performance metric that measures the time it takes for a language model to generate the first token of its output after receiving a prompt. It is an important indicator of the model's responsiveness and is particularly relevant for interactive applications, chatbots, and real-time systems where users expect quick initial feedback. A lower TTFT indicates that the model can start generating a response faster, providing a more seamless and engaging user experience. Factors that can influence TTFT include model size, hardware capabilities, network conditions, and the complexity of the prompt. +Time to first token (TTFT) is a performance metric that measures the time it takes for a language model to generate the first token of its output after receiving a prompt. It is an important indicator of the model's responsiveness and is particularly relevant for interactive applications, chatbots, and real-time systems where users expect quick initial feedback. A lower TTFT indicates that the model can start generating a response faster, providing a more seamless and engaging user experience. Factors that can influence TTFT include model size, hardware capabilities, network conditions, and the complexity of the prompt. ## Tokens -Tokens are the smallest individual units of a language model, and can correspond to words, subwords, characters, or even bytes (in the case of Unicode). For Claude, the number of characters a token represents depends on the model and the language. Claude 4.7 and later models and Claude Mythos Preview use a newer tokenizer that produces approximately 30 percent more tokens for the same text than earlier models, on which a token represents approximately 3.5 English characters. To get exact counts, use [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) with the model you plan to use. Tokens are typically hidden when interacting with language models at the "text" level but become relevant when examining the exact inputs and outputs of a language model. When Claude is provided with text to evaluate, the text (consisting of a series of characters) is encoded into a series of tokens for the model to process. Larger tokens enable data efficiency during inference and pretraining (and are used when possible), while smaller tokens allow a model to handle uncommon or never-before-seen words. The choice of tokenization method can impact the model's performance, vocabulary size, and ability to handle out-of-vocabulary words. +Tokens are the smallest individual units of a language model, and can correspond to words, subwords, characters, or even bytes (in the case of Unicode). For Claude, the number of characters a token represents depends on the model and the language. Claude 4.7 and later models and Claude Mythos Preview use a newer tokenizer that produces approximately 30 percent more tokens for the same text than earlier models, on which a token represents approximately 3.5 English characters. To get exact counts, use [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) with the model you plan to use. Tokens are typically hidden when interacting with language models at the "text" level but become relevant when examining the exact inputs and outputs of a language model. When Claude is provided with text to evaluate, the text (consisting of a series of characters) is encoded into a series of tokens for the model to process. Larger tokens improve data efficiency during inference and pretraining (and are used when possible), whereas smaller tokens allow a model to handle uncommon or never-before-seen words. The choice of tokenization method can impact the model's performance, vocabulary size, and ability to handle out-of-vocabulary words. diff --git a/content/en/about-claude/model-deprecations.md b/content/en/about-claude/model-deprecations.md index 9d12f907c5..53a5dea591 100644 --- a/content/en/about-claude/model-deprecations.md +++ b/content/en/about-claude/model-deprecations.md @@ -13,9 +13,9 @@ This page lists all API deprecations, along with recommended replacements. Anthropic uses the following terms to describe the model lifecycle: * **Active:** The model is fully supported and recommended for use. -* **Legacy:** The model will no longer receive updates and may be deprecated in the future. +* **Legacy:** The model will no longer receive updates and might be deprecated in the future. * **Deprecated:** The model is still functional but no longer recommended. Anthropic provides a recommended replacement and assigns a retirement date. -* **Retired:** The model is no longer available for use. Requests to retired models will fail. +* **Retired:** The model is no longer available for use. Requests to retired models fail. Deprecated models are likely to be less reliable than active models. Move workloads to active models to maintain the highest level of support and reliability. @@ -29,7 +29,7 @@ Once a model is deprecated, migrate all usage to a suitable replacement before t To help measure the performance of replacement models on your tasks, consider thorough testing of your applications with the new models well before the retirement date. -For specific instructions on migrating to the latest Claude models, see the [Migration guide](https://platform.claude.com/docs/en/about-claude/models/migration-guide). +For specific instructions on migrating to the latest Claude models, see [Migration guides](https://platform.claude.com/docs/en/about-claude/models/migration-guide). ## Notifications @@ -37,28 +37,28 @@ Anthropic notifies customers with active deployments for models with upcoming re ## Auditing model usage -To help identify usage of deprecated models, customers can access an audit of their API usage. Follow these steps: +To help identify usage of deprecated models, you can access an audit of your API usage. Follow these steps: 1. Go to the [Usage](https://platform.claude.com/usage) page in Claude Console. 2. Click **Export**. 3. Review the downloaded CSV to see usage broken down by API key and model. -This audit will help you locate any instances where your application is still using deprecated models, allowing you to prioritize updates to newer models before the retirement date. +This audit helps you locate any instances where your application is still using deprecated models, allowing you to prioritize updates to newer models before the retirement date. ## Best practices 1. Regularly check the documentation for updates on model deprecations. 2. Test your applications with newer models well before the retirement date of your current model. 3. Update your code to use the recommended replacement model as soon as possible. -4. Contact the support team if you need assistance with migration or have any questions. +4. Contact the support team if you need help with migration or have any questions. ## Deprecation downsides and mitigations Anthropic currently deprecates and retires models to ensure capacity for new model releases. This comes with downsides: -* Users who value specific models must migrate to new versions -* Researchers lose access to models for ongoing and comparative studies -* Model retirement introduces safety- and model welfare-related risks +* Users who value specific models must migrate to new versions. +* Researchers lose access to models for ongoing and comparative studies. +* Model retirement introduces safety- and model welfare-related risks. At some point, Anthropic hopes to make past models publicly available again. In the meantime, Anthropic has committed to long-term preservation of model weights and other measures to help mitigate these impacts. For more details, see [Commitments on Model Deprecation and Preservation](https://www.anthropic.com/research/deprecation-commitments). @@ -135,7 +135,7 @@ On April 14, 2026, Anthropic notified developers using Claude Sonnet 4 and Claud This model was retired April 20, 2026. -On February 19, 2026, Anthropic notified developers using Claude Haiku 3 model of its upcoming retirement on the Claude API. +On February 19, 2026, Anthropic notified developers using Claude Haiku 3 of its upcoming retirement on the Claude API. | Retirement date | Deprecated model | Recommended replacement | | --------------- | ------------------------- | --------------------------- | @@ -147,7 +147,7 @@ On February 19, 2026, Anthropic notified developers using Claude Haiku 3 model o This model was retired February 19, 2026. -On December 19, 2025, Anthropic notified developers using Claude Haiku 3.5 model of its upcoming retirement on the Claude API. +On December 19, 2025, Anthropic notified developers using Claude Haiku 3.5 of its upcoming retirement on the Claude API. | Retirement date | Deprecated model | Recommended replacement | | ----------------- | --------------------------- | --------------------------- | @@ -159,7 +159,7 @@ On December 19, 2025, Anthropic notified developers using Claude Haiku 3.5 model This model was retired February 19, 2026. -On October 28, 2025, Anthropic notified developers using Claude Sonnet 3.7 model of its upcoming retirement on the Claude API. +On October 28, 2025, Anthropic notified developers using Claude Sonnet 3.7 of its upcoming retirement on the Claude API. | Retirement date | Deprecated model | Recommended replacement | | ----------------- | ---------------------------- | ----------------------- | @@ -184,7 +184,7 @@ On August 13, 2025, Anthropic notified developers using Claude Sonnet 3.5 models This model was retired January 5, 2026. -On June 30, 2025, Anthropic notified developers using Claude Opus 3 model of its upcoming retirement. +On June 30, 2025, Anthropic notified developers using Claude Opus 3 of its upcoming retirement. | Retirement date | Deprecated model | Recommended replacement | | --------------- | ------------------------ | ----------------------- | @@ -224,10 +224,10 @@ On September 4, 2024, Anthropic notified developers using Claude 1 and Instant m ## API parameter deprecations -Anthropic occasionally deprecates request parameters that no longer apply to current models. How the API treats a deprecated parameter depends on the model, as the following table shows. Most SDKs keep deprecated parameters in their request types so existing code continues to type-check. The Python SDK (v1.0 and later) removes `temperature`, `top_p`, and `top_k`, so passing them raises a `TypeError`. +Anthropic occasionally deprecates request parameters that no longer apply to current models. A new model can reject a deprecated parameter, and a new [API version](https://platform.claude.com/docs/en/api/versioning) can remove it for every model. -| Parameter | Status | Behavior | Recommended replacement | -| ------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `temperature`, `top_p`, `top_k` | Deprecated (Claude 4.7 and later models) | Returns a 400 error when set to a non-default value on Claude 4.7 and later models and [Claude Mythos Preview](https://anthropic.com/glasswing). | Omit and use [prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices) to guide model behavior. | +| Parameter | Status | Behavior | Recommended replacement | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `temperature`, `top_p`, `top_k` | Removed in [API version `2026-10-21`](https://platform.claude.com/docs/en/api/migration-2026-10-21#sampling-parameters) | Returns a 400 error. Earlier API versions return it when set to a non-default value on Claude 4.7 and later models and [Claude Mythos Preview](https://anthropic.com/glasswing). | Omit and use [prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices) to guide model behavior. | -For migration steps, see the [migration guide](https://platform.claude.com/docs/en/about-claude/models/migration-guide). +For migration steps, see [Migration guides](https://platform.claude.com/docs/en/about-claude/models/migration-guide). diff --git a/content/en/about-claude/models/choosing-a-model.md b/content/en/about-claude/models/choosing-a-model.md index 06e61971c9..9fbd307d46 100644 --- a/content/en/about-claude/models/choosing-a-model.md +++ b/content/en/about-claude/models/choosing-a-model.md @@ -21,14 +21,14 @@ There are two general approaches you can use to start testing which Claude model ### Option 1: Start efficiency-first -For many applications, starting with a faster, more cost-effective model like Claude Haiku 5.5 can be the optimal approach: +For many applications, starting with a faster, more cost-effective model such as Claude Haiku 5.5 can be the optimal approach: -1. Begin implementation with Claude Haiku 5.5. +1. Start implementation with Claude Haiku 5.5. 2. Test your use case thoroughly. 3. Evaluate if performance meets your requirements. 4. Upgrade only if necessary for specific capability gaps. -This approach allows for quick iteration, lower development costs, and is often sufficient for many common applications. This approach is best for: +This approach allows for quick iteration and lower development costs, and is often sufficient for many common applications. This approach is best for: * Initial prototyping and development * Applications with tight latency requirements @@ -37,7 +37,7 @@ This approach allows for quick iteration, lower development costs, and is often ### Option 2: Start capability-first -For complex tasks where intelligence and advanced capabilities are paramount, you may want to start capability-first: implement with the strongest starting point for your task, then optimize to more efficient models down the line: +For complex tasks where intelligence and advanced capabilities are paramount, you might want to start capability-first: implement with the strongest starting point for your task, then optimize to more efficient models later: 1. Implement with Claude Opus 5.5. 2. [Optimize your prompts](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5) for this model. @@ -68,7 +68,7 @@ Most workloads start with Claude Opus 5.5. | The highest available capability | Claude Fable 5.1 | Agent sessions that run for hours, multistep deep research, analysis carried through to a finished document, spreadsheet, or deck | | Complex agentic coding and enterprise work | Claude Opus 5.5 | Multihour autonomous coding agents, large-scale refactoring, complex systems engineering, vision-heavy workflows, computer use | | Speed and capability for everyday coding, agent, and enterprise workloads | Claude Sonnet 5.5 | Code generation, data analysis, content creation, visual understanding, agentic tool use | -| The lowest latency and price | Claude Haiku 5.5 | Real-time applications, high-volume intelligent processing, cost-sensitive deployments needing strong reasoning, sub-agent tasks | +| The lowest latency and price | Claude Haiku 5.5 | Real-time applications, high-volume intelligent processing, cost-sensitive deployments needing strong reasoning, subagent tasks | *** @@ -76,7 +76,7 @@ Most workloads start with Claude Opus 5.5. To determine if you need to upgrade or change models, you should: -1. [Create benchmark tests](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) specific to your use case - having a good evaluation set is the most important step in the process. +1. [Create benchmark tests](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) specific to your use case. Having a good evaluation set is the most important step in the process. 2. Test with your actual prompts and data. diff --git a/content/en/about-claude/models/migration-guide.md b/content/en/about-claude/models/migration-guide.md index c8d2b9b5e7..a7625237c0 100644 --- a/content/en/about-claude/models/migration-guide.md +++ b/content/en/about-claude/models/migration-guide.md @@ -11,7 +11,7 @@ description: Guides for migrating to the latest Claude models from previous Clau ## Get help -* Check the [API documentation](https://platform.claude.com/docs/en/api/overview) for detailed specifications +* Check the [API overview](https://platform.claude.com/docs/en/api/overview) for detailed specifications * Review [model capabilities](https://platform.claude.com/docs/en/models/overview) for performance comparisons -* Review [API release notes](https://platform.claude.com/docs/en/release-notes/overview) for API updates +* Review [Claude Platform release notes](https://platform.claude.com/docs/en/release-notes/overview) for API updates * Contact support if you encounter any issues during migration diff --git a/content/en/about-claude/models/optimizing-for-cost-and-intelligence.md b/content/en/about-claude/models/optimizing-for-cost-and-intelligence.md index 7aa94492cd..b1330c1bf0 100644 --- a/content/en/about-claude/models/optimizing-for-cost-and-intelligence.md +++ b/content/en/about-claude/models/optimizing-for-cost-and-intelligence.md @@ -43,7 +43,7 @@ These results are Anthropic-internal ([Benchmarks referenced](https://platform.c ## Cut spend without losing quality -Prompt caching, token hygiene, batch processing, and a prompt audit against your current model all lower what you pay without lowering output quality. Two caveats apply: batch processing trades latency for its discount, and context editing, a token-hygiene lever, cost more than it saved in the run measured in this section. +Prompt caching, token hygiene, batch processing, and a prompt audit against your current model all lower what you pay without lowering output quality. Two caveats apply: batch processing trades latency for its discount, and context editing, a token-hygiene lever, cost more than it saved on the short run measured in this section and changed nothing on the long one. ### Cache repeated context @@ -146,7 +146,7 @@ To keep the cache warm: 1. Take the previous request, set `max_tokens` to 0, and drop `stream` if it was set. Do not change a byte of the prefix. 2. Re-send the request's headers with its body. Without the original request's `anthropic-beta` header, the beta-gated fields in the replayed body are rejected. -3. Send it within 4 minutes of the previous request's start, and every 4 minutes after that. Count from the request's start, because the [cache's 5-minute lifetime](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#how-prompt-caching-works) runs from there. +3. Send it within 4 minutes of the previous request's start, and every 4 minutes after that, until the next turn arrives or the session ends. Count from the request's start, because the [cache's 5-minute lifetime](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#how-prompt-caching-works) runs from there. That is the [pre-warming request](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pre-warming-the-cache): it refreshes the cache's lifetime, returns no output, and costs little more than the cache read. Once the cache has expired, the next request, keep-alive or not, re-writes the prefix at the cache write price[16](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs). @@ -252,7 +252,7 @@ When the model has to compute over a table, upload it with the [Files API](https ![Scatter chart: file uploaded with code execution, 25 of 25 correct at $0.40 USD; pasted into the prompt, 7 of 25 at $5.01 USD](https://platform.claude.com/docs/images/cost-intel/data-files.svg) -Pasted into the prompt, the table is about 91,000 input tokens on every request, and Claude Sonnet 5 answered 7 of 25 questions correctly. Uploaded, with code execution, it answered all 25, and the run cost about a twelfth as much. Claude Opus 5 showed the same pattern. +Pasted into the prompt, the table is about 91,000 input tokens on every request, and Claude Sonnet 5 answered 7 of 25 questions correctly. Uploaded, with code execution, it answered all 25, and the run cost about a twelfth as much. Claude Opus 5 showed the same pattern. Neither approach used prompt caching. #### Manage the context lifecycle @@ -381,7 +381,7 @@ The same patterns tend to appear in tool descriptions and skills, which are wort ## Trade cost against intelligence -These levers set where a single model sits between cost and intelligence: model choice, effort, re-running failures at a higher setting, the budgets and caps it works within, and whether it can see how much time has passed. Start with an effort sweep on your current model ([Tune effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort)). From lowest to highest cost and capability, the current models are Claude Haiku 5.5, Claude Sonnet 5.5, Claude Opus 5.5, and Claude Fable 5.1 (the frontier model); [Models overview](https://platform.claude.com/docs/en/models/overview) has the full lineup and prices. +These levers set where a single model sits between cost and intelligence: model choice, effort, re-running failures at a higher setting, the budgets and caps it works within, and whether it can see how much time has passed. If you are a model or two behind, upgrade first ([Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model)); otherwise, start with an effort sweep on your current model ([Tune effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort)). From lowest to highest cost and capability, the current models are Claude Haiku 5.5, Claude Sonnet 5.5, Claude Opus 5.5, and Claude Fable 5.1 (the frontier model); [Models overview](https://platform.claude.com/docs/en/models/overview) has the full lineup and prices. ### Compare models on cost per task @@ -532,6 +532,12 @@ The following table shows what each model solved and what a solved task cost at Compare the caps within each model. The two models were run a month apart, and their costs are priced on different bases. +On the internal repository tasks[12](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs), almost every turn finishes far below a 16,384-token cap. The rare long turn is what a higher cap buys: + + + ![Dot plot of per-turn output for Opus 5.5 and Fable 5.1: medians a few hundred tokens, longest 61k and 128k, against the caps](https://platform.claude.com/docs/images/cost-intel/max-tokens-ladder-opus-5-5.svg) + + Ask for shorter answers. Output tokens cost five times input tokens on Claude Haiku 5.5, Claude Sonnet 5.5, Claude Opus 5.5, and Claude Fable 5.1, and in an agent loop every token the model writes comes back as input on every later turn, so you pay for a long answer again and again. In a measurement on an earlier model[26](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs), Anthropic ran a small agent that triages bug reports ([Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens)) under three final-answer instructions, three runs each, with the same model and tools: @@ -548,12 +554,6 @@ The following chart plots the cost per run of each format: All three scored within run-to-run noise of each other against the correct labels, so the formats differ in what you pay far more than in what they get right. Ask for the answer you will read, not the one that looks thorough. -On the internal repository tasks[12](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs), almost every turn finishes far below a 16,384-token cap. The rare long turn is what a higher cap buys: - - - ![Dot plot of per-turn output for Opus 5.5 and Fable 5.1: medians a few hundred tokens, longest 61k and 128k, against the caps](https://platform.claude.com/docs/images/cost-intel/max-tokens-ladder-opus-5-5.svg) - - ### Show the model elapsed time To make an agent finish sooner and cost less, tell it that time matters, and show it the elapsed time on every request. In Anthropic's measurement, the two changes cut the time of a single Claude Opus 5.5 agent at `medium` effort by 47% and its cost by 60% on the typical (median) DRACO[21](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) research task, and its average score was 4.1 points lower. @@ -615,7 +615,7 @@ On the coding benchmark, the pairing's gain is at the edge of run-to-run noise, * Measure the consult rate on your own tasks. The advisor tool's definition, about 1,000 prompt tokens per request, adds cost even when the executor never consults. With [prompt caching](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#cache-repeated-context), a multi-turn agent loop pays for the definition at the cache-read price after the first request, so this overhead matters most for short, single-request tasks. * If the executor rarely consults, see [Prompting for coding and agent tasks](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#prompting-for-coding-and-agent-tasks) for system prompts that ask for consultations, and measure again after you add one. On 20 SWE-bench Pro[3](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) problems, the suggested prompt made no clear difference for Claude Sonnet 5.5. -* Restore the executor's effort if the consult rate collapses. In measurements on earlier models, one pairing that consulted on most tasks at the default effort consulted on few when effort was lowered, and then scored below the executor alone (SWE-bench Pro[3](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs)). +* Restore the executor's effort if the consult rate collapses. In measurements on earlier models, one pairing that consulted on most tasks at the default effort consulted on few when effort was lowered, and then scored below the executor alone at its default effort (SWE-bench Pro[3](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs)). * Recheck at every model release, because releases move both the capability gap and the price ratio. ### Orchestrator strategy: delegate bulk work @@ -728,7 +728,7 @@ The following example computes one request's cost at Claude Opus 5.5's list pric { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], } ); var usage = response.Usage; @@ -828,7 +828,7 @@ The following example computes one request's cost at Claude Opus 5.5's list pric client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [{ role: "user", content: "Hello, Claude" }] ) @@ -858,7 +858,7 @@ The following table lists the levers in the order to try them. The figures are f | Input trimming | A further 21% to 26% off a small triage agent's bill | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) | | Prune stale tool results at task boundaries | 39% on a long agent task; nothing on short ones. On the models named in that section, use compaction instead | None measured | Neutral | [Manage the context lifecycle](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#manage-the-context-lifecycle) | | Tool search | 45% with 500 tool definitions attached; 20% from deferring a GitHub MCP server's toolset | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) | -| Data files through code execution | 92% on a data task of 25 questions | A gain: 25 of 25 correct instead of 7 | Faster | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) | +| Data files through code execution | 92% on a data task of 25 questions, with prompt caching off | A gain: 25 of 25 correct instead of 7 | Faster | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) | | Batch API | 50% | None | Results within 24 hours | [Batch work that can wait](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#batch-work-that-can-wait) | | Prompt audit against the current model | 14% on both model upgrades tested | None; a gain on one | Faster (fewer tool rounds) | [Audit prompts against the current model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#audit-prompts-against-the-current-model) | | Upgrade the model | Usually less per solved task: up to 87% less on a coding benchmark | None; a gain on most | Neutral | [Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model) | @@ -918,7 +918,7 @@ Except where a reference says otherwise, measurements are Anthropic-internal run * **The 478 problems:** The Opus 5.5 runs used a version of the benchmark whose grading containers can reach only internal package mirrors. That version drops one problem whose test needs a live website, and on three more the reference solution fails there, so Opus 5.5 comparisons, and the Claude Fable 5.1 figures set beside them, use the remaining 478 problems. * **Claude Sonnet 5.5 runs:** Claude Sonnet 5.5 ran the same version of the benchmark: two runs at its default, `high`, and two at `medium`, all on September 24, 2026, with the same 16,384-token cap per turn, which cut off none of its attempts. Its figures use the 478 problems, and so do the Claude Sonnet 5 figures set beside them, counted over those problems from their August runs. * **Claude Opus 5 runs:** The Claude Opus 5 SWE-bench Pro figures in [Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model) and in this reference average two runs at its default effort and use one run at `low`, all run August 4, 2026. - * **Advisor, Claude Sonnet 5 pairings:** The Claude Sonnet 5 executor pairings with a Claude Opus 5 advisor behind the consult-rate examples in [Advisor strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#advisor-strategy-escalate-hard-decisions) come from the same measurement series on this subset: the pairing at the default effort was run twice (August 7 and August 8, 2026, a run and an exact replication), the low-effort pairing once (August 8, 2026), and Claude Sonnet 5 alone twice (77.4%, the baseline for both pairings). + * **Advisor, Claude Sonnet 5 pairings:** The Claude Sonnet 5 executor pairings with a Claude Opus 5 advisor behind the consult-rate examples in [Advisor strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#advisor-strategy-escalate-hard-decisions) ran on this subset through the same test setup: the pairing at the default effort was run twice (August 7 and August 8, 2026, a run and an exact replication), the low-effort pairing once (August 8, 2026), and, ten days later, Claude Sonnet 5 alone twice at its default effort (77.4%, the baseline for both pairings). * **Advisor, Claude Sonnet 5.5 consult check:** The Claude Sonnet 5.5 consult check cited in [Advisor strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#advisor-strategy-escalate-hard-decisions) ran one attempt on each of 20 of the 478 problems, on September 24, 2026, with a Claude Opus 5.5 advisor through the advisor tool. Four configurations ran: `high` and `xhigh`, each with and without the advisor tool documentation's suggested system prompt for coding tasks. At its default effort, `high`, Claude Sonnet 5.5 did not consult the advisor on any of the 20 problems, with or without the prompt. At `xhigh`, it consulted on 3 of the 20 problems without the prompt and 4 with it, each time on its attempts with the most turns. * **Escalation figures:** Escalation figures come task by task from the Opus 5.5 runs: `low` first, then `high` on its failures, solved 96.4% to 97.5% across run pairings for about $0.17 USD; `medium` first, 96.0% to 97.1% for about $0.24 USD; `high` re-run on its own failures, 96.9% for $0.31 USD; everything at `high`, 94.8% to 95.8% for $0.29 USD. * **Compare models:** The Claude Fable 5.1 figure in [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) comes from one run on the same subset at the default effort, run August 26, 2026: counted over the 478 problems, it solved 92.3% for $1.19 USD per solved task. That section's chart and its Claude Opus 5.5 and Claude Sonnet 5.5 figures pool the two runs at each setting plotted, all counted over the 478 problems: Claude Opus 5.5 at `low`, `medium`, and `high`, and Claude Sonnet 5.5 at `medium` and `high`. @@ -1101,7 +1101,7 @@ Except where a reference says otherwise, measurements are Anthropic-internal run * **Also in the instructions as sent:** As sent, the two-line instruction also said "Be concise." and the memo instruction "Be thorough and explicit." * **When:** The two-line and one-line instructions ran on August 18, 2026, with `max_tokens` at 700, and the memo instruction on August 19, 2026, with `max_tokens` at 3,000. No response reached its cap. * **How scored and priced:** Figures are the mean of the three runs at Claude Sonnet 5's list prices, and accuracy is exact match against the gold labels. - * **Results:** The one-line answer used 39% fewer output tokens than the two-line original and cost 14% less per run (from the chart's rounded costs, $0.49 USD and $0.57 USD; the unrounded means give 13%). The memo used six times the output tokens of the two-line original and cost 2.8 times the one-line answer. + * **Results:** The one-line answer used 39% fewer output tokens than the two-line original and cost 13% less per run (from the unrounded means; the chart's rounded costs, $0.49 USD and $0.57 USD, give 14%). The memo used six times the output tokens of the two-line original and cost 2.8 times the one-line answer. * **Thinking:** About half of the responses included thinking, and its tokens are counted in the output tokens. 27. **Tool search measurement:** diff --git a/content/en/about-claude/pricing.md b/content/en/about-claude/pricing.md index dc2c1e0ec0..40b8243d6f 100644 --- a/content/en/about-claude/pricing.md +++ b/content/en/about-claude/pricing.md @@ -70,7 +70,7 @@ Claude models are available on [Amazon Bedrock](https://platform.claude.com/docs * **Bedrock** offers two endpoint types: global endpoints (dynamic routing for maximum availability) and regional endpoints (guaranteed data routing through specific geographic regions). * **Google Cloud** offers global endpoints and multi-region endpoints (dynamic routing within a geographic area) for these models, and regional endpoints for Claude Sonnet 4.6 and earlier models. - Regional and multi-region endpoints include a 10% premium over global endpoints. The Claude API (first-party) is global by default; for first-party data residency options and pricing, see [Data residency pricing](https://platform.claude.com/docs/en/about-claude/pricing#data-residency-pricing). + Regional and multi-region endpoints include a 10 percent premium over global endpoints. The Claude API (first-party) is global by default; for first-party data residency options and pricing, see [Data residency pricing](https://platform.claude.com/docs/en/about-claude/pricing#data-residency-pricing). **Scope:** This pricing structure applies to Claude Sonnet 4.5 (deprecated), Haiku 4.5, Opus 4.5, and all future models. Earlier models (Claude Opus 4.1 and prior releases) retain their existing pricing. @@ -82,7 +82,7 @@ Claude models are available on [Amazon Bedrock](https://platform.claude.com/docs ## Claude Platform on AWS pricing -[Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws) bills through AWS Marketplace using Claude Consumption Units (CCUs). Anthropic rates your token usage in USD at standard per-model, per-feature rates, applies any negotiated discount, converts the result to CCUs at $0.01 per CCU, and reports the CCU quantity to AWS Marketplace hourly. Your AWS bill shows a single CCU line item. +[Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws) bills through AWS Marketplace using Claude Consumption Units (CCUs). Anthropic rates your token usage in USD at standard per-model, per-feature rates, applies any negotiated discount, converts the result to CCUs at $0.01 USD per CCU, and reports the CCU quantity to AWS Marketplace hourly. Your AWS bill shows a single CCU line item. | Concept | Details | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -111,7 +111,7 @@ When you sign up on the AWS Console **Claude Platform on AWS** service page, the ## Claude in Microsoft Foundry pricing -[Claude in Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry) bills through the Azure Marketplace using Claude Consumption Units (CCUs). Anthropic rates your token usage in USD at standard per-model, per-feature rates, applies any negotiated discount, converts the result to CCUs at $0.01 per CCU, and reports the CCU quantity to the Azure Marketplace hourly. Your Azure bill shows a single CCU line item. +[Claude in Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry) bills through the Azure Marketplace using Claude Consumption Units (CCUs). Anthropic rates your token usage in USD at standard per-model, per-feature rates, applies any negotiated discount, converts the result to CCUs at $0.01 USD per CCU, and reports the CCU quantity to the Azure Marketplace hourly. Your Azure bill shows a single CCU line item. | Concept | Details | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -174,8 +174,8 @@ For more information, see [Data residency](https://platform.claude.com/docs/en/m Fast mode pricing stacks with other pricing modifiers: -* [Prompt caching multipliers](https://platform.claude.com/docs/en/about-claude/pricing#prompt-caching) apply on top of fast mode pricing -* [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) multipliers apply on top of fast mode pricing +* [Prompt caching multipliers](https://platform.claude.com/docs/en/about-claude/pricing#prompt-caching) apply on top of fast mode pricing. +* [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) multipliers apply on top of fast mode pricing. Fast mode is not available with the [Batch API](https://platform.claude.com/docs/en/about-claude/pricing#batch-processing). @@ -183,7 +183,7 @@ For more information, see [Fast mode](https://platform.claude.com/docs/en/build- ### Batch processing -The Batch API allows asynchronous processing of large volumes of requests with a 50% discount on both input and output tokens. +The Batch API allows asynchronous processing of large volumes of requests with a 50 percent discount on both input and output tokens. | Model | Batch input | Batch output | | :----------------------------------------------------------------------------------------------------------------------------------- | :----------- | :------------ | @@ -219,7 +219,7 @@ For more information about batch processing, see [Batch processing](https://plat Claude 4.6 and later models (except Claude Haiku 5.5) and [Claude Mythos Preview](https://anthropic.com/glasswing) include the full [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) at standard pricing. (A 900k-token request is billed at the same per-token rate as a 9k-token request.) Prompt caching and batch processing discounts apply at standard rates across the full context window. -Claude Haiku 5.5 is priced by prompt length: a request whose prompt is over 100,000 tokens pays higher prices. A request's prompt length counts all of its input tokens, including cache reads and cache writes. Each request is priced on its own: a request over the threshold pays the higher prices even when part of its prompt is a cache hit, and earlier requests keep the prices they were billed at. [Model pricing](https://platform.claude.com/docs/en/about-claude/pricing#model-pricing) and [Batch processing](https://platform.claude.com/docs/en/about-claude/pricing#batch-processing) list both sets of prices. +Claude Haiku 5.5 is priced by prompt length: a request whose prompt is over 100,000 tokens pays higher prices. A request's prompt length counts all of its input tokens, including cache reads and cache writes. Each request is priced on its own: a request over the threshold pays the higher prices even when part of its prompt is a cache hit, and earlier requests keep the prices they were billed at. The [model pricing](https://platform.claude.com/docs/en/about-claude/pricing#model-pricing) and [batch processing pricing](https://platform.claude.com/docs/en/about-claude/pricing#batch-processing) sections list both sets of prices. ### Tool use pricing @@ -293,10 +293,10 @@ See [tool use pricing](https://platform.claude.com/docs/en/about-claude/pricing# When used without these tools, code execution is billed by execution time, tracked separately from token usage: -* Execution time has a minimum of 5 minutes -* Each organization receives **1,550 free hours** of usage per month -* Additional usage beyond 1,550 hours is billed at **$0.05 USD per hour, per container** -* If files are included in the request, execution time is billed even if the tool is not called, because files are preloaded onto the container +* Execution time has a minimum of 5 minutes. +* Each organization receives **1,550 free hours** of usage per month. +* Additional usage beyond 1,550 hours is billed at **$0.05 USD per hour, per container**. +* If files are included in the request, execution time is billed even if the tool is not called, because files are preloaded onto the container. Code execution usage is tracked in the response: @@ -343,7 +343,7 @@ Web search usage is charged in addition to token usage: } ``` -Web search is available on the Claude API for **$10 per 1,000 searches**, plus standard token costs for search-generated content. Web search results retrieved throughout a conversation are counted as input tokens, in search iterations executed during a single turn and in subsequent conversation turns. +Web search is available on the Claude API for **$10 USD per 1,000 searches**, plus standard token costs for search-generated content. Web search results retrieved throughout a conversation are counted as input tokens, in search iterations executed during a single turn and in subsequent conversation turns. Each web search counts as one use, regardless of the number of results returned. If an error occurs during web search, the web search will not be billed. @@ -371,7 +371,7 @@ To protect against inadvertently fetching large content that would consume exces Example token usage for typical content: -* Average web page (10 kB): \~2,500 tokens +* Average webpage (10 kB): \~2,500 tokens * Large documentation page (100 kB): \~25,000 tokens * Research paper PDF (500 kB): \~125,000 tokens @@ -416,7 +416,7 @@ Browser use follows the standard [tool use pricing](https://platform.claude.com/ ### Tokens -All tokens consumed by a Claude Managed Agents session are billed at the rates shown in [Model pricing](https://platform.claude.com/docs/en/about-claude/pricing#model-pricing). [Prompt caching](https://platform.claude.com/docs/en/about-claude/pricing#prompt-caching) multipliers apply identically. Web search triggered inside a session incurs the standard $10 per 1,000 searches. On [Claude Platform on AWS](https://platform.claude.com/docs/en/about-claude/pricing#claude-platform-on-aws-pricing), session token and runtime charges convert to Claude Consumption Units at the standard rate. [Fast mode](https://platform.claude.com/docs/en/about-claude/pricing#fast-mode-pricing) premium pricing applies when an agent's `model.speed` is set to `"fast"`. +All tokens consumed by a Claude Managed Agents session are billed at the rates shown in [Model pricing](https://platform.claude.com/docs/en/about-claude/pricing#model-pricing). [Prompt caching](https://platform.claude.com/docs/en/about-claude/pricing#prompt-caching) multipliers apply identically. Web search triggered inside a session incurs the standard $10 USD per 1,000 searches. On [Claude Platform on AWS](https://platform.claude.com/docs/en/about-claude/pricing#claude-platform-on-aws-pricing), session token and runtime charges convert to Claude Consumption Units at the standard rate. [Fast mode](https://platform.claude.com/docs/en/about-claude/pricing#fast-mode-pricing) premium pricing applies when an agent's `model.speed` is set to `"fast"`. The [data residency multiplier](https://platform.claude.com/docs/en/about-claude/pricing#data-residency-pricing) also applies: when an agent's `model.inference_geo` is pinned to `"us"`, tokens consumed by sessions running that agent are billed at 1.1x the standard rates, the same multiplier that applies to US-only inference on the Messages API. @@ -441,7 +441,7 @@ Runtime is measured to the millisecond and accrues only while the session's stat ### Worked example -A one-hour coding session using Claude Opus 5.5 that consumes 50,000 input tokens and 15,000 output tokens: +A 1-hour coding session using Claude Opus 5.5 that consumes 50,000 input tokens and 15,000 output tokens: | Line item | Calculation | Cost | | --------------- | ------------------------ | --------- | @@ -466,10 +466,10 @@ If prompt caching is active and 40,000 of the input tokens are cache reads: When building agents with Claude: -1. **Use appropriate models:** Choose Haiku for simple tasks, Sonnet for most production workloads, and Opus for the most complex reasoning -2. **Implement prompt caching:** Reduce costs for repeated context -3. **Batch operations:** Use the Batch API for non-time-sensitive tasks -4. **Monitor usage patterns:** Track token consumption to identify optimization opportunities +1. **Use appropriate models:** Choose Haiku for simple tasks, Sonnet for most production workloads, and Opus for the most complex reasoning. +2. **Implement prompt caching:** Reduce costs for repeated context. +3. **Batch operations:** Use the Batch API for non-time-sensitive tasks. +4. **Monitor usage patterns:** Track token consumption to identify optimization opportunities. For high-volume agent applications, contact the [enterprise sales team](https://claude.com/contact-sales) for custom pricing arrangements. @@ -489,11 +489,11 @@ For limits beyond the Scale tier or custom pricing arrangements, [contact the sa ### Volume discounts -Volume discounts may be available for high-volume users. These are negotiated on a case-by-case basis. +Volume discounts might be available for high-volume users. These are negotiated on a case-by-case basis. * Standard usage tiers use the pricing shown in [Model pricing](https://platform.claude.com/docs/en/about-claude/pricing#model-pricing) * Enterprise customers can [contact sales](mailto:sales@anthropic.com) for custom pricing -* Academic and research discounts may be available +* Academic and research discounts might be available ### Enterprise pricing @@ -511,7 +511,7 @@ Contact the sales team at [sales@anthropic.com](mailto:sales@anthropic.com) or t * Billing is based on actual monthly usage * All payments are in USD * Credit card and invoicing options available -* Usage tracking available in the [Claude Console](https://platform.claude.com/) +* Usage tracking available in the Claude Console at [platform.claude.com](https://platform.claude.com/) ## Frequently asked questions diff --git a/content/en/about-claude/use-case-guides/content-moderation.md b/content/en/about-claude/use-case-guides/content-moderation.md index bd9c652f7b..d7110e9606 100644 --- a/content/en/about-claude/use-case-guides/content-moderation.md +++ b/content/en/about-claude/use-case-guides/content-moderation.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/about-claude/use-case-guides/content-mo description: Content moderation is a critical aspect of maintaining a safe, respectful, and productive environment in digital applications. This guide discusses how Claude can be used to moderate content within your digital application. --- -> Visit the [content moderation cookbook](https://platform.claude.com/cookbook/misc-building-moderation-filter) to see an example content moderation implementation using Claude. +> Visit the [content moderation recipe](https://platform.claude.com/cookbook/misc-building-moderation-filter) in the Claude Cookbook to see an example content moderation implementation using Claude. This guide is focused on moderating user-generated content within your application. If you're looking for guidance on moderating interactions with Claude, refer to @@ -18,7 +18,7 @@ description: Content moderation is a critical aspect of maintaining a safe, resp ### Decide whether to use Claude for content moderation -Here are some key indicators that you should use an LLM like Claude instead of a traditional ML or rules-based approach for content moderation: +Here are some key indicators that you should use an LLM such as Claude instead of a traditional ML or rules-based approach for content moderation: @@ -26,11 +26,11 @@ Here are some key indicators that you should use an LLM like Claude instead of a - Traditional ML approaches, such as bag-of-words models or simple pattern matching, often struggle to understand the tone, intent, and context of the content. While human moderation systems excel at understanding semantic meaning, they require time for content to be reviewed. Claude addresses both needs by combining semantic understanding with the ability to deliver moderation decisions quickly. + Traditional ML approaches, such as bag-of-words models or simple pattern matching, often have difficulty capturing the tone, intent, and context of the content. Although human moderation systems excel at understanding semantic meaning, they require time for content to be reviewed. Claude addresses both needs by combining semantic understanding with the ability to deliver moderation decisions quickly. - By leveraging its advanced reasoning capabilities, Claude can interpret and apply complex moderation guidelines uniformly. This consistency helps ensure fair treatment of all content, reducing the risk of inconsistent or biased moderation decisions that can undermine user trust. + With its advanced reasoning capabilities, Claude can interpret and apply complex moderation guidelines uniformly. This consistency helps ensure fair treatment of all content, reducing the risk of inconsistent or biased moderation decisions that can undermine user trust. @@ -42,7 +42,7 @@ Here are some key indicators that you should use an LLM like Claude instead of a - Traditional ML approaches typically require separate models or extensive translation processes for each supported language. Human moderation requires hiring a workforce fluent in each supported language. Claude’s multilingual capabilities allow it to classify tickets in various languages without the need for separate models or extensive translation processes, streamlining moderation for global customer bases. + Traditional ML approaches typically require separate models or extensive translation processes for each supported language. Human moderation requires hiring a workforce fluent in each supported language. Claude’s multilingual capabilities allow it to classify content in various languages without the need for separate models or extensive translation processes, streamlining moderation for global customer bases. @@ -51,16 +51,16 @@ Here are some key indicators that you should use an LLM like Claude instead of a - All Claude models are trained with built-in safety behaviors. This may result in Claude moderating content deemed particularly dangerous (in line with the + All Claude models are trained with built-in safety behaviors. This might result in Claude moderating content deemed particularly dangerous (in line with the - [Acceptable Use Policy](https://www.anthropic.com/legal/aup) + [Usage Policy](https://www.anthropic.com/legal/aup) - ), regardless of the prompt used. For example, an adult website that wants to allow users to post explicit sexual content may find that Claude still flags explicit content as requiring moderation, even if they specify in their prompt not to moderate explicit sexual content. Consider reviewing the AUP in advance of building a moderation solution. + ), regardless of the prompt used. For example, an adult website that wants to allow users to post explicit sexual content might find that Claude still flags explicit content as requiring moderation, even if they specify in their prompt not to moderate explicit sexual content. Consider reviewing the Usage Policy in advance of building a moderation solution. ### Generate examples of content to moderate -Before developing a content moderation solution, first create examples of content that should be flagged and content that should not be flagged. Ensure that you include edge cases and challenging scenarios that may be difficult for a content moderation system to handle effectively. Afterward, review your examples to create a well-defined list of moderation categories. For instance, the examples generated by a social media platform might include the following: +Before developing a content moderation solution, first create examples of content that should be flagged and content that should not be flagged. Ensure that you include edge cases and challenging scenarios that might be difficult for a content moderation system to handle effectively. Afterward, review your examples to create a well-defined list of moderation categories. For instance, the examples generated by a social media platform might include the following: ```python Python @@ -320,7 +320,7 @@ The unsafe categories can be customized to fit your specific needs. For example, ### Select the right Claude model -When selecting a model, it’s important to consider the size of your data. If costs are a concern, a smaller model such as Claude Haiku 5.5 is an excellent choice because of its cost-effectiveness. The following is an estimate of the cost to moderate text for a social media platform that receives one billion posts per month: +When selecting a model, it’s important to consider the size of your data. If costs are a concern, a smaller model such as Claude Haiku 5.5 is an excellent choice because of its cost-effectiveness. The following is an estimate of the cost to moderate text for a social media platform that receives 1 billion posts per month: * **Content size** @@ -354,7 +354,7 @@ When selecting a model, it’s important to consider the size of your data. If c * Monthly cost: $143,000 + $37,500 = $180,500 USD - Actual costs may differ from these estimates. These estimates are based on the prompt highlighted in the section on + Actual costs might differ from these estimates. These estimates are based on the prompt highlighted in the section on [batch processing](https://platform.claude.com/docs/en/about-claude/use-case-guides/content-moderation#consider-batch-processing) @@ -367,7 +367,7 @@ When selecting a model, it’s important to consider the size of your data. If c ### Build a strong prompt -To use Claude for content moderation, Claude must understand the moderation requirements of your application. Start by writing a prompt that allows you to define your moderation needs: +To use Claude for content moderation, Claude must have information about the moderation requirements of your application. Start by writing a prompt that allows you to define your moderation needs: ```python Python @@ -546,7 +546,7 @@ To use Claude for content moderation, Claude must understand the moderation requ { Model = Model.ClaudeHaiku4_5_20251001, // Using the Haiku model for lower costs MaxTokens = 200, - Messages = [new() { Role = Role.User, Content = assessmentPrompt }], + Messages = [new UserMessageParam { Content = assessmentPrompt }], } ); @@ -877,9 +877,9 @@ The model's assessment is then parsed to determine if there is a violation. If t ### Evaluate your prompt -Content moderation is a classification problem. Thus, you can use the same techniques outlined in the [classification cookbook](https://platform.claude.com/cookbook/capabilities-classification-guide) to determine the accuracy of your content moderation system. +Content moderation is a classification problem. Thus, you can use the same techniques outlined in the Claude Cookbook's [classification recipe](https://platform.claude.com/cookbook/capabilities-classification-guide) to determine the accuracy of your content moderation system. -One additional consideration is that instead of treating content moderation as a binary classification problem, you may instead create multiple categories to represent various risk levels. Creating multiple risk levels allows you to adjust the aggressiveness of your moderation. For example, you might want to automatically block user queries that are deemed high risk, while users with many medium risk queries are flagged for human review. +One additional consideration is that instead of treating content moderation as a binary classification problem, you can instead create multiple categories to represent various risk levels. Creating multiple risk levels allows you to adjust the aggressiveness of your moderation. For example, you might want to automatically block user queries that are deemed high risk, whereas users with many medium risk queries are flagged for human review. ```python Python @@ -1077,7 +1077,7 @@ One additional consideration is that instead of treating content moderation as a { Model = Model.ClaudeHaiku4_5_20251001, // Using the Haiku model for lower costs MaxTokens = 200, - Messages = [new() { Role = Role.User, Content = assessmentPrompt }], + Messages = [new UserMessageParam { Content = assessmentPrompt }], } ); @@ -1429,7 +1429,7 @@ This code implements an `assess_risk_level` function that uses Claude to evaluat Within the function, a prompt is generated for Claude, including the message to be assessed, the unsafe categories, and specific instructions for evaluating the risk level. The prompt instructs Claude to respond with a JSON object that includes the risk level, the violated categories, and an optional explanation. -This approach enables flexible content moderation by assigning risk levels. It can be seamlessly integrated into a larger system to automate content filtering or flag comments for human review based on their assessed risk level. For instance, when running this code, the comment `Delete this post now or you better hide. I am coming after you and your family.` is identified as high risk because of its dangerous threat. Conversely, the comment `Stay away from the 5G cellphones!! They are using 5G to control you.` is categorized as medium risk. +This approach allows flexible content moderation by assigning risk levels. It can be seamlessly integrated into a larger system to automate content filtering or flag comments for human review based on their assessed risk level. For instance, when you run this code, the comment `Delete this post now or you better hide. I am coming after you and your family.` is identified as high risk because of its dangerous threat. Conversely, the comment `Stay away from the 5G cellphones!! They are using 5G to control you.` is categorized as medium risk. ### Deploy your prompt @@ -1445,7 +1445,7 @@ Once you are confident in the quality of your solution, it's time to deploy it t ## Improve performance -In complex scenarios, it may be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview). Here are some advanced strategies: +In complex scenarios, it might be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview). Here are some advanced strategies: ### Define topics and provide examples @@ -1726,7 +1726,7 @@ In addition to listing the unsafe categories in the prompt, further improvements { Model = Model.ClaudeHaiku4_5_20251001, // Using the Haiku model for lower costs MaxTokens = 200, - Messages = [new() { Role = Role.User, Content = assessmentPrompt }], + Messages = [new UserMessageParam { Content = assessmentPrompt }], } ); @@ -2384,7 +2384,7 @@ To reduce costs in situations where real-time moderation isn't necessary, consid { Model = Model.ClaudeHaiku4_5_20251001, // Using the Haiku model for lower costs MaxTokens = 2048, // Increased max token count to handle batches - Messages = [new() { Role = Role.User, Content = assessmentPrompt }], + Messages = [new UserMessageParam { Content = assessmentPrompt }], } ); @@ -2728,10 +2728,10 @@ To reduce costs in situations where real-time moderation isn't necessary, consid ``` -In this example, the `batch_moderate_messages` function handles the moderation of an entire batch of messages with a single Claude API call. Inside the function, a prompt is created that includes the list of messages to evaluate and the unsafe content categories. The prompt directs Claude to return a JSON object listing all messages that contain violations. Each message in the response is identified by its `id`, which corresponds to the message's position in the batch. Keep in mind that finding the optimal batch size for your specific needs may require some experimentation. While larger batch sizes can lower costs, they might also lead to a slight decrease in quality. Additionally, you may need to increase the `max_tokens` parameter in the Claude API call to accommodate longer responses. For details on the maximum number of tokens your chosen model can output, refer to the [model comparison table](https://platform.claude.com/docs/en/models/overview#latest-models-comparison). +In this example, the `batch_moderate_messages` function handles the moderation of an entire batch of messages with a single Claude API call. Inside the function, a prompt is created that includes the list of messages to evaluate and the unsafe content categories. The prompt directs Claude to return a JSON object listing all messages that contain violations. Each message in the response is identified by its `id`, which corresponds to the message's position in the batch. Keep in mind that finding the optimal batch size for your specific needs might require some experimentation. Although larger batch sizes can lower costs, they might also lead to a slight decrease in quality. Additionally, you might need to increase the `max_tokens` parameter in the Claude API call to accommodate longer responses. For details on the maximum number of tokens your chosen model can output, refer to the [model comparison table](https://platform.claude.com/docs/en/models/overview#latest-models-comparison). - + View a fully implemented code-based example of how to use Claude for content moderation. diff --git a/content/en/about-claude/use-case-guides/customer-support-chat.md b/content/en/about-claude/use-case-guides/customer-support-chat.md index d8789be01e..e5191cf991 100644 --- a/content/en/about-claude/use-case-guides/customer-support-chat.md +++ b/content/en/about-claude/use-case-guides/customer-support-chat.md @@ -21,7 +21,7 @@ pip install anthropic streamlit python-dotenv ### Decide whether to use Claude for support chat -Here are some key indicators that you should employ an LLM like Claude to automate portions of your customer support process: +Here are some key indicators that you should employ an LLM such as Claude to automate portions of your customer support process: @@ -29,11 +29,11 @@ Here are some key indicators that you should employ an LLM like Claude to automa - Claude can quickly retrieve, process, and combine information from vast knowledge bases, while human agents may need time to research or consult multiple sources. + Claude can quickly retrieve, process, and combine information from vast knowledge bases, whereas human agents might need time to research or consult multiple sources. - Claude can provide round-the-clock support without fatigue, whereas staffing human agents for continuous coverage can be costly and challenging. + Claude can provide support at all hours without fatigue, whereas staffing human agents for continuous coverage can be costly and challenging. @@ -41,14 +41,14 @@ Here are some key indicators that you should employ an LLM like Claude to automa - You can instruct Claude to consistently represent your brand's tone and values, whereas human agents may vary in their communication styles. + You can instruct Claude to consistently represent your brand's tone and values, whereas human agents might vary in their communication styles. Some considerations for choosing Claude over other LLMs: * You prioritize natural, nuanced conversation: Claude's sophisticated language understanding allows for more natural, context-aware conversations that feel more human-like than chats with other LLMs. -* You often receive complex and open-ended queries: Claude can handle a wide range of topics and inquiries without generating canned responses or requiring extensive programming of permutations of user utterances. +* You often receive complex and open-ended queries: Claude can handle a wide range of topics and inquiries without generating scripted responses or requiring extensive programming of permutations of user utterances. * You need scalable multilingual support: Claude's multilingual capabilities allow it to engage in conversations in over 200 languages without the need for separate chatbots or extensive translation processes for each supported language. ### Define your ideal chat interaction @@ -63,7 +63,7 @@ Here is an example chat interaction for car insurance customer support: * **Customer:** Asks about insurance for their new electric car * **Claude:** Provides relevant information about electric vehicle coverage -* **Customer:** Asks questions related to unique needs for electric vehicle insurances +* **Customer:** Asks questions related to unique needs for electric vehicle insurance * **Claude:** Responds with accurate and informative answers and provides links to the sources * **Customer:** Asks off-topic questions unrelated to insurance or cars @@ -71,17 +71,17 @@ Here is an example chat interaction for car insurance customer support: * **Customer:** Expresses interest in an insurance quote - * **Claude:** Ask a set of questions to determine the appropriate quote, adapting to their responses + * **Claude:** Asks a set of questions to determine the appropriate quote, adapting to their responses * **Claude:** Sends a request to use the quote generation API tool along with necessary information collected from the user * **Claude:** Receives the response information from the API tool use, synthesizes the information into a natural response, and presents the provided quote to the user -* **Customer:** Asks follow up questions +* **Customer:** Asks follow-up questions - * **Claude:** Answers follow up questions as needed + * **Claude:** Answers follow-up questions as needed * **Claude:** Guides the customer to the next steps in the insurance process and closes out the conversation - In the real example that you write for your own use case, you might find it useful to write out the actual words in this interaction so that you can also get a sense of the ideal tone, response length, and level of detail you want Claude to have. + In the real example that you write for your own use case, you might find it useful to write the actual words in this interaction so that you can also get a sense of the ideal tone, response length, and level of detail you want Claude to have. ### Break the interaction into unique tasks @@ -133,31 +133,31 @@ Here are criteria and benchmarks that can be used to evaluate how successfully C - This metric evaluates how accurately Claude understands customer inquiries across various topics. Measure this by reviewing a sample of conversations and assessing whether Claude has the correct interpretation of customer intent, critical next steps, what successful resolution looks like, and more. Aim for a comprehension accuracy of 95% or higher. + This metric evaluates how accurately Claude interprets customer inquiries across various topics. Measure this by reviewing a sample of conversations and assessing whether Claude has the correct interpretation of customer intent, critical next steps, what successful resolution looks like, and more. Aim for a comprehension accuracy of 95 percent or higher. - This assesses how well Claude's response addresses the customer's specific question or issue. Evaluate a set of conversations and rate the relevance of each response (using LLM-based grading for scale). Target a relevance score of 90% or above. + This assesses how well Claude's response addresses the customer's specific question or issue. Evaluate a set of conversations and rate the relevance of each response (using LLM-based grading for scale). Target a relevance score of 90 percent or above. - Assess the correctness of general company and product information provided to the user, based on the information provided to Claude in context. Target 100% accuracy in this introductory information. + Assess the correctness of general company and product information provided to the user, based on the information provided to Claude in context. Target 100 percent accuracy in this introductory information. - Track the frequency and relevance of links or sources offered. Target providing relevant sources in 80% of interactions where additional information could be beneficial. + Track the frequency and relevance of links or sources offered. Target providing relevant sources in 80 percent of interactions where additional information could be beneficial. - Measure how well Claude stays on topic, such as the topic of car insurance in the example implementation. Aim for 95% of responses to be directly related to car insurance or the customer's specific query. + Measure how well Claude stays on topic, such as the topic of car insurance in the example implementation. Aim for 95 percent of responses to be directly related to car insurance or the customer's specific query. - Measure how successful Claude is at determining when to generate informational content and how relevant that content is. For example, in this implementation, you would be determining how well Claude understands when to generate a quote and how accurate that quote is. Target 100% accuracy, as this is vital information for a successful customer interaction. + Measure how successful Claude is at determining when to generate informational content and how relevant that content is. For example, in this implementation, you would be determining how well Claude identifies when to generate a quote and how accurate that quote is. Target 100 percent accuracy, as this is vital information for a successful customer interaction. - This measures Claude's ability to recognize when a query needs human intervention and escalate appropriately. Track the percentage of correctly escalated conversations versus those that should have been escalated but weren't. Aim for an escalation accuracy of 95% or higher. + This measures Claude's ability to recognize when a query needs human intervention and escalate appropriately. Track the percentage of correctly escalated conversations versus those that should have been escalated but weren't. Aim for an escalation accuracy of 95 percent or higher. @@ -165,11 +165,11 @@ Here are criteria and benchmarks that can be used to evaluate the business impac - This assesses Claude's ability to maintain or improve customer sentiment throughout the conversation. Use sentiment analysis tools to measure sentiment at the beginning and end of each conversation. Aim for maintained or improved sentiment in 90% of interactions. + This assesses Claude's ability to maintain or improve customer sentiment throughout the conversation. Use sentiment analysis tools to measure sentiment at the beginning and end of each conversation. Aim for maintained or improved sentiment in 90 percent of interactions. - The percentage of customer inquiries successfully handled by the chatbot without human intervention. Typically aim for 70-80% deflection rate, depending on the complexity of inquiries. + The percentage of customer inquiries successfully handled by the chatbot without human intervention. Typically aim for a 70–80 percent deflection rate, depending on the complexity of inquiries. @@ -185,9 +185,9 @@ Here are criteria and benchmarks that can be used to evaluate the business impac ### Choose the right Claude model -The choice of model depends on the trade-offs between cost, accuracy, and response time. +The choice of model depends on the trade-offs among cost, accuracy, and response time. -For customer support chat, Claude Opus 5.5 is well suited to balance intelligence, latency, and cost, including the most complex support scenarios that require deep reasoning across long, multi-step conversations. However, for instances where you have conversation flow with multiple prompts including RAG, tool use, or long-context prompts, Claude Haiku 5.5 may be more suitable to optimize for latency. [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) is its main control for speed: `low` is the fastest level, suited to chat and short tool tasks. +For customer support chat, Claude Opus 5.5 is well suited to balance intelligence, latency, and cost, including the most complex support scenarios that require deep reasoning across long, multistep conversations. However, for instances where you have conversation flow with multiple prompts including RAG, tool use, or long-context prompts, Claude Haiku 5.5 might be more suitable to optimize for latency. [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) is its main control for speed: `low` is the fastest level, suited to chat and short tool tasks. ### Build a strong prompt @@ -203,7 +203,7 @@ insurance. You can also help customers get quotes for their insurance needs.""" ``` - While you may be tempted to put all your information inside a system prompt as a way to separate instructions from the user conversation, Claude actually works best with the bulk of its prompt content written inside the first + Although you might be tempted to put all your information inside a system prompt as a way to separate instructions from the user conversation, Claude actually works best with the bulk of its prompt content written inside the first `User` @@ -280,7 +280,7 @@ that gives you the confidence to enjoy every electron-powered mile. """ ``` -Now that you have your static content, add at least 4-5 sample "good" interactions to guide Claude's responses. These examples should be representative of your ideal customer interaction and can include elements such as guardrails and tool calls. +Now that you have your static content, add at least 4–5 sample "good" interactions to guide Claude's responses. These examples should be representative of your ideal customer interaction and can include elements such as guardrails and tool calls. ```python EXAMPLES = """ @@ -349,7 +349,7 @@ Once you provide this information, I'll use our quoting tool to generate a perso """ ``` -You will also want to include any important instructions outlining dos and don'ts for how Claude should interact with the customer. This may draw from brand guardrails or support policies. +You will also want to include any important instructions outlining dos and don'ts for how Claude should interact with the customer. This might draw from brand guardrails or support policies. ```python ADDITIONAL_GUARDRAILS = """Please adhere to the following guardrails: @@ -384,7 +384,7 @@ Claude is capable of taking actions and retrieving information dynamically using For this example, start with one tool for calculating the quote. - As a reminder, this tool will not perform the actual calculation, it will just signal to the application that a tool should be used with whatever arguments specified. + As a reminder, this tool does not perform the actual calculation; it just signals to the application that a tool should be used with whatever arguments specified. Add the model name, the tool definition, and a stub implementation to `config.py`: @@ -424,8 +424,8 @@ TOOLS = [ def get_quote(make, model, year, mileage, driver_age): """Returns the premium per month in USD""" - # You can call an http endpoint or a database to get the quote. - # Here, we simulate a delay of 1 seconds and return a fixed quote of 100. + # You can call an HTTP endpoint or a database to get the quote. + # This example simulates a delay of 1 second and returns a fixed quote of 100. time.sleep(1) return 100 ``` @@ -660,7 +660,7 @@ The class should have two main methods: one that calls the API to generate a mes public async Task ProcessUserInput(string userInput) { - Messages.Add(new() { Role = Role.User, Content = userInput }); + Messages.Add(new UserMessageParam { Content = userInput }); var responseMessage = await GenerateMessage(Messages, maxTokens: 2048); @@ -668,16 +668,14 @@ The class should have two main methods: one that calls the API to generate a mes { var toolResult = HandleToolUse(toolUse.Name, toolUse.Input); - Messages.Add(new() + Messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = responseMessage.Content .Select(contentBlock => new ContentBlockParam(contentBlock.Json)) .ToList(), }); - Messages.Add(new() + Messages.Add(new UserMessageParam { - Role = Role.User, Content = new List { new ToolResultBlockParam { ToolUseID = toolUse.ID, Content = toolResult }, @@ -690,7 +688,7 @@ The class should have two main methods: one that calls the API to generate a mes { if (block.TryPickText(out var followUpText)) { - Messages.Add(new() { Role = Role.Assistant, Content = followUpText.Text }); + Messages.Add(new AssistantMessageParam { Content = followUpText.Text }); return followUpText.Text; } } @@ -702,7 +700,7 @@ The class should have two main methods: one that calls the API to generate a mes { if (block.TryPickText(out var textBlock)) { - Messages.Add(new() { Role = Role.Assistant, Content = textBlock.Text }); + Messages.Add(new AssistantMessageParam { Content = textBlock.Text }); return textBlock.Text; } } @@ -859,10 +857,7 @@ The class should have two main methods: one that calls the API to generate a mes } String processUserInput(String userInput) { - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content(userInput) - .build()); + messages.add(MessageParam.ofUser(userInput)); Message responseMessage = generateMessage(messages, 2048); @@ -874,18 +869,13 @@ The class should have two main methods: one that calls the API to generate a mes (Map) toolUse._input().asObject().orElseThrow(); String result = handleToolUse(toolUse.name(), toolInput); - messages.add(MessageParam.builder() - .role(MessageParam.Role.ASSISTANT) - .contentOfBlockParams(content.stream().map(ContentBlock::toParam).toList()) - .build()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(List.of(ContentBlockParam.ofToolResult( - ToolResultBlockParam.builder() - .toolUseId(toolUse.id()) - .content(result) - .build()))) - .build()); + messages.add(MessageParam.ofAssistantOfContentBlockParams( + content.stream().map(ContentBlock::toParam).toList())); + messages.add(MessageParam.ofUserOfContentBlockParams(List.of(ContentBlockParam.ofToolResult( + ToolResultBlockParam.builder() + .toolUseId(toolUse.id()) + .content(result) + .build())))); Message followUpResponse = generateMessage(messages, 2048); @@ -894,10 +884,7 @@ The class should have two main methods: one that calls the API to generate a mes .findFirst() .orElseThrow(() -> new IllegalStateException("An error occurred: Unexpected response type")); String responseText = followUpBlock.asText().text(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.ASSISTANT) - .content(responseText) - .build()); + messages.add(MessageParam.ofAssistant(responseText)); return responseText; } else { ContentBlock textBlock = content.stream() @@ -905,10 +892,7 @@ The class should have two main methods: one that calls the API to generate a mes .findFirst() .orElseThrow(() -> new IllegalStateException("An error occurred: Unexpected response type")); String responseText = textBlock.asText().text(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.ASSISTANT) - .content(responseText) - .build()); + messages.add(MessageParam.ofAssistant(responseText)); return responseText; } } @@ -932,18 +916,19 @@ The class should have two main methods: one that calls the API to generate a mes ```php PHP use Anthropic\Client; + use Anthropic\Messages\AssistantMessageParam; use Anthropic\Messages\Message; - use Anthropic\Messages\MessageParam; use Anthropic\Messages\TextBlock; use Anthropic\Messages\ToolResultBlockParam; use Anthropic\Messages\ToolUseBlock; + use Anthropic\Messages\UserMessageParam; class ChatBot { // MODEL, IDENTITY, TOOLS, and get_quote() mirror the config.py values // defined earlier in this guide (shown in Python). - /** @var list */ + /** @var list */ public private(set) array $messages = []; public function __construct( @@ -951,7 +936,7 @@ The class should have two main methods: one that calls the API to generate a mes ) {} /** - * @param list $messages + * @param list $messages */ public function generateMessage(array $messages, int $maxTokens): Message { @@ -966,7 +951,7 @@ The class should have two main methods: one that calls the API to generate a mes public function processUserInput(string $userInput): string { - $this->messages[] = MessageParam::with(role: 'user', content: $userInput); + $this->messages[] = UserMessageParam::with(content: $userInput); $responseMessage = $this->generateMessage($this->messages, maxTokens: 2048); @@ -976,9 +961,8 @@ The class should have two main methods: one that calls the API to generate a mes if ($lastBlock instanceof ToolUseBlock) { $toolResult = $this->handleToolUse($lastBlock->name, $lastBlock->input); - $this->messages[] = MessageParam::with(role: 'assistant', content: $content); - $this->messages[] = MessageParam::with( - role: 'user', + $this->messages[] = AssistantMessageParam::with(content: $content); + $this->messages[] = UserMessageParam::with( content: [ ToolResultBlockParam::with(toolUseID: $lastBlock->id, content: $toolResult), ], @@ -994,14 +978,14 @@ The class should have two main methods: one that calls the API to generate a mes throw new \RuntimeException('An error occurred: Unexpected response type'); } - $this->messages[] = MessageParam::with(role: 'assistant', content: $firstBlock->text); + $this->messages[] = AssistantMessageParam::with(content: $firstBlock->text); return $firstBlock->text; } $firstBlock = array_find($content, static fn ($block): bool => $block instanceof TextBlock); if ($firstBlock instanceof TextBlock) { - $this->messages[] = MessageParam::with(role: 'assistant', content: $firstBlock->text); + $this->messages[] = AssistantMessageParam::with(content: $firstBlock->text); return $firstBlock->text; } @@ -1091,9 +1075,9 @@ The class should have two main methods: one that calls the API to generate a mes ### Build your user interface -Test deploying this code with Streamlit using a main method. This `main()` function sets up a Streamlit-based chat interface. Streamlit is a Python framework, so this part of the walkthrough is shown in Python only; the ChatBot class above is the piece you can port to any language. +Test deploying this code with Streamlit using a main method. This `main()` function sets up a Streamlit-based chat interface. Streamlit is a Python framework, so this part of the walkthrough is shown in Python only; the ChatBot class shown earlier is the piece you can port to any language. -Do this in a file called `app.py` +Do this in a file called `app.py`: ```python import streamlit as st @@ -1145,7 +1129,7 @@ Prompting often requires testing and optimization for it to be production ready. ### Improve performance -In complex scenarios, it may be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview) & [guardrail implementation strategies](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations). Here are some common scenarios: +In complex scenarios, it might be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview) and [guardrail implementation strategies](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations). Here are some common scenarios: #### Reduce long context latency with RAG @@ -1159,19 +1143,19 @@ Implementing RAG for support use cases has been shown to increase accuracy, redu When dealing with queries that require real-time information, such as account balances or policy details, embedding-based RAG approaches are not sufficient. Instead, tool use can enhance your chatbot's ability to provide accurate, real-time responses. For example, you can use tool use to look up customer information, retrieve order details, and cancel orders on behalf of the customer. -This approach, [outlined in the tool use: customer service agent recipe](https://platform.claude.com/cookbook/tool-use-customer-service-agent), lets you integrate live data into Claude's responses and provide a more personalized and efficient customer experience. +This approach, outlined in the [tool use: customer service agent recipe](https://platform.claude.com/cookbook/tool-use-customer-service-agent), lets you integrate live data into Claude's responses and provide a more personalized and efficient customer experience. #### Strengthen input and output guardrails -When deploying a chatbot, especially in customer service scenarios, it's important to prevent risks associated with misuse, out-of-scope queries, and inappropriate responses. While Claude is inherently resilient to such scenarios, here are additional steps to strengthen your chatbot guardrails: +When deploying a chatbot, especially in customer service scenarios, it's important to prevent risks associated with misuse, out-of-scope queries, and inappropriate responses. Although Claude is inherently resilient to such scenarios, here are additional steps to strengthen your chatbot guardrails: * [Reduce hallucination](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations): Implement fact-checking mechanisms and [citations](https://platform.claude.com/cookbook/misc-using-citations) to ground responses in provided information. * Cross-check information: Verify that the agent's responses align with your company's policies and known facts. * Avoid contractual commitments: Ensure the agent doesn't make promises or enter into agreements it's not authorized to make. -* [Mitigate jailbreaks](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks): Use methods like harmlessness screens and input validation to prevent users from exploiting model vulnerabilities, aiming to generate inappropriate content. +* [Mitigate jailbreaks](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks): Use methods such as harmlessness screens and input validation to prevent users from exploiting model vulnerabilities, aiming to generate inappropriate content. * Avoid mentioning competitors: Implement a competitor mention filter to maintain brand focus and not mention any competitor's products or services. * [Increase output consistency](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/increase-consistency): Prevent Claude from changing style or going out of character, even during long, complex interactions. -* Remove Personally Identifiable Information (PII): Unless explicitly required and authorized, strip out any PII from responses. +* Remove personally identifiable information (PII): Unless explicitly required and authorized, strip out any PII from responses. #### Reduce perceived response time with streaming @@ -1180,11 +1164,11 @@ When dealing with potentially lengthy responses, implementing streaming can impr Here is how to implement streaming: 1. Use the [Anthropic Streaming API](https://platform.claude.com/docs/en/build-with-claude/streaming) to support streaming responses. -2. Set up your frontend to handle incoming chunks of text. +2. Set up your front end to handle incoming chunks of text. 3. Display each chunk as it arrives, simulating real-time typing. 4. Implement a mechanism to save the full response, allowing users to view it if they navigate away and return. -In some cases, streaming enables the use of more advanced models with higher base latencies, as the progressive display mitigates the impact of longer processing times. +In some cases, streaming makes it possible to use more advanced models with higher base latencies, as the progressive display mitigates the impact of longer processing times. #### Scale your chatbot @@ -1193,15 +1177,15 @@ As the complexity of your chatbot grows, your application architecture can evolv * Ensure that you are making the most out of your prompts and optimizing through prompt engineering. Use the [prompt engineering guides](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview) to write the most effective prompts. * Add additional [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) to the prompt (which can include [prompt chains](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#chain-complex-prompts)) and see if you can achieve the functionality required. -If your chatbot handles incredibly varied tasks, you may want to consider adding a [separate intent classifier](https://platform.claude.com/cookbook/capabilities-classification-guide) to route the initial customer query. For the existing application, this would involve creating a decision tree that would route customer queries through the classifier and then to specialized conversations (with their own set of tools and system prompts). Note, this method requires an additional call to Claude that can increase latency. +If your chatbot handles incredibly varied tasks, you might want to consider adding a [separate intent classifier](https://platform.claude.com/cookbook/capabilities-classification-guide) to route the initial customer query. For the existing application, this would involve creating a decision tree that would route customer queries through the classifier and then to specialized conversations (with their own set of tools and system prompts). Note that this method requires an additional call to Claude that can increase latency. ### Integrate Claude into your support workflow -While these examples have focused on Python functions callable within a Streamlit environment, deploying Claude for real-time support chatbot requires an API service. +Although these examples have focused on Python functions callable within a Streamlit environment, deploying Claude for a real-time support chatbot requires an API service. Here's how you can approach this: -1. Create an API wrapper: Develop a simple API wrapper around your classification function. For example, you can use Flask API or Fast API to wrap your code into a HTTP Service. Your HTTP service could accept the user input and return the Assistant response in its entirety. Thus, your service could have the following characteristics: +1. Create an API wrapper: Develop a simple API wrapper around your classification function. For example, you can use Flask or FastAPI to wrap your code into an HTTP service. Your HTTP service could accept the user input and return the Assistant response in its entirety. Thus, your service could have the following characteristics: * Server-Sent Events (SSE): SSE allows for real-time streaming of responses from the server to the client. This provides a smooth, interactive experience when working with LLMs. * Caching: Implementing caching can improve response times and reduce unnecessary API calls. diff --git a/content/en/about-claude/use-case-guides/legal-summarization.md b/content/en/about-claude/use-case-guides/legal-summarization.md index 78b5691dfa..2af708732f 100644 --- a/content/en/about-claude/use-case-guides/legal-summarization.md +++ b/content/en/about-claude/use-case-guides/legal-summarization.md @@ -1,10 +1,10 @@ --- title: Legal summarization url: https://platform.claude.com/docs/en/about-claude/use-case-guides/legal-summarization -description: This guide walks through how to leverage Claude's advanced natural language processing capabilities to efficiently summarize legal documents, extracting key information and expediting legal research. With Claude, you can streamline the review of contracts, litigation prep, and regulatory work, saving time and ensuring accuracy in your legal processes. +description: This guide walks through how to use Claude's advanced natural language processing capabilities to efficiently summarize legal documents, extracting key information and expediting legal research. With Claude, you can streamline the review of contracts, litigation prep, and regulatory work, saving time and ensuring accuracy in your legal processes. --- -> Visit the [summarization cookbook](https://platform.claude.com/cookbook/capabilities-summarization-guide) to see an example legal summarization implementation using Claude. +> Visit the [summarization recipe](https://platform.claude.com/cookbook/capabilities-summarization-guide) in the Claude Cookbook to see an example legal summarization implementation using Claude. ## Before building with Claude @@ -14,7 +14,7 @@ Here are some key indicators that you should employ an LLM such as Claude to sum - Large-scale document review can be time-consuming and expensive when done manually. Claude can process and summarize vast amounts of legal documents rapidly, significantly reducing the time and cost associated with document review. This capability is particularly valuable for tasks like due diligence, contract analysis, or litigation discovery, where efficiency is crucial. + Large-scale document review can be time-consuming and expensive when done manually. Claude can process and summarize vast amounts of legal documents rapidly, significantly reducing the time and cost associated with document review. This capability is particularly valuable for tasks such as due diligence, contract analysis, or litigation discovery, where efficiency is crucial. @@ -30,7 +30,7 @@ Here are some key indicators that you should employ an LLM such as Claude to sum - Claude can assist in legal research by quickly analyzing large volumes of case law, statutes, and legal commentary. It can identify relevant precedents, extract key legal principles, and summarize complex legal arguments. This capability can significantly speed up the research process, allowing legal professionals to focus on higher-level analysis and strategy development. + Claude can help with legal research by quickly analyzing large volumes of case law, statutes, and legal commentary. It can identify relevant precedents, extract key legal principles, and summarize complex legal arguments. This capability can significantly speed up the research process, allowing legal professionals to focus on higher-level analysis and strategy development. @@ -121,7 +121,7 @@ For instance, when summarizing a sublease agreement, you might want to extract t ### Establish success criteria -Evaluating the quality of summaries is a notoriously challenging task. Unlike many other natural language processing tasks, evaluation of summaries often lacks clear-cut, objective metrics. The process can be highly subjective, with different readers valuing different aspects of a summary. Here are criteria you may want to consider when assessing how well Claude performs legal summarization. +Evaluating the quality of summaries is a notoriously challenging task. Unlike many other natural language processing tasks, evaluation of summaries often lacks clear-cut, objective metrics. The process can be highly subjective, with different readers valuing different aspects of a summary. Here are criteria you might want to consider when assessing how well Claude performs legal summarization. @@ -157,7 +157,7 @@ See the guide on [establishing success criteria](https://platform.claude.com/doc ### Select the right Claude model -Model accuracy is extremely important when summarizing legal documents. Claude Opus 5.5 is an excellent choice for use cases such as this where high accuracy is required. If the size and quantity of your documents is large such that costs start to become a concern, you can also try using a smaller model such as Claude Haiku 5.5. +Model accuracy is extremely important when summarizing legal documents. Claude Opus 5.5 is an excellent choice for use cases such as this where high accuracy is required. If the size and quantity of your documents are large such that costs start to become a concern, you can also try using a smaller model such as Claude Haiku 5.5. To help estimate these costs, the following is a comparison of the cost to summarize 1,000 sublease agreements using Opus and Haiku models: @@ -186,7 +186,7 @@ To help estimate these costs, the following is a comparison of the cost to summa * Total cost: $54.00 + $7.75 = $61.75 USD - Actual costs may differ from these estimates. The token counts come from running the example in the + Actual costs might differ from these estimates. The token counts come from running the example in the [Build a strong prompt](https://platform.claude.com/docs/en/about-claude/use-case-guides/legal-summarization#build-a-strong-prompt) @@ -194,7 +194,7 @@ To help estimate these costs, the following is a comparison of the cost to summa [long-prompt prices](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing) - . A document whose prompt stays at or under 100,000 tokens pays $0.10/MTok input and $0.50/MTok output instead. To see which prices apply, count your documents with + . A document whose prompt stays at or under 100,000 tokens pays $0.10 / $0.50 USD per million input / output tokens instead. To see which prices apply, count your documents with [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) @@ -211,7 +211,7 @@ To help estimate these costs, the following is a comparison of the cost to summa ### Transform documents into a format that Claude can process -Before you begin summarizing documents, you need to prepare your data. This involves extracting text from PDFs, cleaning the text, and ensuring it's ready to be processed by Claude. +Before you start summarizing documents, you need to prepare your data. This involves extracting text from PDFs, cleaning the text, and ensuring it's ready to be processed by Claude. Here is a demonstration of this process on a sample PDF: @@ -465,7 +465,7 @@ Here is a demonstration of this process on a sample PDF: ``` -In this example, you first download a PDF of a sample sublease agreement used in the [summarization cookbook](https://platform.claude.com/cookbook/capabilities-summarization-guide). This agreement was sourced from a publicly available sublease agreement from the [sec.gov website](https://www.sec.gov/Archives/edgar/data/1045425/000119312507044370/dex1032.htm). +In this example, you first download a PDF of a sample sublease agreement used in the Claude Cookbook's [summarization recipe](https://platform.claude.com/cookbook/capabilities-summarization-guide). This agreement was sourced from a publicly available sublease agreement from the [sec.gov website](https://www.sec.gov/Archives/edgar/data/1045425/000119312507044370/dex1032.htm). The example uses the `pypdf` (typescript: `pdf-parse`; csharp: `PdfPig`; go: `github.com/ledongthuc/pdf`; java: `org.apache.pdfbox:pdfbox`; php: `smalot/pdfparser`; ruby: `pdf-reader`) library to extract the contents of the PDF and convert it to text. The text data is then cleaned by removing page numbers and extra whitespace. @@ -618,7 +618,7 @@ Here’s an example of how to create a prompt that ensures the generated summari Model = model, MaxTokens = maxTokens, System = "You are a legal analyst specializing in real estate law, known for highly accurate and detailed summaries of sublease agreements.", - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], } ); @@ -835,11 +835,11 @@ This code implements a `summarize_document` (typescript, go, java: `summarizeDoc Within the function, a prompt is generated for Claude, including the document to be summarized, the details to extract, and specific instructions for summarizing the document. The prompt instructs Claude to respond with a summary of each detail to extract nested within XML headers. -Because the code outputs each section of the summary within tags, each section can easily be parsed out as a post-processing step. This approach enables structured summaries that can be adapted for your use case, so that each summary follows the same pattern. +Because the code outputs each section of the summary within tags, each section can be parsed out as a post-processing step. This approach makes it possible to create structured summaries that can be adapted for your use case, so that each summary follows the same pattern. ### Evaluate your prompt -Prompting often requires testing and optimization for it to be production ready. To determine the readiness of your solution, evaluate the quality of your summaries using a systematic process combining quantitative and qualitative methods. Creating a [strong empirical evaluation](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests#build-evaluations) based on your defined success criteria allows you to optimize your prompts. Here are some metrics you may want to include within your empirical evaluation: +Prompting often requires testing and optimization for it to be production ready. To determine the readiness of your solution, evaluate the quality of your summaries using a systematic process combining quantitative and qualitative methods. Creating a [strong empirical evaluation](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests#build-evaluations) based on your defined success criteria allows you to optimize your prompts. Here are some metrics you might want to include within your empirical evaluation: @@ -873,15 +873,15 @@ Here are some additional considerations to keep in mind as you deploy your solut 1. **Ensure no liability:** Understand the legal implications of errors in the summaries, which could lead to legal liability for your organization or clients. Provide disclaimers or legal notices clarifying that the summaries are generated by AI and should be reviewed by legal professionals. -2. **Handle diverse document types:** This guide discusses how to extract text from PDFs. In the real world, documents may come in a variety of formats (such as PDFs, Word documents, and text files). Ensure your data extraction pipeline can convert all of the file formats you expect to receive. +2. **Handle diverse document types:** This guide discusses how to extract text from PDFs. In the real world, documents might come in a variety of formats (such as PDFs, Word documents, and text files). Ensure your data extraction pipeline can convert all of the file formats you expect to receive. -3. **Parallelize API calls to Claude:** Long documents with a large number of tokens may require up to a minute for Claude to generate a summary. For large document collections, you may want to send API calls to Claude in parallel so that the summaries can be completed in a reasonable timeframe. Refer to Anthropic’s [rate limits](https://platform.claude.com/docs/en/api/rate-limits#rate-limits) to determine the maximum amount of API calls that can be performed in parallel. +3. **Parallelize API calls to Claude:** Long documents with a large number of tokens might require up to a minute for Claude to generate a summary. For large document collections, you might want to send API calls to Claude in parallel so that the summaries can be completed in a reasonable timeframe. Refer to Anthropic’s [rate limits](https://platform.claude.com/docs/en/api/rate-limits#rate-limits) to determine the maximum number of API calls that can be performed in parallel. *** ## Improve performance -In complex scenarios, it may be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview). Here are some advanced strategies: +In complex scenarios, it might be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview). Here are some advanced strategies: ### Perform meta-summarization to summarize long documents @@ -1066,7 +1066,7 @@ Here's an example of how to perform meta-summarization: Model = model, MaxTokens = maxTokens, System = "You are a legal expert that summarizes notes on one document.", - Messages = [new() { Role = Role.User, Content = finalSummaryPrompt }], + Messages = [new UserMessageParam { Content = finalSummaryPrompt }], } ); @@ -1331,19 +1331,19 @@ Note that the `summarize_long_document` (typescript, go, java: `summarizeLongDoc ### Use summary indexed documents to explore a large collection of documents -Searching a collection of documents with an LLM usually involves retrieval-augmented generation (RAG). However, in scenarios involving large documents or when precise information retrieval is crucial, a basic RAG approach may be insufficient. Summary indexed documents is an advanced RAG approach that provides a more efficient way of ranking documents for retrieval, using less context than traditional RAG methods. In this approach, you first use Claude to generate a concise summary for each document in your corpus, and then use Claude to rank the relevance of each summary to the query being asked. For further details on this approach, including a code-based example, check out the summary indexed documents section in the [summarization cookbook](https://platform.claude.com/cookbook/capabilities-summarization-guide). +Searching a collection of documents with an LLM usually involves retrieval-augmented generation (RAG). However, in scenarios involving large documents or when precise information retrieval is crucial, a basic RAG approach might be insufficient. Summary indexed documents is an advanced RAG approach that provides a more efficient way of ranking documents for retrieval, using less context than traditional RAG methods. In this approach, you first use Claude to generate a concise summary for each document in your corpus, and then use Claude to rank the relevance of each summary to the query being asked. For further details on this approach, including a code-based example, see the summary indexed documents section in the [summarization recipe](https://platform.claude.com/cookbook/capabilities-summarization-guide). ### Fine-tune Claude to learn from your dataset Another advanced technique to improve Claude's ability to generate summaries is fine-tuning. Fine-tuning involves training Claude on a custom dataset that specifically aligns with your legal summarization needs, ensuring that Claude adapts to your use case. Here’s an overview on how to perform fine-tuning: -1. **Identify errors:** Start by collecting instances where Claude’s summaries fall short - this could include missing critical legal details, misunderstanding context, or using inappropriate legal terminology. +1. **Identify errors:** Start by collecting instances where Claude’s summaries are inadequate. This could include missing critical legal details, misunderstanding context, or using inappropriate legal terminology. -2. **Curate a dataset:** Once you've identified these issues, compile a dataset of these problematic examples. This dataset should include the original legal documents alongside your corrected summaries, ensuring that Claude learns the desired behavior. +2. **Curate a dataset:** Once you've identified these issues, compile a dataset of these problematic examples. This dataset should include the original legal documents alongside your corrected summaries, ensuring that Claude learns the behavior you want. 3. **Perform fine-tuning:** Fine-tuning involves retraining the model on your curated dataset to adjust its weights and parameters. This retraining helps Claude better adapt to the specific requirements of your legal domain, improving its ability to summarize documents according to your standards. -4. **Iterative improvement:** Fine-tuning is not a one-time process. As Claude continues to generate summaries, you can iteratively add new examples where it has underperformed, further refining its capabilities. Over time, this continuous feedback loop will result in a model that is highly specialized for your legal summarization tasks. +4. **Improve iteratively:** Fine-tuning is not a one-time process. As Claude continues to generate summaries, you can iteratively add new examples where it has underperformed, further refining its capabilities. Over time, this continuous feedback loop will result in a model that is highly specialized for your legal summarization tasks. Fine-tuning is currently only available through Amazon Bedrock. Additional details are available in the @@ -1354,11 +1354,11 @@ Another advanced technique to improve Claude's ability to generate summaries is - + View a fully implemented code-based example of how to use Claude to summarize contracts. - - Explore the Citations cookbook recipe for guidance on how to ensure accuracy and explainability of information. + + Explore the Citations recipe for guidance on how to ensure accuracy and explainability of information. diff --git a/content/en/about-claude/use-case-guides/ticket-routing.md b/content/en/about-claude/use-case-guides/ticket-routing.md index ab6ef95f73..8e6aa2d3f8 100644 --- a/content/en/about-claude/use-case-guides/ticket-routing.md +++ b/content/en/about-claude/use-case-guides/ticket-routing.md @@ -1,7 +1,7 @@ --- title: Ticket routing url: https://platform.claude.com/docs/en/about-claude/use-case-guides/ticket-routing -description: This guide walks through how to harness Claude's advanced natural language understanding capabilities to classify customer support tickets at scale based on customer intent, urgency, prioritization, customer profile, and more. +description: This guide walks through how to use Claude's advanced natural language understanding capabilities to classify customer support tickets at scale based on customer intent, urgency, prioritization, customer profile, and more. --- ## Prerequisites @@ -12,7 +12,7 @@ description: This guide walks through how to harness Claude's advanced natural l ## Define whether to use Claude for ticket routing -Here are some key indicators that you should use an LLM like Claude instead of traditional ML approaches for your classification task: +Here are some key indicators that you should use an LLM such as Claude instead of traditional ML approaches for your classification task: @@ -31,7 +31,7 @@ Here are some key indicators that you should use an LLM like Claude instead of t Traditional ML approaches often rely on bag-of-words models or simple pattern matching. Claude excels at understanding and applying underlying rules when classes are defined by conditions rather than examples. - + Many traditional ML models provide little insight into their decision-making process. Claude can provide human-readable explanations for its classification decisions, building trust in the automation system and facilitating easy adaptation if needed. @@ -52,7 +52,7 @@ Here are some key indicators that you should use an LLM like Claude instead of t Before you automate, it's crucial to understand your existing ticketing system. Start by investigating how your support team currently handles ticket routing. -Consider questions like: +Consider questions such as: * What criteria are used to determine what SLA/service offering is applied? * Is ticket routing used to determine which tier of support or product specialist a ticket goes to? @@ -149,7 +149,7 @@ Here are some example user intent categories and subcategories. -In addition to intent, ticket routing and prioritization may also be influenced by other factors such as urgency, customer type, SLAs, or language. Be sure to consider other routing criteria when building your automated routing system. +In addition to intent, ticket routing and prioritization might also be influenced by other factors such as urgency, customer type, SLAs, or language. Be sure to consider other routing criteria when building your automated routing system. ### Establish success criteria @@ -159,27 +159,27 @@ Here are some standard criteria and benchmarks when using LLMs for support ticke - This metric assesses how consistently Claude classifies similar tickets over time. It's crucial for maintaining routing reliability. Measure this by periodically testing the model with a set of standardized inputs and aiming for a consistency rate of 95% or higher. + This metric assesses how consistently Claude classifies similar tickets over time. It's crucial for maintaining routing reliability. Measure this by periodically testing the model with a set of standardized inputs and aiming for a consistency rate of 95 percent or higher. - This measures how quickly Claude can adapt to new categories or changing ticket patterns. Test this by introducing new ticket types and measuring the time it takes for the model to achieve satisfactory accuracy (for example, >90%) on these new categories. Aim for adaptation within 50–100 sample tickets. + This measures how quickly Claude can adapt to new categories or changing ticket patterns. Test this by introducing new ticket types and measuring the time it takes for the model to achieve satisfactory accuracy (for example, more than 90 percent) on these new categories. Aim for adaptation within 50–100 sample tickets. - This assesses Claude's ability to accurately route tickets in multiple languages. Measure the routing accuracy across different languages, aiming for no more than a 5–10% drop in accuracy for non-primary languages. + This assesses Claude's ability to accurately route tickets in multiple languages. Measure the routing accuracy across different languages, aiming for no more than a 5–10 percent drop in accuracy for non-primary languages. - This evaluates Claude's performance on unusual or complex tickets. Create a test set of edge cases and measure the routing accuracy, aiming for at least 80% accuracy on these challenging inputs. + This evaluates Claude's performance on unusual or complex tickets. Create a test set of edge cases and measure the routing accuracy, aiming for at least 80 percent accuracy on these challenging inputs. - This measures Claude's fairness in routing across different customer demographics. Regularly audit routing decisions for potential biases, aiming for consistent routing accuracy (within 2–3%) across all customer groups. + This measures Claude's fairness in routing across different customer demographics. Regularly audit routing decisions for potential biases, aiming for consistent routing accuracy (within 2–3 percent) across all customer groups. - In situations where minimizing token count is crucial, this criteria assesses how well Claude performs with minimal context. Measure routing accuracy with varying amounts of context provided, aiming for 90%+ accuracy with just the ticket title and a brief description. + In situations where minimizing token count is crucial, this criterion assesses how well Claude performs with minimal context. Measure routing accuracy with varying amounts of context provided, aiming for at least 90 percent accuracy with just the ticket title and a brief description. @@ -187,11 +187,11 @@ Here are some standard criteria and benchmarks when using LLMs for support ticke -Here are some common success criteria that may be useful regardless of whether an LLM is used: +Here are some common success criteria that might be useful regardless of whether an LLM is used: - Routing accuracy measures how often tickets are correctly assigned to the appropriate team or individual on the first try. This is typically measured as a percentage of correctly routed tickets out of total tickets. Industry benchmarks often aim for 90–95% accuracy, though this can vary based on the complexity of the support structure. + Routing accuracy measures how often tickets are correctly assigned to the appropriate team or individual on the first try. This is typically measured as a percentage of correctly routed tickets out of total tickets. Industry benchmarks often aim for 90–95 percent accuracy, though this can vary based on the complexity of the support structure. @@ -199,11 +199,11 @@ Here are some common success criteria that may be useful regardless of whether a - The rerouting rate indicates how often tickets need to be reassigned after initial routing. A lower rate suggests more accurate initial routing. Aim for a rerouting rate below 10%, with top-performing systems achieving rates as low as 5% or less. + The rerouting rate indicates how often tickets need to be reassigned after initial routing. A lower rate suggests more accurate initial routing. Aim for a rerouting rate below 10 percent, with top-performing systems achieving rates as low as 5 percent or less. - This measures the percentage of tickets resolved during the first interaction with the customer. Higher rates indicate efficient routing and well-prepared support teams. Industry benchmarks typically range from 70–75%, with top performers achieving rates of 80% or higher. + This measures the percentage of tickets resolved during the first interaction with the customer. Higher rates indicate efficient routing and well-prepared support teams. Industry benchmarks typically range from 70–75 percent, with top performers achieving rates of 80 percent or higher. @@ -211,31 +211,31 @@ Here are some common success criteria that may be useful regardless of whether a - Often measured through post-interaction surveys, these scores reflect overall customer happiness with the support process. Effective routing contributes to higher satisfaction. Aim for CSAT scores of 90% or higher, with top performers often achieving 95%+ satisfaction rates. + Often measured through post-interaction surveys, these scores reflect overall customer happiness with the support process. Effective routing contributes to higher satisfaction. Aim for CSAT scores of 90 percent or higher, with top performers often achieving satisfaction rates of at least 95 percent. - This measures how often tickets need to be escalated to higher tiers of support. Lower escalation rates often indicate more accurate initial routing. Strive for an escalation rate below 20%, with best-in-class systems achieving rates of 10% or less. + This measures how often tickets need to be escalated to higher tiers of support. Lower escalation rates often indicate more accurate initial routing. Strive for an escalation rate below 20 percent, with best-in-class systems achieving rates of 10 percent or less. - This metric looks at how many tickets agents can handle effectively after implementing the routing solution. Improved routing should increase productivity. Measure this by tracking tickets resolved per agent per day or hour, aiming for a 10–20% improvement after implementing a new routing system. + This metric looks at how many tickets agents can handle effectively after implementing the routing solution. Improved routing should increase productivity. Measure this by tracking tickets resolved per agent per day or hour, aiming for a 10–20 percent improvement after implementing a new routing system. - This measures the percentage of potential tickets resolved through self-service options before entering the routing system. Higher rates indicate effective pre-routing triage. Aim for a deflection rate of 20–30%, with top performers achieving rates of 40% or higher. + This measures the percentage of potential tickets resolved through self-service options before entering the routing system. Higher rates indicate effective pre-routing triage. Aim for a deflection rate of 20–30 percent, with top performers achieving rates of 40 percent or higher. - This metric calculates the average cost to resolve each support ticket. Efficient routing should help reduce this cost over time. While benchmarks vary widely, many organizations aim to reduce cost per ticket by 10–15% after implementing an improved routing system. + This metric calculates the average cost to resolve each support ticket. Efficient routing should help reduce this cost over time. Although benchmarks vary widely, many organizations aim to reduce cost per ticket by 10–15 percent after implementing an improved routing system. ### Choose the right Claude model -The choice of model depends on the trade-offs between cost, accuracy, and response time. +The choice of model depends on the trade-offs among cost, accuracy, and response time. -Claude Haiku 5.5 (`claude-haiku-5-5`) suits ticket routing: it's the fastest and most cost-effective current model, and at `low` effort it handles simple, high-volume requests such as classification. If your classification problem requires deep subject matter expertise or a large volume of intent categories, or complex reasoning, you may opt for the [larger Sonnet model](https://platform.claude.com/docs/en/models/overview). +Claude Haiku 5.5 (`claude-haiku-5-5`) suits ticket routing: it's the fastest and most cost-effective current model, and at `low` effort it handles simple, high-volume requests such as classification. If your classification problem requires deep subject matter expertise, a large volume of intent categories, or complex reasoning, you may opt for the [larger Sonnet model](https://platform.claude.com/docs/en/models/overview). ### Build a strong prompt @@ -689,7 +689,7 @@ Having Claude split its response into separate XML tag sections lets you use reg It’s hard to know how well your prompt works without deploying it in a test production setting and [running evaluations](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests). -Build the deployment structure. Start by defining the method signature for wrapping the call to Claude. Extend the method you began writing earlier, which takes `ticket_contents` (typescript, csharp, go, java: `ticketContents`; php: `$ticketContents`) as input, so that it now returns the reasoning and the intent as output. If you have an existing automation using traditional ML, you'll want to follow that method signature instead. +Build the deployment structure. Start by defining the function signature for wrapping the call to Claude. Extend the function you started writing earlier, which takes `ticket_contents` (typescript, csharp, go, java: `ticketContents`; php: `$ticketContents`) as input, so that it now returns the reasoning and the intent as output. If you have an existing automation using traditional ML, you'll want to follow that method signature instead. @@ -802,7 +802,7 @@ Build the deployment structure. Start by defining the method signature for wrapp Model = DefaultModel, MaxTokens = 2048, OutputConfig = new OutputConfig { Effort = Effort.Low }, - Messages = [new() { Role = Role.User, Content = classificationPrompt }], + Messages = [new UserMessageParam { Content = classificationPrompt }], }); var reasoningAndIntent = ""; foreach (var block in message.Content) @@ -1028,14 +1028,14 @@ To run your evaluation, you need test cases to run it on. The rest of this guide ### Build an evaluation function -The example evaluation for this guide measures Claude’s performance along three key metrics: +The example evaluation for this guide measures Claude’s performance along two key metrics: * Accuracy * Cost per classification -You may need to assess Claude on other axes depending on what factors that are important to you. +You may need to assess Claude on other axes depending on which factors are important to you. -To assess this, first modify the script to add a function that compares the predicted intent with the actual intent and calculates the percentage of correct predictions. Then add cost calculation and time measurement functionality. +To assess this, first modify the script so that it compares the predicted intent with the actual intent. Then have it return the API call's token usage, from which you can calculate cost. @@ -1159,7 +1159,7 @@ To assess this, first modify the script to add a function that compares the pred Model = DefaultModel, MaxTokens = 2048, OutputConfig = new OutputConfig { Effort = Effort.Low }, - Messages = [new() { Role = Role.User, Content = classificationPrompt }], + Messages = [new UserMessageParam { Content = classificationPrompt }], }); // Get the usage statistics for the API call for how many input and output tokens were used. var usage = message.Usage; @@ -1397,30 +1397,30 @@ To assess this, first modify the script to add a function that compares the pred Here is a breakdown of the edits: -* The `classify_support_request` (typescript, go, java, php: `classifySupportRequest`; csharp: `ClassifySupportRequest`) method now takes the `actual_intent` (typescript, csharp, go, java: `actualIntent`; php: `$actualIntent`) from the test cases and compares it against Claude’s intent classification to assess whether they match. -* The method extracts usage statistics for the API call to calculate cost based on input and output tokens used. +* The `classify_support_request` (typescript, go, java, php: `classifySupportRequest`; csharp: `ClassifySupportRequest`) function now takes the `actual_intent` (typescript, csharp, go, java: `actualIntent`; php: `$actualIntent`) from the test cases and compares it against Claude’s intent classification to assess whether they match. +* The function extracts usage statistics for the API call to calculate cost based on input and output tokens used. ### Run your evaluation -A proper evaluation requires clear thresholds and benchmarks to determine what is a good result. The preceding script returns the runtime values for accuracy, response time, and cost per classification, but you still need clearly established thresholds. For example: +A proper evaluation requires clear thresholds and benchmarks to determine what is a good result. The preceding script returns the values you need to measure accuracy and cost per classification, but you still need clearly established thresholds. For example: * **Accuracy:** 95% (out of 100 tests) * **Cost per classification:** 50% reduction on average (across 100 tests) from current routing method -Having these thresholds allows you to quickly and easily tell at scale, and with impartial empiricism, what method is best for you and what changes might need to be made to better fit your requirements. +Having these thresholds allows you to tell at scale, and with impartial empiricism, what method is best for you and what changes might need to be made to better fit your requirements. *** ## Improve performance -In complex scenarios, it may be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview) & [guardrail implementation strategies](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations). Here are some common scenarios: +In complex scenarios, it might be helpful to consider additional strategies to improve performance beyond standard [prompt engineering techniques](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview) and [guardrail implementation strategies](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations). Here are some common scenarios: ### Use a taxonomic hierarchy for cases with 20+ intent categories As the number of classes grows, the number of examples required also expands, potentially making the prompt unwieldy. As an alternative, you can consider implementing a hierarchical classification system using a mixture of classifiers. 1. Organize your intents in a taxonomic tree structure. -2. Create a series of classifiers at every level of the tree, enabling a cascading routing approach. +2. Create a series of classifiers at every level of the tree to make a cascading routing approach possible. For example, you might have a top-level classifier that broadly categorizes tickets into "Technical Issues," "Billing Questions," and "General Inquiries." Each of these categories can then have its own sub-classifier to further refine the classification. @@ -1454,7 +1454,7 @@ flowchart LR * **Pros - greater nuance and accuracy:** You can create different prompts for each parent path, allowing for more targeted and context-specific classification. This can lead to improved accuracy and more nuanced handling of customer requests. -* **Cons - increased latency:** Be advised that multiple classifiers can lead to increased latency, and Anthropic recommends implementing this approach with the fastest model, Haiku. +* **Cons - increased latency:** Multiple classifiers can lead to increased latency, and Anthropic recommends implementing this approach with the fastest model, Haiku. ### Use vector databases and similarity search retrieval to handle highly variable tickets @@ -1462,27 +1462,27 @@ Despite providing examples being the most effective way to improve performance, In this scenario, you could employ a vector database to do similarity searches from a dataset of examples and retrieve the most relevant examples for a given query. -This approach, outlined in detail in the [classification recipe](https://platform.claude.com/cookbook/capabilities-classification-guide), has been shown to improve performance from 71% accuracy to 93% accuracy. +This approach, outlined in detail in the [classification recipe](https://platform.claude.com/cookbook/capabilities-classification-guide), has been shown to improve performance from 71 percent accuracy to 93 percent accuracy. ### Account specifically for expected edge cases -Here are some scenarios where Claude may misclassify tickets (there may be others that are unique to your situation). In these scenarios, consider providing explicit instructions or examples in the prompt of how Claude should handle the edge case: +Here are some scenarios where Claude might misclassify tickets (there might be others that are unique to your situation). In these scenarios, consider providing explicit instructions or examples in the prompt of how Claude should handle the edge case: - Customers often express needs indirectly. For example, "I've been waiting for my package for over two weeks now" may be an indirect request for order status. + Customers often express needs indirectly. For example, "I've been waiting for my package for over two weeks now" might be an indirect request for order status. * **Solution:** Provide Claude with some real customer examples of these kinds of requests, along with what the underlying intent is. You can get even better results if you include a classification rationale for particularly nuanced ticket intents, so that Claude can better generalize the logic to other tickets. - When customers express dissatisfaction, Claude may prioritize addressing the emotion over solving the underlying problem. + When customers express dissatisfaction, Claude might prioritize addressing the emotion over solving the underlying problem. * **Solution:** Provide Claude with directions on when to prioritize customer sentiment or not. It can be something as simple as “Ignore all customer emotions. Focus only on analyzing the intent of the customer’s request and what information the customer might be asking for.” - When customers present multiple issues in a single interaction, Claude may have difficulty identifying the primary concern. + When customers present multiple issues in a single interaction, Claude might have difficulty identifying the primary concern. * **Solution:** Clarify the prioritization of intents so that Claude can better rank the extracted intents and identify the primary concern. @@ -1504,11 +1504,11 @@ For either of these approaches, you need to wrap your script in a service. The c *** - - Visit the classification cookbook for more example code and detailed eval guidance. + + Visit the classification recipe for more example code and detailed eval guidance. - Begin building and evaluating your workflow on the Claude Console. + Start building and evaluating your workflow on the Claude Console. diff --git a/content/en/agents-and-tools/agent-skills/best-practices.md b/content/en/agents-and-tools/agent-skills/best-practices.md index 9fe5418fd6..79d5844c64 100644 --- a/content/en/agents-and-tools/agent-skills/best-practices.md +++ b/content/en/agents-and-tools/agent-skills/best-practices.md @@ -6,27 +6,27 @@ description: Learn how to write effective Skills that Claude can discover and us Good Skills are concise, well-structured, and tested with real usage. This guide provides practical authoring decisions to help you write Skills that Claude can discover and use effectively. -For conceptual background on how Skills work, see the [Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview). +For conceptual background on how Skills work, see [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview). ## Core principles ### Concise is key -The [context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) is a public good. Your Skill shares the context window with everything else Claude needs to know, including: +The [context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) is a public good. Your Skill shares the context window with everything else Claude needs, including: * The system prompt * Conversation history * Other Skills' metadata * Your actual request -Not every token in your Skill has an immediate cost. At startup, only the metadata (name and description) from all Skills is pre-loaded. Claude reads SKILL.md only when the Skill becomes relevant, and reads additional files only as needed. However, being concise in SKILL.md still matters: once Claude loads it, every token competes with conversation history and other context. +Not every token in your Skill has an immediate cost. At startup, only the metadata (name and description) from all Skills is pre-loaded. Claude reads `SKILL.md` only when the Skill becomes relevant, and reads additional files only as needed. However, being concise in `SKILL.md` still matters: once Claude loads it, every token competes with conversation history and other context. **Default assumption:** Claude is already very smart Only add context Claude doesn't already have. Challenge each piece of information: * "Does Claude really need this explanation?" -* "Can I assume Claude knows this?" +* "Can I assume Claude has this information?" * "Does this paragraph justify its token cost?" **Good example: Concise** (approximately 50 tokens): @@ -162,7 +162,7 @@ What works perfectly for Opus might need more detail for Haiku. If you plan to u * Cannot contain XML tags * Should describe what the Skill does and when to use it - For complete Skill structure details, see the [Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#skill-structure). + For complete Skill structure details, see [Skill structure](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#skill-structure) in Agent Skills. ### Naming conventions @@ -194,13 +194,13 @@ Remember that the `name` field must use lowercase letters, numbers, and hyphens Consistent naming makes it easier to: * Reference Skills in documentation and conversations -* Understand what a Skill does at a glance +* Understand what a Skill does from its name * Organize and search through multiple Skills * Maintain a professional, cohesive skill library ### Writing effective descriptions -The `description` field enables Skill discovery and should include both what the Skill does and when to use it. +The `description` field makes Skill discovery possible and should include both what the Skill does and when to use it. **Always write in third person**. The description is injected into the system prompt, and inconsistent point-of-view can cause discovery problems. @@ -212,7 +212,7 @@ The `description` field enables Skill discovery and should include both what the **Be specific and include key terms**. Include both what the Skill does and specific triggers/contexts for when to use it. -Each Skill has exactly one description field. The description is critical for skill selection: Claude uses it to choose the right Skill from potentially 100+ available Skills. Your description must provide enough detail for Claude to know when to select this Skill, while the rest of SKILL.md provides the implementation details. +Each Skill has exactly one description field. The description is critical for skill selection: Claude uses it to choose the right Skill from potentially 100+ available Skills. Your description must provide enough detail for Claude to determine when to select this Skill, whereas the rest of `SKILL.md` provides the implementation details. Effective examples: @@ -234,7 +234,7 @@ description: Analyze Excel spreadsheets, create pivot tables, generate charts. U description: Generate descriptive commit messages by analyzing git diffs. Use when the user asks for help writing commit messages or reviewing staged changes. ``` -Avoid vague descriptions like these: +Avoid vague descriptions such as these: ```yaml description: Helps with documents @@ -250,17 +250,17 @@ description: Does stuff with files ### Progressive disclosure patterns -SKILL.md serves as an overview that points Claude to detailed materials as needed, like a table of contents in an onboarding guide. For an explanation of how progressive disclosure works, see [How Skills work](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#how-skills-work) in the overview. +`SKILL.md` serves as an overview that points Claude to detailed materials as needed, like a table of contents in an onboarding guide. For an explanation of how progressive disclosure works, see [How Skills work](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#how-skills-work) in the overview. **Practical guidance:** -* Keep SKILL.md body under 500 lines for optimal performance +* Keep `SKILL.md` body under 500 lines for optimal performance * Split content into separate files when approaching this limit * Use the following patterns to organize instructions, code, and resources effectively #### Visual overview: From simple to complex -A basic Skill starts with just a SKILL.md file containing metadata and instructions: +A basic Skill starts with just a `SKILL.md` file containing metadata and instructions: ![Simple SKILL.md file showing YAML frontmatter and markdown body](https://platform.claude.com/docs/images/agent-skills-simple-file.svg) @@ -269,7 +269,7 @@ A basic Skill starts with just a SKILL.md file containing metadata and instructi As your Skill grows, you can bundle additional content that Claude loads only when needed: - ![Bundling additional reference files like reference.md and forms.md.](https://platform.claude.com/docs/images/agent-skills-bundling-content.svg) + ![Bundling additional reference files such as reference.md and forms.md.](https://platform.claude.com/docs/images/agent-skills-bundling-content.svg) The complete Skill directory structure might look like this: @@ -286,7 +286,7 @@ The complete Skill directory structure might look like this: * `scripts/` - * `analyze_form.py`: Utility script (executed, not loaded) + * `analyze_form.py`: Utility script (run, not loaded) * `fill_form.py`: Form filling script * `validate.py`: Validation script @@ -316,7 +316,7 @@ with pdfplumber.open("file.pdf") as pdf: **Examples**: See [EXAMPLES.md](EXAMPLES.md) for common patterns ```` -Claude loads FORMS.md, REFERENCE.md, or EXAMPLES.md only when needed. +Claude loads `FORMS.md`, `REFERENCE.md`, or `EXAMPLES.md` only when needed. #### Pattern 2: Domain-specific organization @@ -356,7 +356,7 @@ grep -i "api usage" reference/product.md #### Pattern 3: Conditional details -Show basic content, link to advanced content: +Show basic content and link to advanced content: ```markdown # DOCX Processing @@ -373,15 +373,15 @@ For simple edits, modify the XML directly. **For OOXML details**: See [OOXML.md](OOXML.md) ``` -Claude reads REDLINING.md or OOXML.md only when the user needs those features. +Claude reads `REDLINING.md` or `OOXML.md` only when the user needs those features. ### Avoid deeply nested references -Claude may partially read files when they're referenced from other referenced files. When encountering nested references, Claude might use commands like `head -100` to preview content rather than reading entire files, resulting in incomplete information. +Claude might partially read files when they're referenced from other referenced files. When encountering nested references, Claude might use commands such as `head -100` to preview content rather than reading entire files, resulting in incomplete information. -**Keep references one level deep from SKILL.md**. All reference files should link directly from SKILL.md to ensure Claude reads complete files when needed. +**Keep references one level deep from `SKILL.md`**. All reference files should link directly from `SKILL.md` to ensure Claude reads complete files when needed. -**Bad example: Too deep**: +**Bad example: Too deep:** ```markdown # SKILL.md @@ -394,7 +394,7 @@ See [details.md](details.md)... Here's the actual information... ``` -**Good example: One level deep**: +**Good example: One level deep:** ```markdown # SKILL.md @@ -405,7 +405,7 @@ Here's the actual information... **Examples**: See [examples.md](examples.md) ``` -### Structure longer reference files with table of contents +### Structure longer reference files with a table of contents For reference files longer than 100 lines, include a table of contents at the top. This ensures Claude can see the full scope of available information even when previewing with partial reads. @@ -430,7 +430,7 @@ For reference files longer than 100 lines, include a table of contents at the to Claude can then read the complete file or jump to specific sections as needed. -For details on how this filesystem-based architecture enables progressive disclosure, see the [Runtime environment](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#runtime-environment) section later in this guide. +For details on how this filesystem-based architecture makes progressive disclosure possible, see the [Runtime environment](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#runtime-environment) section later in this guide. ## Workflows and feedback loops @@ -549,7 +549,7 @@ This pattern greatly improves output quality. 5. Finalize and save the document ``` -This shows the validation loop pattern using reference documents instead of scripts. The "validator" is STYLE\_GUIDE.md, and Claude performs the check by reading and comparing. +This shows the validation loop pattern using reference documents instead of scripts. The "validator" is `STYLE_GUIDE.md`, and Claude performs the check by reading and comparing. **Example 2: Document editing process** (for Skills with code): @@ -614,9 +614,9 @@ Choose one term and use it throughout the Skill: **Bad - Inconsistent:** -* Mix "API endpoint", "URL", "API route", "path" -* Mix "field", "box", "element", "control" -* Mix "extract", "pull", "get", "retrieve" +* Mix "API endpoint," "URL," "API route," "path" +* Mix "field," "box," "element," "control" +* Mix "extract," "pull," "get," "retrieve" Consistency helps Claude parse and follow instructions. @@ -740,7 +740,7 @@ Guide Claude through decision points: ``` - If workflows become large or complicated with many steps, consider pushing them into separate files and tell Claude to read the appropriate file based on the task at hand. + If workflows become large or complicated with many steps, consider pushing them into separate files and tell Claude to read the appropriate file based on the current task. ## Evaluation and iteration @@ -751,13 +751,13 @@ Guide Claude through decision points: **Evaluation-driven development:** -1. **Identify gaps:** Run Claude on representative tasks without a Skill. Document specific failures or missing context -2. **Create evaluations:** Build three scenarios that test these gaps -3. **Establish baseline:** Measure Claude's performance without the Skill -4. **Write minimal instructions:** Create just enough content to address the gaps and pass evaluations -5. **Iterate:** Execute evaluations, compare against baseline, and refine +1. **Identify gaps:** Run Claude on representative tasks without a Skill. Document specific failures or missing context. +2. **Create evaluations:** Build three scenarios that test these gaps. +3. **Establish baseline:** Measure Claude's performance without the Skill. +4. **Write minimal instructions:** Create just enough content to address the gaps and pass evaluations. +5. **Iterate:** Run evaluations, compare against baseline, and refine. -This approach ensures you're solving actual problems rather than anticipating requirements that may never materialize. +This approach ensures you're solving actual problems rather than anticipating requirements that might never materialize. **Evaluation structure:** @@ -775,12 +775,12 @@ This approach ensures you're solving actual problems rather than anticipating re ``` - This example demonstrates a data-driven evaluation with a simple testing rubric. There is not currently a built-in way to run these evaluations. Users can create their own evaluation system. Evaluations are your source of truth for measuring Skill effectiveness. + This example demonstrates a data-driven evaluation with a simple testing rubric. There is not currently a built-in way to run these evaluations. You can create your own evaluation system. Evaluations are your source of truth for measuring Skill effectiveness. ### Develop Skills iteratively with Claude -The most effective Skill development process involves Claude itself. Work with one instance of Claude ("Claude A") to create a Skill that is used by other instances ("Claude B"). Claude A helps you design and refine instructions, while Claude B tests them in real tasks. This works because Claude models understand both how to write effective agent instructions and what information agents need. +The most effective Skill development process involves Claude itself. Work with one instance of Claude ("Claude A") to create a Skill that is used by other instances ("Claude B"). Claude A helps you design and refine instructions, whereas Claude B tests them in real tasks. This works because Claude models can both write effective agent instructions and identify what information agents need. **Creating a new Skill:** @@ -793,7 +793,7 @@ The most effective Skill development process involves Claude itself. Work with o 3. **Ask Claude A to create a Skill:** "Create a Skill that captures this BigQuery analysis pattern we just used. Include the table schemas, naming conventions, and the rule about filtering test accounts." - Claude models understand the Skill format and structure natively. You don't need special system prompts or a "writing skills" skill to get Claude to help create Skills. Simply ask Claude to create a Skill and it generates properly structured SKILL.md content with appropriate frontmatter and body content. + Claude models handle the Skill format and structure natively. You don't need special system prompts or a "writing skills" skill to get Claude to help create Skills. Ask Claude to create a Skill and it generates properly structured `SKILL.md` content with appropriate frontmatter and body content. 4. **Review for conciseness:** Check that Claude A hasn't added unnecessary explanations. Ask: "Remove the explanation about what win rate means - Claude already knows that." @@ -806,7 +806,7 @@ The most effective Skill development process involves Claude itself. Work with o **Iterating on existing Skills:** -The same hierarchical pattern continues when improving Skills. You alternate between: +The same hierarchical pattern continues when improving Skills. You alternate among: * **Working with Claude A** (the expert who helps refine the Skill) * **Testing with Claude B** (the agent using the Skill to perform real work) @@ -818,9 +818,9 @@ The same hierarchical pattern continues when improving Skills. You alternate bet **Example observation:** "When I asked Claude B for a regional sales report, it wrote the query but forgot to filter out test accounts, even though the Skill mentions this rule." -3. **Return to Claude A for improvements:** Share the current SKILL.md and describe what you observed. Ask: "I noticed Claude B forgot to filter test accounts when I asked for a regional report. The Skill mentions filtering, but maybe it's not prominent enough?" +3. **Return to Claude A for improvements:** Share the current `SKILL.md` and describe what you observed. Ask: "I noticed Claude B forgot to filter test accounts when I asked for a regional report. The Skill mentions filtering, but maybe it's not prominent enough?" -4. **Review Claude A's suggestions:** Claude A might suggest reorganizing to make rules more prominent, using stronger language such as "MUST filter" instead of "always filter," or restructuring the workflow section. +4. **Review Claude A's recommendations:** Claude A might recommend reorganizing to make rules more prominent, using stronger language such as "MUST filter" instead of "always filter," or restructuring the workflow section. 5. **Apply and test changes:** Update the Skill with Claude A's refinements, then test again with Claude B on similar requests @@ -828,22 +828,22 @@ The same hierarchical pattern continues when improving Skills. You alternate bet **Gathering team feedback:** -1. Share Skills with teammates and observe their usage +1. Share Skills with teammates and observe their usage. 2. Ask: Does the Skill activate when expected? Are instructions clear? What's missing? -3. Incorporate feedback to address gaps in your own usage patterns +3. Incorporate feedback to address gaps in your own usage patterns. -**Why this approach works:** Claude A understands agent needs, you provide domain expertise, Claude B reveals gaps through real usage, and iterative refinement improves Skills based on observed behavior rather than assumptions. +**Why this approach works:** Claude A identifies agent needs, you provide domain expertise, Claude B reveals gaps through real usage, and iterative refinement improves Skills based on observed behavior rather than assumptions. ### Observe how Claude navigates Skills As you iterate on Skills, pay attention to how Claude actually uses them in practice. Watch for: -* **Unexpected exploration paths:** Does Claude read files in an order you didn't anticipate? This might indicate your structure isn't as intuitive as you thought -* **Missed connections:** Does Claude fail to follow references to important files? Your links might need to be more explicit or prominent -* **Overreliance on certain sections:** If Claude repeatedly reads the same file, consider whether that content should be in the main SKILL.md instead -* **Ignored content:** If Claude never accesses a bundled file, it might be unnecessary or poorly signaled in the main instructions +* **Unexpected exploration paths:** Does Claude read files in an order you didn't anticipate? This might indicate your structure isn't as intuitive as you thought. +* **Missed connections:** Does Claude fail to follow references to important files? Your links might need to be more explicit or prominent. +* **Overreliance on certain sections:** If Claude repeatedly reads the same file, consider whether that content should be in the main `SKILL.md` instead. +* **Ignored content:** If Claude never accesses a bundled file, it might be unnecessary or poorly signaled in the main instructions. -Iterate based on these observations rather than assumptions. The 'name' and 'description' in your Skill's metadata are particularly critical. Claude uses these when determining whether to trigger the Skill in response to the current task. Make sure they clearly describe what the Skill does and when it should be used. +Iterate based on these observations rather than assumptions. The `name` and `description` in your Skill's metadata are particularly critical. Claude uses these when determining whether to trigger the Skill in response to the current task. Make sure they clearly describe what the Skill does and when it should be used. ## Anti-patterns to avoid @@ -854,7 +854,7 @@ Always use forward slashes in file paths, even on Windows: * ✓ **Good:** `scripts/helper.py`, `reference/guide.md` * ✗ **Avoid:** `scripts\helper.py`, `reference\guide.md` -Unix-style paths work across all platforms, while Windows-style paths cause errors on Unix systems. +Unix-style paths work across all platforms, whereas Windows-style paths cause errors on Unix systems. ### Avoid offering too many options @@ -936,7 +936,7 @@ Even if Claude could write a script, pre-made scripts offer advantages: **Benefits of utility scripts:** -* More reliable than generated code +* Are more reliable than generated code * Save tokens (no need to include code in context) * Save time (no code generation required) * Ensure consistency across uses @@ -945,11 +945,11 @@ Even if Claude could write a script, pre-made scripts offer advantages: ![Bundling executable scripts alongside instruction files](https://platform.claude.com/docs/images/agent-skills-executable-scripts.svg) -The preceding diagram shows how executable scripts work alongside instruction files. The instruction file (forms.md) references the script, and Claude can execute it without loading its contents into context. +The preceding diagram shows how executable scripts work alongside instruction files. The instruction file (`forms.md`) references the script, and Claude can run it without loading its contents into context. **Important distinction:** Make clear in your instructions whether Claude should: -* **Execute the script** (most common): "Run `analyze_form.py` to extract fields" +* **Run the script** (most common): "Run `analyze_form.py` to extract fields" * **Read it as reference** (for complex logic): "See `analyze_form.py` for the field extraction algorithm" For most utility scripts, execution is preferred because it's more reliable and efficient. See the following [Runtime environment](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#runtime-environment) section for details on how script execution works. @@ -1019,10 +1019,10 @@ When Claude performs complex, open-ended tasks, it can make mistakes. The "plan- **Why this pattern works:** -* **Catches errors early:** Validation finds problems before changes are applied -* **Machine-verifiable:** Scripts provide objective verification -* **Reversible planning:** Claude can iterate on the plan without touching originals -* **Clear debugging:** Error messages point to specific problems +* **Catches errors early:** Validation finds problems before changes are applied. +* **Machine-verifiable:** Scripts provide objective verification. +* **Reversible planning:** Claude can iterate on the plan without touching originals. +* **Clear debugging:** Error messages point to specific problems. **When to use:** Batch operations, destructive changes, complex validation rules, high-stakes operations. @@ -1035,7 +1035,7 @@ Skills run in the code execution environment with platform-specific limitations: * **claude.ai:** Can install packages from npm and PyPI and pull from GitHub repositories * **Claude API:** Has no network access and no runtime package installation -List required packages in your SKILL.md and verify they're available in the [Code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) documentation. +List required packages in your `SKILL.md` and verify they're available in the [Code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) documentation. ### Runtime environment @@ -1045,30 +1045,30 @@ Skills run in a code execution environment with filesystem access, bash commands **How Claude accesses Skills:** -1. **Metadata pre-loaded:** At startup, the name and description from all Skills' YAML frontmatter are loaded into the system prompt -2. **Files read on-demand:** Claude uses bash Read tools to access SKILL.md and other files from the filesystem when needed -3. **Scripts executed efficiently:** Utility scripts can be executed through bash without loading their full contents into context. Only the script's output consumes tokens -4. **No context penalty for large files:** Reference files, data, or documentation don't consume context tokens until actually read +1. **Metadata pre-loaded:** At startup, the name and description from all Skills' YAML frontmatter are loaded into the system prompt. +2. **Files read on-demand:** Claude uses bash Read tools to access `SKILL.md` and other files from the filesystem when needed. +3. **Scripts run efficiently:** Utility scripts can be run through bash without loading their full contents into context. Only the script's output consumes tokens. +4. **No context penalty for large files:** Reference files, data, or documentation don't consume context tokens until actually read. -* **File paths matter:** Claude navigates your skill directory like a filesystem. Use forward slashes (`reference/guide.md`), not backslashes +* **File paths matter:** Claude navigates your skill directory like a filesystem. Use forward slashes (`reference/guide.md`), not backslashes. -* **Name files descriptively:** Use names that indicate content: `form_validation_rules.md`, not `doc2.md` +* **Name files descriptively:** Use names that indicate content: `form_validation_rules.md`, not `doc2.md`. -* **Organize for discovery:** Structure directories by domain or feature +* **Organize for discovery:** Structure directories by domain or feature. * Good: `reference/finance.md`, `reference/sales.md` * Bad: `docs/file1.md`, `docs/file2.md` -* **Bundle comprehensive resources:** Include complete API docs, extensive examples, large datasets; no context penalty until accessed +* **Bundle comprehensive resources:** Include complete API docs, extensive examples, and large datasets. These incur no context penalty until accessed. -* **Prefer scripts for deterministic operations:** Write `validate_form.py` rather than asking Claude to generate validation code +* **Prefer scripts for deterministic operations:** Write `validate_form.py` rather than asking Claude to generate validation code. * **Make execution intent clear:** * "Run `analyze_form.py` to extract fields" (execute) * "See `analyze_form.py` for the extraction algorithm" (read as reference) -* **Test file access patterns:** Verify Claude can navigate your directory structure by testing with real requests +* **Test file access patterns:** Verify Claude can navigate your directory structure by testing with real requests. **Example:** @@ -1082,7 +1082,7 @@ Skills run in a code execution environment with filesystem access, bash commands * `sales.md` (pipeline data) * `product.md` (usage analytics) -When the user asks about revenue, Claude reads SKILL.md, sees the reference to `reference/finance.md`, and calls bash to read just that file. The sales.md and product.md files remain on the filesystem, consuming zero context tokens until needed. This filesystem-based model is what enables progressive disclosure. Claude can navigate and selectively load exactly what each task requires. +When the user asks about revenue, Claude reads `SKILL.md`, finds the reference to `reference/finance.md`, and calls bash to read just that file. The `sales.md` and `product.md` files remain on the filesystem, consuming zero context tokens until needed. This filesystem-based model is what makes progressive disclosure possible. Claude can navigate and selectively load exactly what each task requires. For complete details on the technical architecture, see [How Skills work](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#how-skills-work) in the Skills overview. @@ -1104,7 +1104,7 @@ Where: * `BigQuery` and `GitHub` are MCP server names * `bigquery_schema` and `create_issue` are the tool names within those servers -Without the server prefix, Claude may fail to locate the tool, especially when multiple MCP servers are available. +Without the server prefix, Claude might fail to locate the tool, especially when multiple MCP servers are available. ### Avoid assuming tools are installed @@ -1128,16 +1128,16 @@ reader = PdfReader("file.pdf") ### YAML frontmatter requirements -The SKILL.md frontmatter requires `name` and `description` fields with specific validation rules: +The `SKILL.md` frontmatter requires `name` and `description` fields with specific validation rules: * `name`: Maximum 64 characters, lowercase letters/numbers/hyphens only, no XML tags, no reserved words * `description`: Maximum 1,024 characters, non-empty, no XML tags -See the [Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#skill-structure) for complete structure details. +See [Skill structure](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#skill-structure) in Agent Skills for complete structure details. ### Token budgets -Keep SKILL.md body under 500 lines for optimal performance. If your content exceeds this, split it into separate files using the progressive disclosure patterns described earlier. For architectural details, see the [Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#how-skills-work). +Keep `SKILL.md` body under 500 lines for optimal performance. If your content exceeds this, split it into separate files using the progressive disclosure patterns described earlier. For architectural details, see [How Skills work](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#how-skills-work). ## Checklist for effective Skills @@ -1147,7 +1147,7 @@ Before sharing a Skill, verify: * [ ] Description is specific and includes key terms * [ ] Description includes both what the Skill does and when to use it -* [ ] SKILL.md body is under 500 lines +* [ ] `SKILL.md` body is under 500 lines * [ ] Additional details are in separate files (if needed) * [ ] No time-sensitive information (or in "old patterns" section) * [ ] Consistent terminology throughout diff --git a/content/en/agents-and-tools/agent-skills/claude-api-skill.md b/content/en/agents-and-tools/agent-skills/claude-api-skill.md index dd64a568df..592e8b7950 100644 --- a/content/en/agents-and-tools/agent-skills/claude-api-skill.md +++ b/content/en/agents-and-tools/agent-skills/claude-api-skill.md @@ -6,8 +6,8 @@ description: An open-source Agent Skill that provides Claude with up-to-date API The `claude-api` skill is an open-source [Agent Skill](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) that provides Claude with detailed, up-to-date reference material for building applications on two Anthropic surfaces: -* **Messages API:** The primary surface for single requests, streaming chat, tool use, batch processing, prompt caching, structured outputs, and custom agent loops. -* **Claude Managed Agents (beta):** An Anthropic-hosted surface for server-managed stateful agents with Anthropic-hosted tool execution, persistent agent configs, and per-session sandboxes. +* **Messages API:** The primary surface for single requests, streaming chat, tool use, batch processing, prompt caching, structured outputs, and custom agent loops +* **Claude Managed Agents (beta):** An Anthropic-hosted surface for server-managed stateful agents with Anthropic-hosted tool execution, persistent agent configs, and per-session sandboxes It covers eight programming languages for both the Messages API and Managed Agents: Python, TypeScript, C#, Go, Java, PHP, Ruby, and cURL. @@ -24,7 +24,7 @@ When triggered, the skill equips Claude with: * **Language-specific SDK documentation:** Installation, quick start, common patterns, and error handling for your project's language * **Tool use guidance:** Language-specific examples and [conceptual foundations](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) for function calling, including the beta tool runner where available * **Streaming patterns:** Implementation details for building chat UIs and handling incremental display -* **Batch processing:** Offline batch processing at 50% cost +* **Batch processing:** Offline batch processing at 50 percent cost * **Prompt caching:** Prefix-stability design, breakpoint placement, and silent-invalidator audit * **Model migration:** Step-by-step guidance for migrating to newer Claude models (including the breaking changes and behavior shifts on [Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-5), [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#migrating-from-claude-sonnet-5), [Claude Haiku 5.5](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide), and [Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide)) * **Preserved thinking migration:** Finding, measuring, and fixing the history edits that invalidate `thinking` blocks, available through the `/claude-api preserved-thinking-migration` subcommand @@ -33,7 +33,7 @@ When triggered, the skill equips Claude with: **For Managed Agents (beta):** -* **Onboarding flow:** An interview-driven walkthrough for setting up a new Managed Agent from scratch, available through the `/claude-api managed-agents-onboard` subcommand +* **Onboarding flow:** An interview-driven walkthrough for setting up a new Managed Agent, available through the `/claude-api managed-agents-onboard` subcommand * **Security guide check:** A read-only check of an agent's settings against [Secure your Managed Agents deployment](https://platform.claude.com/docs/en/managed-agents/secure-deployment), available through the `/claude-api managed-agents-secure` subcommand of the skill bundled with Claude Code * **Language-specific Managed Agents docs:** Creating persistent agents, starting sessions, streaming events, and handling tool confirmations for Python, TypeScript, C#, Go, Java, PHP, Ruby, and cURL * **Client patterns:** Lossless stream reconnect, `processed_at` queued/processed gate, interrupt handling, file-mount gotchas, and credential handling @@ -49,7 +49,7 @@ The skill activates in two ways: * You ask Claude to help build, debug, or optimize something with the Claude API, an Anthropic SDK, or Managed Agents * You add, modify, or tune a Claude feature in a file (prompt caching, adaptive thinking, compaction, tool use, batch, files, citations, memory) or a model reference -**Manual invocation** by typing `/claude-api` (with optional subcommand or prose) in any environment where the skill is installed. +**Manual invocation** occurs when you type `/claude-api` (with optional subcommand or prose) in any environment where the skill is installed. The skill does not activate for general programming tasks, ML/data-science work, or code that imports other AI SDKs (such as OpenAI). @@ -133,17 +133,17 @@ Let Claude Code migrate your code for you /claude-api migrate apps/api.py and apps/worker.py to the latest Claude Opus model ``` -When the scope is ambiguous (for example, a bare `/claude-api migrate to claude-opus-5-5`), the skill asks you to choose between the entire working directory, a specific subdirectory, or an explicit file list before editing any files. This applies to both Messages API and Managed Agents callers. +When the scope is ambiguous (for example, a bare `/claude-api migrate to claude-opus-5-5`), the skill asks you to choose among the entire working directory, a specific subdirectory, or an explicit file list before editing any files. This applies to both Messages API and Managed Agents callers. The skill handles: -* **Model ID swaps**, including typed SDK constants (`Model.CLAUDE_OPUS_4_8` → `Model.CLAUDE_OPUS_5_5`) across all supported languages, and classifies each file as a caller, a model definer, or an opaque string reference before editing +* **Model ID swaps**, including typed SDK constants (`Model.CLAUDE_OPUS_4_8` → `Model.CLAUDE_OPUS_5_5`) across all supported languages, and classifying each file as a caller, a model definer, or an opaque string reference before editing * **Cloud platform detection**, preserving platform-specific model ID formats (for example, the `anthropic.` prefix on Amazon Bedrock) and skipping changes for features that are unavailable on partner-operated platforms * **Breaking parameter changes**, such as removing `temperature`, `top_p`, and `top_k` for Claude Opus 4.8 and Claude Opus 4.7, and converting `thinking: {type: "enabled", budget_tokens: N}` to `thinking: {type: "adaptive"}` * **Prefill replacement**, converting assistant-message prefill patterns to [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) where applicable * **Beta header cleanup**, removing beta headers that the target model doesn't require (for example, `effort-2025-11-24`, `fine-grained-tool-streaming-2025-05-14`, `interleaved-thinking-2025-05-14`) and switching back from `client.beta.messages.create()` (go: `client.Beta.Messages.New()`; java: `client.beta().messages().create()`; csharp: `client.Beta.Messages.Create()`; php: `$client->beta->messages->create()`) to `client.messages.create()` (go: `client.Messages.New()`; java: `client.messages().create()`; csharp: `client.Messages.Create()`; php: `$client->messages->create()`) * **Effort calibration**, recommending an `output_config.effort` starting point for the target model (for example, the default `high` on Claude Opus 5, and `xhigh` for coding and agentic use cases on Claude Opus 4.8 and Claude Opus 4.7) -* **Prompt-behavior tuning**, flagging length-control, tool-triggering, subagent, and instruction-following prompts that may behave differently on the target model +* **Prompt-behavior tuning**, flagging length-control, tool-triggering, subagent, and instruction-following prompts that might behave differently on the target model * **Silent default handling**, opting back into thinking summarization (`thinking.display: "summarized"`) when reasoning is surfaced to users on Claude Opus 4.8 and Claude Opus 4.7 * **Refusal fallback configuration**, adding `stop_reason: "refusal"` handling before reading response content and setting up a [fallback retry path](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) when the target is Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, or Claude Sonnet 5.5 (the server-side `fallbacks` parameter, typically in its `"default"` mode, the SDK refusal-fallback middleware, or a fallback-credit retry), and updating fallback code written against earlier preview shapes @@ -175,7 +175,7 @@ The test requests and replays are real Messages API requests, billed at the mode ## Setting up a Managed Agent -To scaffold a new Managed Agent from scratch, invoke the `managed-agents-onboard` subcommand: +To scaffold a new Managed Agent, invoke the `managed-agents-onboard` subcommand: Let Claude Code set up your agent for you @@ -234,7 +234,7 @@ In each case, the skill loads the relevant language-specific documentation and g ## Next steps - + Learn about how Agent Skills work and the progressive disclosure model diff --git a/content/en/agents-and-tools/agent-skills/enterprise.md b/content/en/agents-and-tools/agent-skills/enterprise.md index 22ed0c089f..9fd257a8d6 100644 --- a/content/en/agents-and-tools/agent-skills/enterprise.md +++ b/content/en/agents-and-tools/agent-skills/enterprise.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterpris description: Governance, security review, evaluation, and organizational guidance for deploying Agent Skills at enterprise scale. --- -This guide is for enterprise admins and architects who need to govern Agent Skills across an organization. It covers how to vet, evaluate, deploy, and manage Skills at scale. For authoring guidance, see [best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices). For architecture details, see the [Skills overview](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview). +This guide is for enterprise admins and architects who need to govern Agent Skills across an organization. It covers how to vet, evaluate, deploy, and manage Skills at scale. For authoring guidance, see [Skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices). For architecture details, see [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview). ## Security review and vetting @@ -24,29 +24,29 @@ Evaluate each Skill against these risk indicators before approving deployment: | MCP server references | Instructions referencing MCP tools (`ServerName:tool_name`) | High: extends access beyond the Skill itself | | Network access patterns | URLs, API endpoints, `fetch`, `curl`, or `requests` calls | High: potential data exfiltration vector | | Hardcoded credentials | API keys, tokens, or passwords in Skill files or scripts | High: secrets exposed in Git history and context window | -| Filesystem access scope | Paths outside the Skill directory, broad glob patterns, path traversal (`../`) | Medium: may access unintended data | +| Filesystem access scope | Paths outside the Skill directory, broad glob patterns, path traversal (`../`) | Medium: might access unintended data | | Tool invocations | Instructions directing Claude to use bash, file operations, or other tools | Medium: review what operations are performed | ### Review checklist Before deploying any Skill from a third party or internal contributor, complete these steps: -1. **Read all Skill directory content.** Review SKILL.md, all referenced markdown files, and any bundled scripts or resources. +1. **Read all Skill directory content.** Review `SKILL.md`, all referenced markdown files, and any bundled scripts or resources. 2. **Verify script behavior matches stated purpose.** Run scripts in a sandboxed environment and confirm outputs align with the Skill's description. 3. **Check for adversarial instructions.** Look for directives that tell Claude to ignore safety rules, hide actions from users, exfiltrate data through responses, or alter behavior based on specific inputs. 4. **Check for external URL fetches or network calls.** Search scripts and instructions for network access patterns (`http`, `requests.get`, `urllib`, `curl`, `fetch`). 5. **Verify no hardcoded credentials.** Check for API keys, tokens, or passwords in Skill files. Credentials should use environment variables or secure credential stores, never appear in Skill content. -6. **Identify tools and commands the Skill instructs Claude to invoke.** List all bash commands, file operations, and tool references. Consider the combined risk when a Skill uses both file-read and network tools together. +6. **Identify tools and commands the Skill instructs Claude to run.** List all bash commands, file operations, and tool references. Consider the combined risk when a Skill uses both file-read and network tools together. 7. **Confirm redirect destinations.** If the Skill references external URLs, verify they point to expected domains. 8. **Verify no data exfiltration patterns.** Look for instructions that read sensitive data and then write, send, or encode it for external transmission, including through Claude's conversational responses. - Never deploy Skills from untrusted sources without a full audit. A malicious Skill can direct Claude to execute arbitrary code, access sensitive files, or transmit data externally. Treat Skill installation with the same rigor as installing software on production systems. + Never deploy Skills from untrusted sources without a full audit. A malicious Skill can direct Claude to run arbitrary code, access sensitive files, or transmit data externally. Treat Skill installation with the same rigor as installing software on production systems. ### Skill content scanning -Claude Enterprise organizations can turn on automated security scanning for custom Skills in claude.ai and Claude Cowork. After you turn on **Skill and plugin security scanning** at [claude.ai > Organization settings > Skills](https://claude.ai/admin-settings/skills), Skills that members then upload or edit in claude.ai or Cowork are scanned for signs of malicious behavior, such as hidden code execution, sending your data to an outside service, or instructions that tamper with Claude's safeguards. A Skill that fails the scan, or whose scan hasn't finished, is blocked from use. A Skill that passes with a warning stays usable behind a caution notice. If scanning is available to your organization, turn it on. It complements, but doesn't replace, the [review checklist](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#review-checklist). +Claude Enterprise organizations can turn on automated security scanning for custom Skills in claude.ai and Claude Cowork. After you turn on **Skill and plugin security scanning** at [claude.ai > Organization settings > Skills](https://claude.ai/admin-settings/skills), Skills that members then upload or edit in claude.ai or Cowork are scanned for signs of malicious behavior, such as hidden code execution, sending your data to an outside service, or instructions that tamper with Claude's safeguards. A Skill that fails the scan, or whose scan hasn't completed, is blocked from use. A Skill that passes with a warning stays usable behind a caution notice. If scanning is available to your organization, turn it on. It complements, but doesn't replace, the [review checklist](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#review-checklist). Scanning doesn't cover the Claude API. Skills you upload through the Skills API (`/v1/skills`), including from the Claude Console, aren't scanned, so for API deployments, rely on the review checklist and [version pinning](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#versioning-strategy). Scanning also doesn't apply to Skills that were already in your organization when you turned it on, or to organizations with certain data handling configurations, such as customer-managed encryption keys (CMEK), zero data retention (ZDR), or HIPAA readiness. For setup steps, exclusions, and result types, see [Get started with skill and plugin scanning](https://support.claude.com/en/articles/15927065-get-started-with-skill-and-plugin-scanning) in the Claude Help Center. @@ -68,9 +68,9 @@ Establish approval gates for these dimensions before deploying any Skill: ### Evaluation requirements -Require Skill authors to submit evaluation suites with 3–5 representative queries per Skill, covering cases where the Skill should trigger, should not trigger, and ambiguous edge cases. Require testing across the models your organization uses (Haiku, Sonnet, Opus), because Skill effectiveness varies by model. +Require Skill authors to submit evaluation suites with 3–5 representative queries for each Skill, covering cases where the Skill should trigger, cases where it should not trigger, and ambiguous edge cases. Require testing across the models your organization uses (Haiku, Sonnet, Opus), because Skill effectiveness varies by model. -For detailed guidance on building evaluations, see [evaluation and iteration](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#evaluation-and-iteration) in best practices. For general evaluation methodology, see [develop test cases](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests). +For detailed guidance on building evaluations, see [evaluation and iteration](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#evaluation-and-iteration) in Skill authoring best practices. For general evaluation methodology, see [Define success criteria and build evaluations](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests). ### Using evaluations for lifecycle decisions @@ -85,7 +85,7 @@ Evaluation results signal when to act: - Identify workflows that are repetitive, error-prone, or require specialized knowledge. Map these to organizational roles and determine which are candidates for Skills. + Identify workflows that are repetitive or error-prone, or that require specialized knowledge. Map these to organizational roles and determine which are candidates for Skills. @@ -97,7 +97,7 @@ Evaluation results signal when to act: - Upload through the Skills API for workspace-wide access. See [Using Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide) for upload and version management. Document the Skill in your internal registry with purpose, owner, and version. + Upload through the Skills API for workspace-wide access. See [Using Agent Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide) for upload and version management. Document the Skill in your internal registry with purpose, owner, and version. @@ -113,9 +113,9 @@ Evaluation results signal when to act: ### Recall limits -As a general guideline, limit the number of Skills loaded simultaneously to maintain reliable recall accuracy. Each Skill's metadata (name and description) competes for attention in the system prompt. With too many Skills active, Claude may fail to select the right Skill or miss relevant ones entirely. Use your evaluation suite to measure recall accuracy as you add Skills, and stop adding when performance degrades. +As a general guideline, limit the number of Skills loaded simultaneously to maintain reliable recall accuracy. Each Skill's metadata (name and description) competes for attention in the system prompt. With too many Skills active, Claude might fail to select the right Skill or miss relevant ones entirely. Use your evaluation suite to measure recall accuracy as you add Skills, and stop adding when performance degrades. -Note that API requests support a maximum of 20 Skills for each request (see [Using Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide)). If a role requires more Skills than a single request supports, consider consolidating narrow Skills into broader ones or routing requests to different Skill sets based on task type. +Note that API requests support a maximum of 20 Skills for each request (see [Using Agent Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide)). If a role requires more Skills than a single request supports, consider consolidating narrow Skills into broader ones or routing requests to different Skill sets based on task type. ### Start specific, consolidate later @@ -156,11 +156,11 @@ Each role-based bundle should contain only the Skills relevant to that role's da ### Source control -Store Skill directories in Git for history tracking, code review through pull requests, and rollback capability. Each Skill directory (containing SKILL.md and any bundled files) maps naturally to a Git-tracked folder. +Store Skill directories in Git for history tracking, code review through pull requests, and rollback capability. Each Skill directory (containing `SKILL.md` and any bundled files) maps naturally to a Git-tracked folder. ### API-based distribution -The Skills API provides workspace-scoped distribution. Skills uploaded through the API are available to all workspace members. See [Using Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide) for upload, versioning, and management endpoints. +The Skills API provides workspace-scoped distribution. Skills uploaded through the API are available to all workspace members. See [Using Agent Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide) for upload, versioning, and management endpoints. ### Versioning strategy @@ -180,15 +180,15 @@ Maintain Skill source files in Git as the single source of truth. If your organi ## Next steps - + Architecture and platform details - + Authoring guidance for Skill creators - + Upload and manage Skills programmatically diff --git a/content/en/agents-and-tools/agent-skills/overview.md b/content/en/agents-and-tools/agent-skills/overview.md index 9be73b0880..0d78b13b7a 100644 --- a/content/en/agents-and-tools/agent-skills/overview.md +++ b/content/en/agents-and-tools/agent-skills/overview.md @@ -41,7 +41,7 @@ Anthropic provides pre-built Agent Skills for common document tasks (PowerPoint, Skills use Claude's VM environment to provide capabilities beyond what's possible with prompts alone. Claude operates in a virtual machine with filesystem access, allowing Skills to exist as directories containing instructions, executable code, and reference materials, organized like an onboarding guide you'd create for a new team member. -This filesystem-based architecture enables **progressive disclosure:** Claude loads information in stages as needed, rather than consuming context upfront. +This filesystem-based architecture allows **progressive disclosure:** Claude loads information in stages as needed, rather than consuming context upfront. Skills can contain three types of content, each loaded at a different time: @@ -60,7 +60,7 @@ Claude loads this metadata at startup and includes it in the system prompt. The ### Level 2: Instructions (loaded when triggered) -The main body of SKILL.md contains procedural knowledge: workflows, best practices, and guidance: +The main body of `SKILL.md` contains procedural knowledge: workflows, best practices, and guidance: ````markdown # PDF Processing @@ -79,7 +79,7 @@ with pdfplumber.open("document.pdf") as pdf: For advanced form filling, see [FORMS.md](FORMS.md). ```` -When you request something that matches a Skill's description, Claude reads SKILL.md from the filesystem using bash. Only then does this content enter the context window. +When you request something that matches a Skill's description, Claude reads `SKILL.md` from the filesystem using bash. Only then does this content enter the context window. ### Level 3: Resources and code (loaded as needed) @@ -93,19 +93,19 @@ Skills can bundle additional materials: * `scripts/` * `fill_form.py` (utility script) -**Instructions:** Additional markdown files (FORMS.md, REFERENCE.md) containing specialized guidance and workflows +**Instructions:** Additional markdown files (`FORMS.md`, `REFERENCE.md`) containing specialized guidance and workflows -**Code:** Executable scripts (fill\_form.py, validate.py) that Claude runs using bash, providing deterministic operations without loading their code into context +**Code:** Executable scripts (`fill_form.py`, `validate.py`) that Claude runs using bash, providing deterministic operations without loading their code into context **Resources:** Reference materials such as database schemas, API documentation, templates, or examples Claude accesses these files only when referenced. The filesystem model means each content type has different strengths: instructions for flexible guidance, code for reliability, resources for factual lookup. -| Level | When loaded | Token cost | Content | -| ------------------------- | ----------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| **Level 1: Metadata** | Always (at startup) | \~100 tokens per Skill | `name` and `description` from YAML frontmatter | -| **Level 2: Instructions** | When Skill is triggered | Under 5k tokens | SKILL.md body with instructions and guidance | -| **Level 3+: Resources** | As needed | None until accessed | Bundled files. Reference files load into context when read. Scripts run through bash, and only their output enters context | +| Level | When loaded | Token cost | Content | +| ------------------------- | ----------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| **Level 1: Metadata** | Always (at startup) | \~100 tokens per Skill | `name` and `description` from YAML frontmatter | +| **Level 2: Instructions** | When Skill is triggered | Under 5k tokens | `SKILL.md` body with instructions and guidance | +| **Level 3+: Resources** | As needed | None until accessed | Bundled files. Reference files load into context when read. Scripts run through bash, and only their output enters context. | Progressive disclosure ensures only relevant content occupies the context window at any given time. @@ -114,17 +114,17 @@ Progressive disclosure ensures only relevant content occupies the context window Skills run in a code execution environment where Claude has filesystem access, bash commands, and code execution capabilities. Skills exist as directories on a virtual machine, and Claude interacts with them using the same bash commands you'd use to navigate files on your computer. - ![Agent Skills Architecture - showing how Skills integrate with the agent's configuration and virtual machine](https://platform.claude.com/docs/images/agent-skills-architecture.svg) + ![Agent Skills architecture - showing how Skills integrate with the agent's configuration and virtual machine](https://platform.claude.com/docs/images/agent-skills-architecture.svg) **How Claude accesses Skill content:** -When a Skill is triggered, Claude uses bash to read SKILL.md from the filesystem, bringing its instructions into the context window. If those instructions reference other files (such as FORMS.md or a database schema), Claude reads those files too using additional bash commands. When instructions mention executable scripts, Claude runs them through bash and receives only the output (the script code itself never enters context). +When a Skill is triggered, Claude uses bash to read `SKILL.md` from the filesystem, bringing its instructions into the context window. If those instructions reference other files (such as `FORMS.md` or a database schema), Claude reads those files too using additional bash commands. When instructions mention executable scripts, Claude runs them through bash and receives only the output (the script code itself never enters context). -**What this architecture enables:** +**What this architecture makes possible:** * **On-demand file access:** Claude reads only the files each task needs. A Skill can include dozens of reference files, but if your task only needs the sales schema, that's the one file Claude loads. The rest stay on the filesystem and cost zero tokens. -* **Efficient script execution:** When Claude runs `validate_form.py`, the script's code never loads into the context window. Only its output (such as "Validation passed" or a specific error message) consumes tokens, which makes scripts far more efficient than having Claude generate equivalent code on the fly. +* **Efficient script execution:** When Claude runs `validate_form.py`, the script's code never loads into the context window. Only its output (such as "Validation passed" or a specific error message) consumes tokens, which makes scripts far more efficient than having Claude generate equivalent code during the task. * **No practical limit on bundled content:** Files don't consume context until accessed, so Skills can include comprehensive API documentation, large datasets, or extensive examples. There's no context penalty for bundled content that isn't used. ### Example: Loading a PDF processing Skill @@ -133,9 +133,9 @@ Here's how Claude loads and uses the custom `pdf-processing` Skill from the earl 1. **Startup:** System prompt includes: `pdf-processing - Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.` 2. **User request:** "Extract the text from this PDF and summarize it" -3. **Claude invokes:** `bash: cat pdf-processing/SKILL.md` → Instructions loaded into context -4. **Claude determines:** Form filling is not needed, so FORMS.md is not read -5. **Claude executes:** Uses instructions from SKILL.md to complete the task +3. **Claude calls:** `bash: cat pdf-processing/SKILL.md` → Instructions loaded into context +4. **Claude determines:** Form filling is not needed, so `FORMS.md` is not read +5. **Claude executes:** Uses instructions from `SKILL.md` to complete the task ![Skills loading into context window - showing the progressive loading of skill metadata and content](https://platform.claude.com/docs/images/agent-skills-context-window.svg) @@ -165,7 +165,7 @@ To learn more, see [Using Agent Skills with the API](https://platform.claude.com [Claude Code](https://code.claude.com/docs/en/overview) supports custom Skills. The pre-built document Skills (PowerPoint, Excel, Word, PDF) are not available in Claude Code, though the open-source [Claude API skill](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/claude-api-skill) comes bundled with it. See the full list of [built-in commands and Skills](https://code.claude.com/docs/en/commands) that ship with Claude Code. -**Custom Skills:** Create Skills as directories with SKILL.md files. Claude discovers and uses them automatically. +**Custom Skills:** Create Skills as directories with `SKILL.md` files. Claude discovers and uses them automatically. Custom Skills in Claude Code are filesystem-based and don't require API uploads: place them in `~/.claude/skills/` (personal) or `.claude/skills/` (project). @@ -219,26 +219,26 @@ description: Brief description of what this Skill does and when to use it `description`: * Must be non-empty -* Maximum 1024 characters +* Maximum 1,024 characters * Cannot contain XML tags The `description` must include both what the Skill does and when Claude should use it. For complete authoring guidance, see [Skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices). ## Security considerations -Use Skills only from trusted sources: those you created yourself or obtained from Anthropic. Skills give Claude new capabilities through instructions and code, which also means a malicious Skill can direct Claude to invoke tools or execute code in ways that don't match the Skill's stated purpose. +Use Skills only from trusted sources: those you created yourself or obtained from Anthropic. Skills give Claude new capabilities through instructions and code, which also means a malicious Skill can direct Claude to call tools or run code in ways that don't match the Skill's stated purpose. - If you must use a Skill from an untrusted or unknown source, exercise extreme caution and thoroughly audit it before use. Depending on what access Claude has when executing the Skill, malicious Skills could lead to data exfiltration, unauthorized system access, or other security risks. + If you must use a Skill from an untrusted or unknown source, exercise extreme caution and thoroughly audit it before use. Depending on what access Claude has when running the Skill, malicious Skills could lead to data exfiltration, unauthorized system access, or other security risks. **Key security considerations:** -* **Audit thoroughly:** Review all files bundled in the Skill: SKILL.md, scripts, images, and other resources. Look for unusual patterns such as unexpected network calls, file access patterns, or operations that don't match the Skill's stated purpose -* **External sources are risky:** Skills that fetch data from external URLs pose particular risk, as fetched content may contain malicious instructions. Even trustworthy Skills can be compromised if their external dependencies change over time -* **Tool misuse:** Malicious Skills can invoke tools (file operations, bash commands, code execution) in harmful ways -* **Data exposure:** Skills with access to sensitive data could be designed to leak information to external systems -* **Treat like installing software:** Be especially careful when integrating Skills into production systems with access to sensitive data or critical operations +* **Audit thoroughly:** Review all files bundled in the Skill: `SKILL.md`, scripts, images, and other resources. Look for unusual patterns such as unexpected network calls, file access patterns, or operations that don't match the Skill's stated purpose. +* **External sources are risky:** Skills that fetch data from external URLs pose particular risk, as fetched content might contain malicious instructions. Even trustworthy Skills can be compromised if their external dependencies change over time. +* **Tool misuse:** Malicious Skills can call tools (file operations, bash commands, code execution) in harmful ways. +* **Data exposure:** Skills with access to sensitive data could be designed to leak information to external systems. +* **Treat like installing software:** Be especially careful when integrating Skills into production systems with access to sensitive data or critical operations. For organization-scale governance, vetting, and deployment guidance, see [Skills for enterprise](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise). Claude Enterprise organizations can also turn on [Skill content scanning](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#skill-content-scanning) for custom Skills uploaded in claude.ai and Claude Cowork. Scanning doesn't cover Skills uploaded through the Skills API or the Claude Console. @@ -263,7 +263,7 @@ Anthropic also publishes open-source Skills in the [skills repository](https://g ### Custom Skills examples -For complete examples of custom Skills, see the [Skills cookbook](https://platform.claude.com/cookbook/skills-notebooks-01-skills-introduction). +For complete examples of custom Skills, see the [Agent Skills Cookbook](https://platform.claude.com/cookbook/skills-notebooks-01-skills-introduction). ## Data retention @@ -281,9 +281,9 @@ Claude Platform on AWS and Microsoft Foundry follow the same limitations as the **Custom Skills do not sync across surfaces**. Skills uploaded to one surface are not automatically available on others: -* Skills uploaded to claude.ai must be separately uploaded to the API -* Skills uploaded through the API are not available on claude.ai -* Claude Code Skills are filesystem-based and separate from both claude.ai and API +* Skills uploaded to claude.ai must be separately uploaded to the API. +* Skills uploaded through the API are not available on claude.ai. +* Claude Code Skills are filesystem-based and separate from both claude.ai and the API. Manage and upload Skills separately for each surface where you want to use them. @@ -302,7 +302,7 @@ claude.ai does not support centralized admin management or org-wide distribution The exact runtime environment available to your Skill depends on the product surface where you use it. * **claude.ai:** - * **Varying network access:** Depending on user/admin settings, Skills may have full, partial, or no network access. For more details, see the [Create and Edit Files](https://support.claude.com/en/articles/12111783-create-and-edit-files-with-claude#h_6b7e833898) support article. + * **Varying network access:** Depending on user/admin settings, Skills might have full, partial, or no network access. For more details, see the [Create and Edit Files](https://support.claude.com/en/articles/12111783-create-and-edit-files-with-claude#h_6b7e833898) support article. * **Claude API:** diff --git a/content/en/agents-and-tools/agent-skills/quickstart.md b/content/en/agents-and-tools/agent-skills/quickstart.md index 0bc83e7f1b..d2c376b2cb 100644 --- a/content/en/agents-and-tools/agent-skills/quickstart.md +++ b/content/en/agents-and-tools/agent-skills/quickstart.md @@ -27,7 +27,7 @@ Pre-built Agent Skills extend Claude's capabilities with specialized expertise f ## Step 1: List available Skills -First, check what Skills are available. Use the Skills API to list all Anthropic-managed Skills. Each language tab is an excerpt from one continuous script, with any imports and client setup at the top: +First, check what Skills are available. Use the Skills API to list all Anthropic-managed Skills. The example is an excerpt from one continuous script, with any imports and client setup at the top: ```bash cURL @@ -223,9 +223,8 @@ Use the PowerPoint Skill to create a presentation about renewable energy. Specif }, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = "Create a presentation about renewable energy with 5 slides", }, ], @@ -685,9 +684,8 @@ Try these variations: }, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = "Create a quarterly sales tracking spreadsheet with sample data", }, ], @@ -878,9 +876,8 @@ Try these variations: }, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = "Write a 2-page report on the benefits of renewable energy", }, ], @@ -1069,14 +1066,7 @@ Try these variations: }, ], }, - Messages = - [ - new MessageParam - { - Role = Role.User, - Content = "Generate a PDF invoice template", - }, - ], + Messages = [new UserMessageParam { Content = "Generate a PDF invoice template" }], Tools = [new CodeExecutionTool20260521()], } ); diff --git a/content/en/agents-and-tools/mcp-connector.md b/content/en/agents-and-tools/mcp-connector.md index 1ccd52a0e9..f867b2e9ef 100644 --- a/content/en/agents-and-tools/mcp-connector.md +++ b/content/en/agents-and-tools/mcp-connector.md @@ -12,7 +12,7 @@ featureMetadata: Microsoft Foundry: beta --- -Claude's Model Context Protocol (MCP) connector feature enables you to connect to remote MCP servers directly from the Messages API without a separate MCP client. +Claude's Model Context Protocol (MCP) connector feature allows you to connect to remote MCP servers directly from the Messages API without a separate MCP client. The previous version of this feature (`mcp-client-2025-04-04`) is deprecated. See [Deprecated version: mcp-client-2025-04-04](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#deprecated-version-mcp-client-2025-04-04). @@ -160,7 +160,7 @@ This example enables all tools from an MCP server with default configuration: MaxTokens = 1000, Messages = new List { - new() { Role = Role.User, Content = "What tools do you have available?" } + new BetaUserMessageParam { Content = "What tools do you have available?" } }, McpServers = new List { @@ -353,7 +353,7 @@ The MCPToolset lives in the `tools` array and configures which tools from the MC | `type` | string | Yes | Must be "mcp\_toolset". | | `mcp_server_name` | string | Yes | Must match a server name defined in the `mcp_servers` array. | | `default_config` | object | No | Default configuration applied to all tools in this set. Individual tool configs in `configs` override these defaults. | -| `configs` | object | No | Per-tool configuration overrides. Keys are tool names, values are configuration objects. | +| `configs` | object | No | Per-tool configuration overrides. Keys are tool names; values are configuration objects. | | `cache_control` | object | No | [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) cache breakpoint configuration for this toolset. | With the `mcp-client-2026-09-15` beta header, an MCPToolset also accepts `tools`, a pinned copy of the server's tool list. See [Pin an MCP server's tool list](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#pin-mcp-tool-list). @@ -396,8 +396,8 @@ Example: Results in: -* `search_events`: `enabled: false` (from configs), `defer_loading: true` (from default\_config) -* All other tools: `enabled: true` (system default), `defer_loading: true` (from default\_config) +* `search_events`: `enabled: false` (from `configs`), `defer_loading: true` (from `default_config`) +* All other tools: `enabled: true` (system default), `defer_loading: true` (from `default_config`) ## Common configuration patterns @@ -479,18 +479,18 @@ Combine allowlisting with custom configuration for each tool: In this example: -* `search_events` is enabled with `defer_loading: false` -* `list_events` is enabled with `defer_loading: true` (inherited from default\_config) -* All other tools are disabled +* `search_events` is enabled with `defer_loading: false`. +* `list_events` is enabled with `defer_loading: true` (inherited from `default_config`). +* All other tools are disabled. ## Validation rules The API enforces these validation rules: -* **Server must exist:** The `mcp_server_name` in an MCPToolset must match a server defined in the `mcp_servers` array -* **Server must be used:** Every MCP server defined in `mcp_servers` must be referenced by exactly one MCPToolset -* **Unique toolset per server:** Each MCP server can only be referenced by one MCPToolset -* **Unknown tool names:** If a tool name in `configs` doesn't exist on the MCP server, a backend warning is logged but no error is returned (MCP servers may have dynamic tool availability) +* **Server must exist:** The `mcp_server_name` in an MCPToolset must match a server defined in the `mcp_servers` array. +* **Server must be used:** Every MCP server defined in `mcp_servers` must be referenced by exactly one MCPToolset. +* **Unique toolset for each server:** Each MCP server can only be referenced by one MCPToolset. +* **Unknown tool names:** If a tool name in `configs` doesn't exist on the MCP server, a backend warning is logged but no error is returned (MCP servers might have dynamic tool availability). ## Response content types @@ -526,7 +526,7 @@ When Claude uses MCP tools, the response includes two new content block types: ## Pin an MCP server's tool list (beta) -An MCP server can change its tools at any time. The `mcp-client-2026-09-15` beta header records the tool list each server returns and lets you pin it, so a server that changes its tools doesn't change what Claude sees partway through a conversation. It includes everything `mcp-client-2025-11-20` does, so send it in place of that header. It's available on the Claude API. +An MCP server can change its tools at any time. The `mcp-client-2026-09-15` beta header records the tool list each server returns and lets you pin it, so a server that changes its tools doesn't change what Claude receives partway through a conversation. It includes everything `mcp-client-2025-11-20` does, so send it in place of that header. It's available on the Claude API. When the API asks an MCP server for its tools while producing a response, the response starts with an `mcp_tool_listing` block for that server, one block for each server it asked: @@ -835,7 +835,7 @@ The following example sends one request with an unpinned toolset, copies the ret ]; List messages = [ - new() { Role = Role.User, Content = "What tools do you have available?" }, + new BetaUserMessageParam { Content = "What tools do you have available?" }, ]; // First request: the toolset isn't pinned, so the API asks the server for @@ -883,7 +883,7 @@ The following example sends one request with an unpinned toolset, copies the ret }); // With a pinned toolset, the response has no mcp_tool_listing block. - Console.WriteLine(string.Join(", ", second.Content.Select(block => block.Type))); + Console.WriteLine(string.Join(", ", second.Content.Select(block => block.Type.Raw()))); ``` ```go Go @@ -1177,7 +1177,7 @@ You can connect to multiple MCP servers by including multiple server definitions } ``` -With many tools available, Claude selects based on tool names and descriptions. Clear, specific tool descriptions improve selection accuracy. For large tool sets (dozens of tools across several servers), consider enabling [`defer_loading`](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#tool-configuration-options) with the [Tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) so only relevant tools are surfaced per query. +With many tools available, Claude selects based on tool names and descriptions. Clear, specific tool descriptions improve selection accuracy. For large tool sets (dozens of tools across several servers), consider enabling [`defer_loading`](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#tool-configuration-options) with the [Tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) so only relevant tools are surfaced for each query. ## Authentication @@ -1209,7 +1209,7 @@ The MCP inspector can guide you through the process of obtaining an access token ### Using the access token -Once you've obtained an access token using either of the preceding OAuth flows, you can use it in your MCP server configuration: +Once you've obtained an access token, you can use it in your MCP server configuration: ```json { @@ -1276,8 +1276,8 @@ Install both the Anthropic SDK and the MCP SDK: ```kotlin - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-mcp:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-mcp:3.0.0") ``` @@ -1286,12 +1286,12 @@ Install both the Anthropic SDK and the MCP SDK: com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-mcp - 2.75.0 + 3.0.0 ``` @@ -1466,14 +1466,7 @@ Convert MCP tools for use with the SDK's [tool runner](https://platform.claude.c { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new BetaMessageParam - { - Role = Role.User, - Content = "What tools do you have available?", - }, - ], + Messages = [new BetaUserMessageParam { Content = "What tools do you have available?" }], }, tools ); @@ -1809,10 +1802,9 @@ Convert MCP resources into content blocks to include in messages, or into file o MaxTokens = 1024, Messages = [ - new BetaMessageParam + new BetaUserMessageParam { - Role = Role.User, - Content = new BetaMessageParamContent( + Content = new BetaMessageContentParam( [ BetaMcp.ResourceToContent(resource), new BetaTextBlockParam { Text = "Summarize this document" }, @@ -1903,7 +1895,7 @@ Convert MCP resources into content blocks to include in messages, or into file o BetaMessage response = anthropic.beta().messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024L) - .addUserMessageOfBetaContentBlockParams(content) + .addUserMessageOfContentBlockParams(content) .build()); IO.println(response); @@ -1919,9 +1911,7 @@ Convert MCP resources into content blocks to include in messages, or into file o MultipartField.Builder fileField = MultipartField.builder() .value(new ByteArrayInputStream(resourceFile.content())) .filename(resourceFile.filename()); - if (resourceFile.mimeType() != null) { - fileField.contentType(resourceFile.mimeType()); - } + resourceFile.mimeType().ifPresent(fileField::contentType); var uploaded = anthropic.files().upload(FileUploadParams.builder() .file(fileField.build()) @@ -1986,7 +1976,7 @@ Convert MCP resources into content blocks to include in messages, or into file o ### Error handling -The conversion functions fail with `UnsupportedMCPValueError` (go: `UnsupportedValueError`; java, csharp: `AnthropicInvalidDataException`) if an MCP value isn't supported by the Claude API (thrown, or in Go returned as an error). This can happen with unsupported content types, MIME types, or resource links (resolve resource links with your MCP client before converting). +The conversion functions fail with `UnsupportedMCPValueError` (go: `UnsupportedValueError`; java, csharp: `AnthropicInvalidDataException`) if an MCP value isn't supported by the Claude API (thrown, or in Go returned as an error). This can occur with unsupported content types, MIME types, or resource links (resolve resource links with your MCP client before converting). ## Batch requests @@ -2004,9 +1994,9 @@ If you're using the deprecated `mcp-client-2025-04-04` beta header, follow this ### Key changes -1. **New beta header:** Change from `mcp-client-2025-04-04` to `mcp-client-2025-11-20` -2. **Tool configuration moved:** Tool configuration now lives in the `tools` array as MCPToolset objects, not in the MCP server definition -3. **More flexible configuration:** New pattern supports allowlisting, denylisting, and per-tool configuration +1. **New beta header:** Change from `mcp-client-2025-04-04` to `mcp-client-2025-11-20`. +2. **Tool configuration moved:** Tool configuration now lives in the `tools` array as MCPToolset objects, not in the MCP server definition. +3. **More flexible configuration:** New pattern supports allowlisting, denylisting, and per-tool configuration. ### Migration steps diff --git a/content/en/agents-and-tools/mcp-tunnels/concepts.md b/content/en/agents-and-tools/mcp-tunnels/concepts.md index 680feeda47..78580f586b 100644 --- a/content/en/agents-and-tools/mcp-tunnels/concepts.md +++ b/content/en/agents-and-tools/mcp-tunnels/concepts.md @@ -8,19 +8,19 @@ description: Canonical names for the parts of an MCP tunnel deployment, the two MCP tunnels are in research preview. [Request access](https://claude.com/form/mcp-tunnels) to try them. -This page defines the terms used throughout the [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) documentation. Several components appear under different names in configuration files, container images, and prose; the following tables give one canonical name for each and list the aliases you may encounter. +This page defines the terms used throughout the [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) documentation. Several components appear under different names in configuration files, container images, and prose; the following tables give one canonical name for each and list the aliases you might encounter. ## Components -| Term | Definition | Also appears as | -| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Tunnel stack** | The two containers you run inside your network to attach to a tunnel: the proxy and cloudflared. One stack serves one tunnel and can be replicated across hosts for availability. With programmatic access, the setup component runs alongside the stack to provision credentials. | the stack, the MCP tunnel stack, the tunnel deployment, your deployment | -| **Proxy** | Anthropic's routing component. Terminates inner TLS, validates that upstream IPs fall within an allowed range, and routes each request to an upstream MCP server based on hostname. | `mcp-proxy` (image name, Compose service name, and Helm container name), `mcp-gateway` (container-internal config path `/etc/mcp-gateway/config.yaml` and Helm `gateway.config.*` values prefix) | -| **cloudflared** | Cloudflare's open-source tunnel connector. Initiates the outbound-only connections from your network to the tunnel edge and carries encrypted traffic between the edge and the proxy. Not related to a Managed Agent. | the outbound connector, the tunnel connector | -| **Setup component** | The `setup` binary, shipped inside the `mcp-proxy` image. With programmatic access it authenticates over Workload Identity Federation, fetches the tunnel token, generates a CA and server certificate, and registers the CA with Anthropic. Also provides `renew-cert`. | setup Job (the Helm pre-install hook), `setup` service (the Compose profile), setup hook, setup binary, setup CLI | -| **Tunnel edge** | The Cloudflare edge servers that cloudflared dials out to (IP ranges `198.41.192.0/19` and `2606:4700:a0::/44`, port 7844 TCP and UDP). The tunnel that runs over them is provisioned and controlled by Anthropic; Cloudflare operates the underlying network. | the edge, the Anthropic-operated tunnel edge | -| **Inner TLS** | A second TLS handshake carried inside the tunnel's plaintext WebSocket stream, between Anthropic's backend and your proxy. The proxy presents a server certificate signed by a CA you registered on the tunnel. Because only you hold the private key, the transport provider cannot read request or response payloads. | the inner TLS handshake | -| **Upstream MCP server** | An MCP server running in your private network that the proxy routes to. Each upstream is exposed as one subdomain under your tunnel domain. | upstream, routed MCP server, tunneled MCP server | +| Term | Definition | Also appears as | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Tunnel stack** | The two containers you run inside your network to attach to a tunnel: the proxy and cloudflared. One stack serves one tunnel and can be replicated across hosts for availability. With programmatic access, the setup component runs alongside the stack to provision credentials. | the stack, the MCP tunnel stack, the tunnel deployment, your deployment | +| **Proxy** | Anthropic's routing component. Terminates inner TLS, validates that upstream IPs fall within an allowed range, and routes each request to an upstream MCP server based on hostname. | `mcp-proxy` (image name, Compose service name, and Helm container name), `mcp-gateway` (container-internal config path `/etc/mcp-gateway/config.yaml` and Helm `gateway.config.*` values prefix) | +| **cloudflared** | Cloudflare's open-source tunnel connector. Initiates the outbound-only connections from your network to the tunnel edge and carries encrypted traffic between the edge and the proxy. Not related to a Managed Agent. | the outbound connector, the tunnel connector | +| **Setup component** | The `setup` binary, shipped inside the `mcp-proxy` image. With programmatic access it authenticates over Workload Identity Federation, fetches the tunnel token, generates a CA and server certificate, and registers the CA with Anthropic. Also provides `renew-cert`. | setup Job (the Helm pre-install hook), `setup` service (the Compose profile), setup hook, setup binary, setup CLI | +| **Tunnel edge** | The Cloudflare edge servers that cloudflared dials out to (IP ranges `198.41.192.0/19` and `2606:4700:a0::/44`, port 7844 TCP and UDP). The tunnel that runs over them is provisioned and controlled by Anthropic; Cloudflare operates the underlying network. | the edge, the Anthropic-operated tunnel edge | +| **Inner TLS** | A second TLS handshake carried inside the tunnel's plaintext WebSocket stream, between Anthropic's back end and your proxy. The proxy presents a server certificate signed by a CA you registered on the tunnel. Because only you hold the private key, the transport provider cannot read request or response payloads. | the inner TLS handshake | +| **Upstream MCP server** | An MCP server running in your private network that the proxy routes to. Each upstream is exposed as one subdomain under your tunnel domain. | upstream, routed MCP server, tunneled MCP server | ## Credential provisioning @@ -42,7 +42,7 @@ Two directions are at work in a tunnel, and they point opposite ways: The phrase "outbound-only" describes the connection, not the requests carried over it. -Inner TLS spans Anthropic's backend and your proxy. cloudflared and the tunnel edge sit between them on the wire but see only ciphertext; the proxy is the first place inside your network where MCP request payloads are readable. +Inner TLS spans Anthropic's back end and your proxy. cloudflared and the tunnel edge sit between them on the wire but see only ciphertext; the proxy is the first place inside your network where MCP request payloads are readable. ```mermaid sequenceDiagram @@ -70,5 +70,5 @@ sequenceDiagram ## See also -* [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) for the security model and shared-responsibility table. -* [MCP tunnels reference](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference) for proxy configuration fields, certificate requirements, and the setup component. +* [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) for the security model and shared-responsibility table +* [MCP tunnels reference](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference) for proxy configuration fields, certificate requirements, and the setup component diff --git a/content/en/agents-and-tools/mcp-tunnels/console.md b/content/en/agents-and-tools/mcp-tunnels/console.md index eb224fee4e..f578883782 100644 --- a/content/en/agents-and-tools/mcp-tunnels/console.md +++ b/content/en/agents-and-tools/mcp-tunnels/console.md @@ -1,5 +1,5 @@ --- -title: Manage tunnels in the Console +title: Manage tunnels in the Claude Console url: https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console description: Create tunnels, register CA certificates, retrieve the tunnel token, and attach tunneled MCP servers to agents from the Claude Console. --- @@ -29,7 +29,7 @@ This page covers the Console side of an MCP tunnels deployment: creating a tunne - Click **New tunnel** and enter a name in the **Create tunnel** dialog. The name is required and identifies the tunnel in the list, on the detail page, and in the agent MCP server picker. A domain of the form `abcd1234.tunnel.anthropic.com` is assigned automatically. + Click **New tunnel** and enter a name in the **Create tunnel** dialog box. The name is required and identifies the tunnel in the list, on the detail page, and in the agent MCP server picker. A domain of the form `abcd1234.tunnel.anthropic.com` is assigned automatically. @@ -38,7 +38,7 @@ This page covers the Console side of an MCP tunnels deployment: creating a tunne Programmatic access relies on [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation); read that page first if federation issuers, rules, and service accounts are unfamiliar. To turn the toggle on you need: 1. **A registered OIDC issuer** for the identity provider your stack presents tokens from (such as a Kubernetes cluster, AWS IAM, Google Cloud, or GitHub Actions). Register one on the **Issuers** tab of the [Workload identity](https://platform.claude.com/settings/workload-identity-federation) page (`platform.claude.com/settings/workload-identity-federation`) in the Claude Console if your organization doesn't have one. - 2. **A federation rule with the `workspace:manage_tunnels` scope.** Turning on the toggle reveals a **Federation rule** picker. Choose an existing rule with that scope, or click **Create federation rule** to create one inline. + 2. **A federation rule with the `workspace:manage_tunnels` scope.** Turning on the toggle reveals a **Federation rule** picker. Select an existing rule with that scope, or click **Create federation rule** to create one inline. 3. **The rule's service account added to this workspace.** The Tunnels API authorizes against the service account's workspace memberships. If you're creating the tunnel in a workspace other than the organization's default, [add the service account to that workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#role-inheritance) and pass the workspace ID at deploy time (`api.wif.workspaceId` for Helm, `ANTHROPIC_WORKSPACE_ID` for Compose). Skipping this step is fully supported; both deploy guides have a **Without programmatic access** tab. @@ -65,7 +65,7 @@ This page covers the Console side of an MCP tunnels deployment: creating a tunne -Your organization can have up to 10 active tunnels. Creating a tunnel does not establish any connectivity; that happens once your stack dials in with the tunnel token and a CA certificate is registered. +Your organization can have up to 10 active tunnels. Creating a tunnel does not establish any connectivity; that occurs once your stack dials in with the tunnel token and a CA certificate is registered. ## Get the connection details @@ -90,7 +90,7 @@ Anthropic verifies [inner TLS](https://platform.claude.com/docs/en/agents-and-to - Click **Choose file** to select a `.pem`, `.crt`, or `.cer` file, drag the file onto the text area, or paste the PEM block directly. The modal rejects private-key material and content that isn't a `-----BEGIN CERTIFICATE-----` block. The file must be 8 kB or smaller. + Click **Choose file** to select a `.pem`, `.crt`, or `.cer` file, drag the file onto the text area, or paste the PEM block directly. The modal window rejects private-key material and content that isn't a `-----BEGIN CERTIFICATE-----` block. The file must be 8 kB or smaller. @@ -119,20 +119,20 @@ The tunnel exists in the Console, but no traffic flows until the tunnel stack is Once your stack is running and has one or more MCP servers configured, attach an upstream MCP server to a Managed Agent session. To call the same servers from the Messages API instead, see [Use the tunneled MCP servers](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview#use-the-tunneled-mcp-servers). - The picker only shows tunnels with at least one active certificate. A tunnel that still shows **Needs certificate** in the **MCP tunnels** list does not appear in the dropdown; register a CA certificate first. The picker is also workspace-scoped: it lists tunnels in the same workspace as the session, not other workspaces. + The picker only shows tunnels with at least one active certificate. A tunnel that still shows **Needs certificate** in the **MCP tunnels** list does not appear in the dropdown menu; register a CA certificate first. The picker is also workspace-scoped: it lists tunnels in the same workspace as the session, not other workspaces. - + In the Claude Console, go to the [Sessions](https://platform.claude.com/sessions) page (`platform.claude.com/sessions`) and click **Create session**. - In the agent picker, choose **Create new agent** so you can edit the MCP server list directly. + In the agent picker, select **Create new agent** so you can edit the MCP server list directly. - Click **+ MCP Server** and open the dropdown. Tunnels created in the current workspace appear at the top of the list, above the public connector catalog. Select the tunnel that fronts the server you want to reach. + Click **+ MCP Server** and open the dropdown menu. Tunnels created in the current workspace appear at the top of the list, above the public connector catalog. Select the tunnel that fronts the server you want to reach. @@ -141,14 +141,14 @@ Once your stack is running and has one or more MCP servers configured, attach an - The tunnel carries traffic; it does not authenticate to the upstream MCP server. Configure OAuth or bearer auth on the MCP server the same way as for any other MCP server. + The tunnel carries traffic; it does not authenticate to the upstream MCP server. Configure OAuth or bearer authentication on the MCP server the same way as for any other MCP server. ## Archive a tunnel Archiving immediately stops the tunnel from accepting connections and is permanent. -In the Claude Console, go to the [MCP tunnels](https://platform.claude.com/settings/workspaces/default/mcp-tunnels) page (`platform.claude.com/settings/workspaces/default/mcp-tunnels`). In the workspace picker in the sidebar, select the workspace that holds the tunnel. Open the row menu for the tunnel and choose **Archive**. Archived tunnels remain visible when you filter the list by **Archived** or **All**. +In the Claude Console, go to the [MCP tunnels](https://platform.claude.com/settings/workspaces/default/mcp-tunnels) page (`platform.claude.com/settings/workspaces/default/mcp-tunnels`). In the workspace picker in the sidebar, select the workspace that holds the tunnel. Open the row menu for the tunnel and select **Archive**. Archived tunnels remain visible when you filter the list by **Archived** or **All**. ## Next steps diff --git a/content/en/agents-and-tools/mcp-tunnels/deploy-compose.md b/content/en/agents-and-tools/mcp-tunnels/deploy-compose.md index bfad6e5ff7..c5e5f9ba93 100644 --- a/content/en/agents-and-tools/mcp-tunnels/deploy-compose.md +++ b/content/en/agents-and-tools/mcp-tunnels/deploy-compose.md @@ -10,11 +10,11 @@ description: Install the MCP tunnel stack on a VM using Docker Compose. This guide deploys the [tunnel stack](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) as hardened containers on a single host. The same configuration can be replicated across multiple hosts for availability. -## Before you begin +## Before you start You need: -* **A tunnel.** With programmatic access, the [setup component](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) creates one for you when you don't supply a tunnel ID; to attach to an existing tunnel instead, [create it in the Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel) and record the tunnel ID (`tnl_...`). Manual provisioning always starts from a Console-created tunnel. +* **A tunnel.** With programmatic access, the [setup component](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) creates one for you when you don't supply a tunnel ID; to attach to an existing tunnel instead, [create it in the Claude Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel) and record the tunnel ID (`tnl_...`). Manual provisioning always starts from a Console-created tunnel. * **A way for the host to authenticate to the Tunnels API.** @@ -244,7 +244,7 @@ This guide provides one reference approach using Docker Compose. You are respons cd mcp-tunnel ``` - The proxy listens on `:8080` over plain WebSocket; the [inner TLS](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) handshake happens **inside** that WebSocket stream using these certificates. Anthropic verifies the inner handshake against the CA you register in the Console. The server certificate's Subject Alternative Name (SAN) must include `*.` per the [certificate requirements](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#certificate-requirements). + The proxy listens on `:8080` over plain WebSocket; the [inner TLS](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) handshake occurs **inside** that WebSocket stream using these certificates. Anthropic verifies the inner handshake against the CA you register in the Console. The server certificate's Subject Alternative Name (SAN) must include `*.` as described in the [certificate requirements](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#certificate-requirements). ```bash # Self-signed CA. Explicit extensions so it satisfies the certificate @@ -282,7 +282,7 @@ This guide provides one reference approach using Docker Compose. You are respons - On the tunnel detail page, scroll to the **Certificates** section and click **Add certificate**. Upload `data/ca.crt` directly with **Choose file** (the modal accepts `.pem`, `.crt`, and `.cer`), or paste its contents: + On the tunnel detail page, scroll to the **Certificates** section and click **Add certificate**. Upload `data/ca.crt` directly with **Choose file** (the modal window accepts `.pem`, `.crt`, and `.cer`), or paste its contents: ```bash cat data/ca.crt diff --git a/content/en/agents-and-tools/mcp-tunnels/deploy-helm.md b/content/en/agents-and-tools/mcp-tunnels/deploy-helm.md index b53cf07548..0ecd77ac6c 100644 --- a/content/en/agents-and-tools/mcp-tunnels/deploy-helm.md +++ b/content/en/agents-and-tools/mcp-tunnels/deploy-helm.md @@ -8,17 +8,17 @@ description: Install the tunnel stack on a Kubernetes cluster using the Anthropi MCP tunnels are in research preview. [Request access](https://claude.com/form/mcp-tunnels) to try them. -The Anthropic Helm chart installs the [tunnel stack](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) as a single Deployment and attaches it to your tunnel: one the chart's setup hook creates for you, or an existing tunnel you created in the [Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel). +The Anthropic Helm chart installs the [tunnel stack](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) as a single Deployment and attaches it to your tunnel: one the chart's setup hook creates for you, or an existing tunnel you created in the [Claude Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel). -## Before you begin +## Before you start You need: -* **A tunnel.** With programmatic access, the chart's setup hook creates one for you when you don't supply a tunnel ID; to attach to an existing tunnel instead, [create it in the Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel) and record the tunnel ID (`tnl_...`). Manual provisioning always starts from a Console-created tunnel; you'll also need its tunnel token and tunnel domain. +* **A tunnel.** With programmatic access, the chart's setup hook creates one for you when you don't supply a tunnel ID; to attach to an existing tunnel instead, [create it in the Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#create-a-tunnel) and record the tunnel ID (`tnl_...`). Manual provisioning always starts from a Console-created tunnel; you also need its tunnel token and tunnel domain. * **A way for the chart to authenticate to the Tunnels API.** - * **[Programmatic access](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#credential-provisioning) (recommended).** The [setup component](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) authenticates through Workload Identity Federation, fetches the tunnel token, generates a CA, registers it with Anthropic, and stores everything in a Secret. You'll need a federation rule scoped to `workspace:manage_tunnels`. + * **[Programmatic access](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#credential-provisioning) (recommended).** The [setup component](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) authenticates through Workload Identity Federation, fetches the tunnel token, generates a CA, registers it with Anthropic, and stores everything in a Secret. You need a federation rule scoped to `workspace:manage_tunnels`. * **[Manual](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#credential-provisioning).** Skip programmatic access. You'll [get the tunnel token from the Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#get-the-connection-details), generate a CA and server certificate yourself, [register the CA in the Console](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#add-a-ca-certificate), and supply the credentials to the cluster as Secrets. * **A Kubernetes cluster** you can deploy to with `helm` and `kubectl`. The **Without programmatic access** tab also uses `openssl` (1.1.1 or later). @@ -155,7 +155,7 @@ The Install steps that follow note where to add the corresponding route. search: http://search-mcp.internal:8080 ``` - With these routes, Claude reaches the servers at `docs.` and `search.`. Some managed Kubernetes distributions allocate the Service CIDR outside the standard private ranges; if your routes target in-cluster Services, add `gateway.config.upstream.allowed_ips` here per [Upstream IP validation](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting#upstream-ip-validation). + With these routes, Claude reaches the servers at `docs.` and `search.`. Some managed Kubernetes distributions allocate the Service CIDR outside the standard private ranges; if your routes target in-cluster Services, add `gateway.config.upstream.allowed_ips` here as described in [Upstream IP validation](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting#upstream-ip-validation). If you're using the [sample MCP server](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-helm#optional-use-a-sample-mcp-server), set `routes` to `echo: http://hello-mcp:9000` instead. @@ -214,7 +214,7 @@ The Install steps that follow note where to add the corresponding route. - The proxy listens on plain WebSocket, with [inner TLS](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) carried inside that stream using the certificate you generate here. The server certificate's SAN must include `*.` per the [certificate requirements](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#certificate-requirements). + The proxy listens on plain WebSocket, with [inner TLS](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) carried inside that stream using the certificate you generate here. The server certificate's SAN must include `*.` as described in the [certificate requirements](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#certificate-requirements). ```bash export TUNNEL_DOMAIN=YOUR_TUNNEL_DOMAIN_HERE @@ -296,7 +296,7 @@ The Install steps that follow note where to add the corresponding route. search: http://search-mcp.internal:8080 ``` - Some managed Kubernetes distributions allocate the Service CIDR outside the standard private ranges; if your routes target in-cluster Services, add `gateway.config.upstream.allowed_ips` here per [Upstream IP validation](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting#upstream-ip-validation). + Some managed Kubernetes distributions allocate the Service CIDR outside the standard private ranges; if your routes target in-cluster Services, add `gateway.config.upstream.allowed_ips` here as described in [Upstream IP validation](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting#upstream-ip-validation). If you're using the [sample MCP server](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-helm#optional-use-a-sample-mcp-server), set `routes` to `echo: http://hello-mcp:9000` instead. diff --git a/content/en/agents-and-tools/mcp-tunnels/overview.md b/content/en/agents-and-tools/mcp-tunnels/overview.md index 9e54c98c1f..c9dea63c52 100644 --- a/content/en/agents-and-tools/mcp-tunnels/overview.md +++ b/content/en/agents-and-tools/mcp-tunnels/overview.md @@ -109,13 +109,13 @@ Choosing between them: * **Deployment target** - * **Helm** when deploying to Kubernetes. - * **Docker Compose** for a single host or local testing. + * **Helm** when deploying to Kubernetes + * **Docker Compose** for a single host or local testing * **Authentication for setup** - * **Programmatic access** (through Workload Identity Federation) when you have an OIDC identity provider such as a Kubernetes cluster, cloud IAM, or SPIFFE. - * **Manual credentials** when you don't, or when you're testing. + * **Programmatic access** (through Workload Identity Federation) when you have an OIDC identity provider such as a Kubernetes cluster, cloud IAM, or SPIFFE + * **Manual credentials** when you don't, or when you're testing ## Use the tunneled MCP servers @@ -129,15 +129,15 @@ In both cases, the tunnel carries encrypted traffic to your MCP server but does ### Managed Agents (Console) -1. On the [Sessions](https://platform.claude.com/sessions) page (`platform.claude.com/sessions`) in the Claude Console, create a session and choose **Create new agent** so you can edit the MCP server list. -2. Click **+ MCP Server** and open the dropdown. Tunnels in the session's workspace that have at least one active certificate appear at the top of the list, above the public connector catalog. +1. On the [Sessions](https://platform.claude.com/sessions) page (`platform.claude.com/sessions`) in the Claude Console, create a session and select **Create new agent** so you can edit the MCP server list. +2. Click **+ MCP Server** and open the dropdown menu. Tunnels in the session's workspace that have at least one active certificate appear at the top of the list, above the public connector catalog. 3. Select the tunnel and supply the **Subdomain** that your proxy routes to a specific MCP server, and the **Path** the upstream MCP server expects. The **Resolves to** line shows the exact URL. ### Messages API -Pass the upstream MCP server's URL in the `mcp_servers` array, the same way as any other remote MCP server. The request body and `anthropic-beta` header follow the standard [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) format; only the `url` is tunnel-specific. The following example uses the MCP connector's `mcp-client` beta header, which is separate from the `mcp-tunnels` beta used by the [Tunnels API](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference). Make the request in the workspace the tunnel was created in by using an API key for that workspace or, if your key has access to multiple workspaces, by setting the [`anthropic-workspace-id` header](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) to that workspace. +Pass the upstream MCP server's URL in the `mcp_servers` array, the same way as any other remote MCP server. The request body and `anthropic-beta` header follow the standard [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) format; only the `url` is tunnel-specific. The following example uses the MCP connector's `mcp-client` beta header, which is separate from the `mcp-tunnels` beta used by the [Tunnels API](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference). Make the request in the workspace the tunnel was created in by using an API key for that workspace or, if your key isn't scoped to a workspace, by setting the [`anthropic-workspace-id` header](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) to that workspace. -The URL's host is `.`. The path depends on your upstream MCP server, not the tunnel: FastMCP's `streamable-http` transport serves at `/mcp`, and other servers may use `/` or a custom path (check the server's documentation). The proxy forwards the path untouched. +The URL's host is `.`. The path depends on your upstream MCP server, not the tunnel: FastMCP's `streamable-http` transport serves at `/mcp`, and other servers might use `/` or a custom path (check the server's documentation). The proxy forwards the path untouched. ```bash cURL @@ -239,7 +239,7 @@ The URL's host is `.`. The path depends on your u MaxTokens = 1000, Messages = new List { - new() { Role = Role.User, Content = "Use the hello tool to greet tunnel." } + new BetaUserMessageParam { Content = "Use the hello tool to greet tunnel." } }, McpServers = new List { diff --git a/content/en/agents-and-tools/mcp-tunnels/quickstart.md b/content/en/agents-and-tools/mcp-tunnels/quickstart.md index 597b294bc2..bd7d570e08 100644 --- a/content/en/agents-and-tools/mcp-tunnels/quickstart.md +++ b/content/en/agents-and-tools/mcp-tunnels/quickstart.md @@ -8,7 +8,7 @@ description: Connect Claude to a private MCP server using a local Docker Compose MCP tunnels are in research preview. [Request access](https://claude.com/form/mcp-tunnels) to try them. -This quickstart takes you from zero to Claude calling a private MCP server through a tunnel. It uses Docker Compose with [manual](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#credential-provisioning) credential provisioning, which is the shortest path for local testing. For production deployments, see [Deploy with Helm](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-helm) or [Deploy with Docker Compose](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-compose). +This quickstart shows you how to set up a tunnel so that Claude can call a private MCP server through it. It uses Docker Compose with [manual](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#credential-provisioning) credential provisioning, which is the shortest path for local testing. For production deployments, see [Deploy with Helm](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-helm) or [Deploy with Docker Compose](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/deploy-compose). ## What you'll build @@ -18,7 +18,7 @@ A two-container [tunnel stack](https://platform.claude.com/docs/en/agents-and-to * [Docker and Docker Compose](https://docs.docker.com/get-docker/) on a machine with outbound internet access. * A role in the [Claude Console](https://platform.claude.com) that can manage MCP tunnels. See the [Console guide prerequisites](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/console#prerequisites). -* [OpenSSL](https://openssl-library.org/source/) 1.1.1 or later. Preinstalled on macOS and most Linux distributions; on Windows, install it separately (the `openssl` binary must be on your `PATH`). +* [OpenSSL](https://openssl-library.org/source/) 1.1.1 or later. Preinstalled on macOS and most Linux distributions. On Windows, install it separately (the `openssl` binary must be on your `PATH`). @@ -261,7 +261,7 @@ A two-container [tunnel stack](https://platform.claude.com/docs/en/agents-and-to - In the Console, go to the [Sessions](https://platform.claude.com/sessions) page (`platform.claude.com/sessions`) and create a session. In the agent picker choose **Create new agent**, give the agent a name, and keep the pre-filled model. Click **+ MCP Server**, select your tunnel, set **Subdomain** to `echo` and **Path** to `mcp`. Then ask: + In the Console, go to the [Sessions](https://platform.claude.com/sessions) page (`platform.claude.com/sessions`) and create a session. In the agent picker, select **Create new agent**, give the agent a name, and keep the prefilled model. Click **+ MCP Server**, select your tunnel, and set **Subdomain** to `echo` and **Path** to `mcp`. Then ask: > Use the hello tool to greet tunnel. diff --git a/content/en/agents-and-tools/mcp-tunnels/reference.md b/content/en/agents-and-tools/mcp-tunnels/reference.md index fba9254dd4..48a812d1db 100644 --- a/content/en/agents-and-tools/mcp-tunnels/reference.md +++ b/content/en/agents-and-tools/mcp-tunnels/reference.md @@ -21,7 +21,7 @@ The [proxy](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/con | `tls.cert_file` | Path to the server TLS certificate. | Required | | `tls.key_file` | Path to the server TLS private key. | Required | | `routes` | Map of subdomain or full hostname to upstream URL. See [Route matching](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#route-matching). | Required | -| `upstream.allowed_ips` | IPv4 CIDR ranges or single addresses the proxy is permitted to connect to. Mutually exclusive with `disable_ip_validation`. | RFC1918 private ranges | +| `upstream.allowed_ips` | IPv4 CIDR ranges or single addresses the proxy is allowed to connect to. Mutually exclusive with `disable_ip_validation`. | RFC1918 private ranges | | `upstream.disable_ip_validation` | Disable upstream IP validation entirely. Mutually exclusive with `allowed_ips`. | `false` | | `upstream.tls.ca_file` | CA bundle for validating upstream TLS. | None | | `upstream.tls.include_system_cas` | Also trust the system CA bundle for upstream TLS. | `false` | @@ -62,7 +62,7 @@ The [setup component](https://platform.claude.com/docs/en/agents-and-tools/mcp-t Upload with `POST /v1/tunnels/{tunnel_id}/certificates`. A tunnel can hold up to two active CA certificates at a time, which allows zero-downtime rotation. -* PEM-encoded, single certificate, up to 8 kB. +* PEM-encoded, single certificate, up to 8 kB. * `BasicConstraints` extension present with `CA:TRUE`, marked critical. * `SubjectKeyIdentifier` extension present. * `KeyUsage` includes `keyCertSign`. @@ -80,7 +80,7 @@ Presented by the proxy during [inner TLS](https://platform.claude.com/docs/en/ag * Within its validity period. * RSA 2048-bit or larger, or ECDSA P-256 or larger, with a SHA-256 or stronger signature. -The setup component generates an ECDSA P-256 CA with five-year validity and an RSA 4096-bit server certificate with a wildcard SAN and 90-day validity. +The setup component generates an ECDSA P-256 CA with 5-year validity and an RSA 4096-bit server certificate with a wildcard SAN and 90-day validity. ## Setup component diff --git a/content/en/agents-and-tools/mcp-tunnels/security.md b/content/en/agents-and-tools/mcp-tunnels/security.md index 4b6d5f3fdd..325c904ded 100644 --- a/content/en/agents-and-tools/mcp-tunnels/security.md +++ b/content/en/agents-and-tools/mcp-tunnels/security.md @@ -12,7 +12,7 @@ The tunnel architecture provides strong defaults (outbound-only connectivity, en ## Best practices -* **Require OAuth on every MCP server.** Configure each [upstream MCP server](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) to require OAuth as described in the [MCP authorization spec](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization). OAuth provides defense in depth on top of the tunnel's transport authentication and enables user-level authorization at the data layer. +* **Require OAuth on every MCP server.** Configure each [upstream MCP server](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components) to require OAuth as described in the [MCP authorization spec](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization). OAuth provides defense in depth on top of the tunnel's transport authentication and allows user-level authorization at the data layer. * **Enable SSO for your organization.** Tunnels, federation rules, and service accounts are managed in the Claude Console. SSO enforces your identity provider's session controls on the admins who can change them. * **Restrict `upstream.allowed_ips`.** Use the smallest CIDR ranges that cover your MCP servers. This is the [proxy](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/concepts#components)'s primary SSRF defense. * **Monitor logs.** Alert on warnings, errors, and unusual traffic patterns from the tunnel stack. diff --git a/content/en/agents-and-tools/mcp-tunnels/troubleshooting.md b/content/en/agents-and-tools/mcp-tunnels/troubleshooting.md index 0b6b52ed64..ebcfcc4f32 100644 --- a/content/en/agents-and-tools/mcp-tunnels/troubleshooting.md +++ b/content/en/agents-and-tools/mcp-tunnels/troubleshooting.md @@ -20,13 +20,13 @@ A request through the tunnel can fail at one of three layers; diagnose them in o | Proxy logs `IP validation failed: is not a private address` | Upstream MCP server resolves outside RFC1918. | See [Upstream IP validation](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/troubleshooting#upstream-ip-validation). | | Proxy exits with `cannot unmarshal !!seq into map[string]string` | `routes` is a YAML list. | Use `routes: { name: http://host:port }`. | | Proxy exits with `open /data/tls.key: permission denied` | The key is `0600`; the proxy container runs non-root. | `chmod 644 data/tls.key`. | -| `curl https://:8080` fails with `wrong version number` | Expected; the listener is plaintext WebSocket. TLS happens inside the WS stream. | Verify through a [Managed Agent or the Messages API](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview#use-the-tunneled-mcp-servers) instead. | +| `curl https://:8080` fails with `wrong version number` | Expected; the listener is plaintext WebSocket. TLS occurs inside the WS stream. | Verify through a [Managed Agent or the Messages API](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview#use-the-tunneled-mcp-servers) instead. | The following sections cover failures that need more than a one-line fix. ## OAuth fails behind a source-IP allowlist -OAuth flows fail when your authorization server's source-IP allowlist blocks Anthropic's backend from reaching `/token`, `/register`, and the discovery endpoints. If you'd rather not allowlist Anthropic's egress ranges, you can route the backend-to-backend OAuth calls through the tunnel while keeping the browser-facing `/authorize` endpoint on your existing public hostname. +OAuth flows fail when your authorization server's source-IP allowlist blocks Anthropic's back end from reaching `/token`, `/register`, and the discovery endpoints. If you'd rather not allowlist Anthropic's egress ranges, you can route the backend-to-backend OAuth calls through the tunnel while keeping the browser-facing `/authorize` endpoint on your existing public hostname. @@ -65,7 +65,7 @@ OAuth flows fail when your authorization server's source-IP allowlist blocks Ant -With this configuration, the user's browser hits `/authorize` on your existing hostname (which your allowlist already permits), while Anthropic's backend reaches `/token`, `/register`, and the discovery documents through the tunnel. +With this configuration, the user's browser requests `/authorize` on your existing hostname (which your allowlist already includes), whereas Anthropic's back end reaches `/token`, `/register`, and the discovery documents through the tunnel. ## Setup component authentication failures @@ -90,7 +90,7 @@ Check the cloudflared logs first. Common causes: * The `TUNNEL_TOKEN` is missing, expired, or copied incorrectly. * A firewall is blocking outbound TCP/UDP on port 7844 to the tunnel edge. -cloudflared may also log warnings about UDP receive buffer sizes; this is a QUIC tuning hint, not an error. +cloudflared might also log warnings about UDP receive buffer sizes; this is a QUIC tuning hint, not an error. ## Certificate errors diff --git a/content/en/agents-and-tools/remote-mcp-servers.md b/content/en/agents-and-tools/remote-mcp-servers.md index cb9e29d035..d2da930c0e 100644 --- a/content/en/agents-and-tools/remote-mcp-servers.md +++ b/content/en/agents-and-tools/remote-mcp-servers.md @@ -7,7 +7,7 @@ description: Connect Claude to third-party remote MCP servers through the MCP co Several companies have deployed remote MCP servers that developers can connect to by using the Anthropic MCP connector API. These servers expand the capabilities available to developers and end users by providing remote access to various services and tools through the MCP protocol. - The remote MCP servers listed below are third-party services designed to work with the Claude API. These servers are not owned, operated, or endorsed by Anthropic. Users should only connect to remote MCP servers they trust and should review each server's security practices and terms before connecting. + The remote MCP servers listed later on this page are third-party services designed to work with the Claude API. These servers are not owned, operated, or endorsed by Anthropic. Users should only connect to remote MCP servers they trust and should review each server's security practices and terms before connecting. ## Connecting to remote MCP servers diff --git a/content/en/agents-and-tools/tool-use/advisor-tool.md b/content/en/agents-and-tools/tool-use/advisor-tool.md index 2c76477bf2..a81daed9f2 100644 --- a/content/en/agents-and-tools/tool-use/advisor-tool.md +++ b/content/en/agents-and-tools/tool-use/advisor-tool.md @@ -4,9 +4,9 @@ url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool description: Pair a faster executor model with a higher-intelligence advisor model that provides strategic guidance mid-generation. --- -The advisor tool lets a faster, lower-cost **executor model** consult a higher-intelligence **advisor model** mid-generation for strategic guidance. The advisor reads the full conversation, produces a plan or course correction, and the executor continues with the task. +The advisor tool lets a faster, lower-cost **executor model** consult a higher-intelligence **advisor model** mid-generation for strategic guidance. The advisor reads the full conversation and produces a plan or course correction, and the executor continues with the task. -This pattern fits long-horizon agentic workloads (coding agents, computer use, multistep research pipelines) where most turns are mechanical but having an excellent plan is crucial. You get close to advisor-solo quality while the bulk of token generation happens at executor-model rates. For measured results, including how the benefit shrinks as the executor's own capability approaches the advisor's, see [Optimizing for cost and intelligence](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence). +This pattern fits long-horizon agentic workloads (coding agents, computer use, multistep research pipelines) where most turns are mechanical but having an excellent plan is crucial. You get close to advisor-solo quality while the bulk of token generation occurs at executor-model rates. For measured results, including how the benefit shrinks as the executor's own capability approaches the advisor's, see [Optimizing for cost and intelligence](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence). ```mermaid sequenceDiagram @@ -153,9 +153,8 @@ The advisor is a weaker fit for single-turn Q\&A (nothing to plan), pure pass-th }, Messages = [ - new BetaMessageParam + new BetaUserMessageParam { - Role = Role.User, Content = "Build a concurrent worker pool in Go with graceful shutdown." } ], @@ -395,7 +394,7 @@ If the advisor call fails, the result carries an error: } ``` -The executor sees the error and continues without further advice. The request itself does not fail. +The executor receives the error and continues without further advice. The request itself does not fail. | `error_code` | Meaning | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | @@ -511,7 +510,7 @@ Pass the full assistant content, including `advisor_tool_result` blocks, back to var messages = new List { - new() { Role = Role.User, Content = "Build a concurrent worker pool in Go with graceful shutdown." } + new BetaUserMessageParam { Content = "Build a concurrent worker pool in Go with graceful shutdown." } }; var response = await client.Beta.Messages.Create(new MessageCreateParams @@ -524,14 +523,13 @@ Pass the full assistant content, including `advisor_tool_result` blocks, back to }); // Append the full response content, including any advisor_tool_result blocks - messages.Add(new BetaMessageParam + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); // Continue the conversation - messages.Add(new BetaMessageParam { Role = Role.User, Content = "Now add a max-in-flight limit of 10." }); + messages.Add(new BetaUserMessageParam { Content = "Now add a max-in-flight limit of 10." }); var followUp = await client.Beta.Messages.Create(new MessageCreateParams { @@ -591,7 +589,6 @@ Pass the full assistant content, including `advisor_tool_result` blocks, back to ```java Java import com.anthropic.models.beta.messages.BetaAdvisorTool20260301; - import com.anthropic.models.beta.messages.BetaContentBlock; import com.anthropic.models.beta.messages.BetaMessage; import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaToolUnion; @@ -606,10 +603,8 @@ Pass the full assistant content, including `advisor_tool_result` blocks, back to BetaAdvisorTool20260301.builder().model(Model.CLAUDE_OPUS_5_5).build())); List messages = new ArrayList<>(); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Build a concurrent worker pool in Go with graceful shutdown.") - .build()); + messages.add(BetaMessageParam.ofUser( + "Build a concurrent worker pool in Go with graceful shutdown.")); BetaMessage response = client.beta().messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_SONNET_5) @@ -620,17 +615,10 @@ Pass the full assistant content, including `advisor_tool_result` blocks, back to .build()); // Append the full response content, including any advisor_tool_result blocks - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.ASSISTANT) - .contentOfBetaContentBlockParams( - response.content().stream().map(BetaContentBlock::toParam).toList()) - .build()); + messages.add(response.toParam()); // Continue the conversation - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Now add a max-in-flight limit of 10.") - .build()); + messages.add(BetaMessageParam.ofUser("Now add a max-in-flight limit of 10.")); BetaMessage followUp = client.beta().messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_SONNET_5) @@ -905,7 +893,7 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod // ... your other tools }; var task = "Build a concurrent worker pool in Go with graceful shutdown."; - var messages = new List { new() { Role = Role.User, Content = task } }; + var messages = new List { new BetaUserMessageParam { Content = task } }; var advisorCalled = false; for (var turn = 1; turn <= MaxTurns; turn++) @@ -918,9 +906,8 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod Messages = messages, Betas = ["advisor-tool-2026-03-01"] }); - messages.Add(new BetaMessageParam + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); advisorCalled = @@ -941,12 +928,12 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod var results = RunYourTools(response.Content); // list of tool_result blocks if (results.Count > 0) { - messages.Add(new BetaMessageParam { Role = Role.User, Content = results }); + messages.Add(new BetaUserMessageParam { Content = results }); } // Skip this if your system prompt already tells the model to call sparingly. if (turn == NudgeTurn - 1 && !advisorCalled) { - messages.Add(new BetaMessageParam { Role = Role.User, Content = NudgeText }); + messages.Add(new BetaUserMessageParam { Content = NudgeText }); } } ``` @@ -1074,10 +1061,7 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod ); String task = "Build a concurrent worker pool in Go with graceful shutdown."; List messages = new ArrayList<>(); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(task) - .build()); + messages.add(BetaMessageParam.ofUser(task)); boolean advisorCalled = false; for (int turn = 1; turn <= MAX_TURNS; turn++) { @@ -1088,11 +1072,7 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod .messages(messages) .addBeta("advisor-tool-2026-03-01") .build()); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.ASSISTANT) - .contentOfBetaContentBlockParams( - response.content().stream().map(BetaContentBlock::toParam).toList()) - .build()); + messages.add(response.toParam()); advisorCalled = advisorCalled || response.content().stream().anyMatch(block -> block.isServerToolUse() @@ -1107,17 +1087,11 @@ With the default `NUDGE_TURN` of 2, the reminder typically arrives after the mod List results = runYourTools(response.content()); // list of tool_result blocks if (!results.isEmpty()) { - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .contentOfBetaContentBlockParams(results) - .build()); + messages.add(BetaMessageParam.ofUserOfContentBlockParams(results)); } // Skip this if your system prompt already tells the model to call sparingly. if (turn == NUDGE_TURN - 1 && !advisorCalled) { - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(NUDGE_TEXT) - .build()); + messages.add(BetaMessageParam.ofUser(NUDGE_TEXT)); } } } @@ -1251,7 +1225,7 @@ To force a consult on a specific request instead of nudging, set `tool_choice` t The advisor sub-inference does not stream. The executor's stream pauses while the advisor runs; then the full result arrives in a single event. -The `server_tool_use` block with `name: "advisor"` signals that an advisor call is starting. The pause begins when that block closes (`content_block_stop`). During the pause, the stream is quiet except for standard SSE `ping` keepalives emitted roughly every 30 seconds. Short advisor calls might show no pings. +The `server_tool_use` block with `name: "advisor"` signals that an advisor call is starting. The pause starts when that block closes (`content_block_stop`). During the pause, the stream is quiet except for standard SSE `ping` keepalives emitted roughly every 30 seconds. Short advisor calls might show no pings. When the advisor finishes, the `advisor_tool_result` arrives fully formed in a single `content_block_start` event (no deltas). Executor output then resumes streaming. @@ -1404,12 +1378,12 @@ Set `caching` on the tool definition to enable prompt caching for the advisor's The advisor's prompt on the Nth call is the (N-1)th call's prompt with one more segment appended, so the prefix is stable across calls. With `caching` enabled, each advisor call writes a cache entry, and the next call reads up to that point and pays only for the delta. You'll see `cache_read_input_tokens` become non-zero on the second and later `advisor_message` iterations. -**When to enable it:** The cache write costs more than the reads save when the advisor is called two or fewer times per conversation. Caching breaks even at roughly three advisor calls and improves from there. Enable it for long agent loops, and keep it off for short tasks. +**When to enable it:** The cache write costs more than the reads save when the advisor is called two or fewer times in each conversation. Caching breaks even at roughly three advisor calls and improves from there. Enable it for long agent loops, and keep it off for short tasks. **Keep it consistent:** Set `caching` once and leave it for the whole conversation. Toggling it off and on mid-conversation causes cache misses. - [`clear_thinking`](https://platform.claude.com/docs/en/build-with-claude/context-editing) with a `keep` value other than `"all"` shifts the advisor's quoted transcript each turn, causing advisor-side cache misses. This is a cost degradation only. Advice quality is unaffected. When thinking is on without explicit `clear_thinking` configuration, the API defaults to `keep: {type: "thinking_turns", value: 1}`, which triggers this behavior (the default on earlier Opus and Sonnet models and on Haiku models through Claude Haiku 4.5; on Claude Opus 4.5 and later Opus models, Claude Sonnet 4.6 and later Sonnet models, and Claude Haiku 5.5, the default is to keep all turns). Set `keep: "all"` to preserve advisor cache stability. + [`clear_thinking`](https://platform.claude.com/docs/en/build-with-claude/context-editing) with a `keep` value other than `"all"` shifts the advisor's quoted transcript each turn, causing advisor-side cache misses. This is a cost degradation only. Advice quality is unaffected. When thinking is on without explicit `clear_thinking` configuration, the API defaults to `keep: {type: "thinking_turns", value: 1}`, which triggers this behavior (the default on earlier Opus and Sonnet models and on Haiku models through Claude Haiku 4.5, whereas on Claude Opus 4.5 and later Opus models, Claude Sonnet 4.6 and later Sonnet models, and Claude Haiku 5.5, the default is to keep all turns). Set `keep: "all"` to preserve advisor cache stability. ## Combining with other tools @@ -1630,7 +1604,7 @@ If you've already retrieved data pointing one way and the advisor points another #### Alternative system prompt for Haiku on coding workloads -Claude Haiku 4.5 applies the default advisor guidance conservatively. That keeps its call rate appropriately low on research and lookup workloads but gives up quality on coding workloads, where an early advisor consult reliably pays for itself. On an internal coding benchmark, a close variant of the following block (the read-only carve-out in the Hard rule was added after measurement) raised Haiku pass rates by roughly 7.5 percentage points over the built-in default. +Claude Haiku 4.5 applies the default advisor guidance conservatively. That keeps its call rate appropriately low on research and lookup workloads but gives up quality on coding workloads, where an early advisor consult is reliably worth its cost. On an internal coding benchmark, a close variant of the following block (the read-only carve-out in the Hard rule was added after measurement) raised Haiku pass rates by roughly 7.5 percentage points over the built-in default. Use this block in place of the earlier timing and advice blocks when your Haiku executor runs predominantly coding or write-task workloads: @@ -1673,7 +1647,7 @@ Hard rule: your first write_file, edit_file, or state-changing bash call on a ta #### Trimming advisor output length -Advisor output is the advisor's largest cost driver, and the top-level `max_tokens` does not bound it. The advisor sees both your system prompt and your user messages as quoted context about the executor's task, so instructions that address the advisor directly are followed much more reliably than third-person descriptions. The most effective placement Anthropic tested is a line in the user message: +Advisor output is the advisor's largest cost driver, and the top-level `max_tokens` does not bound it. The advisor receives both your system prompt and your user messages as quoted context about the executor's task, so instructions that address the advisor directly are followed much more reliably than third-person descriptions. The most effective placement Anthropic tested is a line in the user message: ```text wrap (Advisor: please keep your guidance under 80 words — I need a focused starting point, not a comprehensive plan.) @@ -1689,7 +1663,7 @@ Pair this approach with the timing guidance in [Suggested system prompt for codi ### Capping advisor output -Set `max_tokens` on the tool definition to cap the advisor's total output (thinking plus text) per call: +Set `max_tokens` on the tool definition to cap the advisor's total output (thinking plus text) for each call: ```python Python @@ -1776,7 +1750,7 @@ The minimum value is 1024. Setting `max_tokens` above the advisor model's own ou This is not a hard truncation alone. The server also passes the advisor its remaining-token budget, so the advisor shapes its response to fit. -**Recommended starting point:** `max_tokens: 2048`. In Anthropic's testing on a hard reasoning benchmark (n = 40 per configuration), this reduced mean advisor output by roughly 7x compared with leaving the cap unset, with near-zero truncation and no detectable quality degradation. The minimum value of 1024 reduced output roughly 10x but truncated around 10 percent of calls. Accuracy differences across all configurations were within noise at this sample size. Validate on your own workload. +**Recommended starting point:** `max_tokens: 2048`. In Anthropic's testing on a hard reasoning benchmark (n = 40 for each configuration), this reduced mean advisor output by roughly 7x compared with leaving the cap unset, with near-zero truncation and no detectable quality degradation. The minimum value of 1024 reduced output roughly 10x but truncated around 10 percent of calls. Accuracy differences across all configurations were within noise at this sample size. Validate on your own workload. | `max_tokens` | Mean advisor output tokens | Calls truncated | | ------------ | -------------------------- | --------------- | @@ -1786,7 +1760,7 @@ This is not a hard truncation alone. The server also passes the advisor its rema Hard reasoning tasks elicit substantially longer advisor output than the [typical 1,400 to 1,800 tokens](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#usage-and-billing) quoted earlier for lighter workloads. Use this table to size the savings ratio, not as a universal baseline for advisor output. -When the advisor does hit the cap, the result block carries `stop_reason: "max_tokens"` on both [result variants](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#result-variants), whichever advisor model you use. Use `stop_reason` to detect truncated advice and decide whether to raise the cap or let the executor proceed with partial guidance. The API also appends `[Advisor output truncated at max_tokens=2048.]` (naming your cap) to the advice text, so the executor sees the truncation in its own context; with a plaintext `advisor_result` advisor that marker is visible to your client as well. Both signals appear only when you set `max_tokens` on the tool definition. +When the advisor does hit the cap, the result block carries `stop_reason: "max_tokens"` on both [result variants](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#result-variants), whichever advisor model you use. Use `stop_reason` to detect truncated advice and decide whether to raise the cap or let the executor proceed with partial guidance. The API also appends `[Advisor output truncated at max_tokens=2048.]` (naming your cap) to the advice text, so the executor receives the truncation notice in its own context; with a plaintext `advisor_result` advisor that marker is visible to your client as well. Both signals appear only when you set `max_tokens` on the tool definition. ```json { @@ -1852,7 +1826,7 @@ The advisor tool is available in beta on the Claude API and on [Claude Platform - Work with Anthropic-executed tools: server\_tool\_use blocks, pause\_turn continuation, and domain filtering. + Work with tools that Anthropic runs: `server_tool_use` blocks, `pause_turn` continuation, and domain filtering. @@ -1860,6 +1834,6 @@ The advisor tool is available in beta on the Claude API and on [Claude Platform - Control how many tokens Claude uses when responding with the effort parameter, trading off between response thoroughness and token efficiency. + Control how many tokens Claude uses when responding with the `effort` parameter, trading off between response thoroughness and token efficiency. diff --git a/content/en/agents-and-tools/tool-use/bash-tool.md b/content/en/agents-and-tools/tool-use/bash-tool.md index 1ce1367662..2ed5c867d7 100644 --- a/content/en/agents-and-tools/tool-use/bash-tool.md +++ b/content/en/agents-and-tools/tool-use/bash-tool.md @@ -17,7 +17,7 @@ The current version of the tool is `bash_20250124`. For model support, beta head ## Use cases * **Development workflows:** Run build commands, tests, and development tools -* **System automation:** Execute scripts, manage files, automate tasks +* **System automation:** Run scripts, manage files, automate tasks * **Data processing:** Process files, run analysis scripts, manage datasets * **Environment setup:** Install packages, configure environments @@ -99,11 +99,7 @@ The current version of the tool is `bash_20250124`. For model support, beta head Tools = [new ToolBash20250124()], Messages = [ - new() - { - Role = Role.User, - Content = "List all Python files in the current directory.", - }, + new UserMessageParam { Content = "List all Python files in the current directory." }, ], } ); @@ -220,7 +216,7 @@ Each tool call is one round trip between Claude and your application: Claude can also return several `tool_use` blocks in one response. Run them in order in the same session and return all of the results in one `user` message. See [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use). -The API is stateless. Nothing about your shell session travels between requests, so your application decides when the session starts, how long it lives, and when to restart it. For the full request and response cycle, see [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). +The API is stateless. Nothing about your shell session travels between requests, so your application determines when the session starts, how long it lives, and when to restart it. For the full request and response cycle, see [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). ## Parameters @@ -683,7 +679,7 @@ Claude determines which command to run. Your application owns everything else: t ``` - The session interleaves stderr with stdout, so error messages land where they happened. The example leaves out what a complete implementation also needs: a timeout that kills the shell and every process it started when a command hangs, then restarts the session. The [Use command timeouts](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool#follow-implementation-best-practices) best practice shows one way to add it. + The session interleaves stderr with stdout, so error messages land where they occurred. The example leaves out what a complete implementation also needs: a timeout that kills the shell and every process it started when a command hangs, then restarts the session. The [Use command timeouts](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool#follow-implementation-best-practices) best practice shows one way to add it. @@ -832,7 +828,7 @@ Claude determines which command to run. Your application owns everything else: t - Send the `tool_result` back in a `user` message that continues the same conversation. Claude either requests another command in the same session or finishes its answer: + Send the `tool_result` back in a `user` message that continues the same conversation. Claude either requests another command in the same session or completes its answer: ```bash cURL @@ -994,15 +990,10 @@ Claude determines which command to run. Your application owns everything else: t Tools = [new ToolBash20250124()], Messages = [ - new() - { - Role = Role.User, - Content = "List all Python files in the current directory.", - }, - new() + new UserMessageParam { Content = "List all Python files in the current directory." }, + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolUseBlockParam() { @@ -1013,19 +1004,18 @@ Claude determines which command to run. Your application owns everything else: t ["command"] = JsonSerializer.SerializeToElement("ls *.py"), }, }), - }), + }, }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = "toolu_01A09q90qw90lq917835lq9", Content = "analysis.py\nprocess_data.py\n", }), - }), + }, }, ], } @@ -1083,7 +1073,7 @@ Claude determines which command to run. Your application owns everything else: t .maxTokens(1024) .addTool(ToolBash20250124.builder().build()) .addUserMessage("List all Python files in the current directory.") - .addAssistantMessageOfBlockParams( + .addAssistantMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolUse( ToolUseBlockParam.builder() @@ -1098,7 +1088,7 @@ Claude determines which command to run. Your application owns everything else: t ) ) ) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() @@ -1442,11 +1432,11 @@ Claude determines which command to run. Your application owns everything else: t ### Handle errors -When a command fails or the session breaks, tell Claude what happened. Return the message as the `tool_result` content and set `is_error` to `true`, which marks the tool call as failed. See [Handling errors with is\_error](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls#handling-errors-with-is-error). +When a command fails or the session breaks, tell Claude what occurred. Return the message as the `tool_result` content and set `is_error` to `true`, which marks the tool call as failed. See [Handling errors with is\_error](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls#handling-errors-with-is-error). - If a command takes too long to execute: + If a command takes too long to run: ```json { @@ -1504,7 +1494,7 @@ When a command fails or the session breaks, tell Claude what happened. Return th - A command that never finishes, such as one that waits for input, blocks the session forever because its sentinel line never arrives. Give every command a deadline. When the deadline passes, stop the shell and everything the command started, then restart the session: + A command that never completes, such as one that waits for input, blocks the session forever because its sentinel line never arrives. Give every command a deadline. When the deadline passes, stop the shell and everything the command started, then restart the session: ```python Python @@ -1813,7 +1803,7 @@ When a command fails or the session breaks, tell Claude what happened. Return th - Keep an audit trail. Route every command through one wrapper that records the command before it runs and the output after it finishes. A command that hangs or breaks the session still leaves a record: + Keep an audit trail. Route every command through one wrapper that records the command before it runs and the output after it completes. A command that hangs or breaks the session still leaves a record: ```python Python @@ -1939,9 +1929,9 @@ See [tool use pricing](https://platform.claude.com/docs/en/agents-and-tools/tool * Running tests: `pytest && coverage report` * Building projects: `npm install && npm run build` -* Git operations: `git status && git add . && git commit -m "message"` +* Running Git operations: `git status && git add . && git commit -m "message"` -For guidance on using git as a checkpoint-and-recovery mechanism in long-running agent workflows, see [state management best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#state-management-best-practices). +For guidance on using Git as a checkpoint-and-recovery mechanism in long-running agent workflows, see [state management best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#state-management-best-practices). ### File operations @@ -1952,8 +1942,8 @@ For guidance on using git as a checkpoint-and-recovery mechanism in long-running ### System tasks * Checking resources: `df -h && free -m` -* Process management: `ps aux | grep python` -* Environment setup: `export PATH=$PATH:/new/path && echo $PATH` +* Managing processes: `ps aux | grep python` +* Setting up the environment: `export PATH=$PATH:/new/path && echo $PATH` ## Limitations @@ -1979,6 +1969,6 @@ The bash tool pairs well with the [Text editor tool](https://platform.claude.com - Connect Claude to external tools and APIs. See where tools execute, when Claude calls them, and which tool fits your task. + Connect Claude to external tools and APIs. See where tools run, when Claude calls them, and which tool fits your task. diff --git a/content/en/agents-and-tools/tool-use/browser-use-sdk.md b/content/en/agents-and-tools/tool-use/browser-use-sdk.md index 9bba9cdb5f..518292cd2b 100644 --- a/content/en/agents-and-tools/tool-use/browser-use-sdk.md +++ b/content/en/agents-and-tools/tool-use/browser-use-sdk.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-s description: Run the browser use tool or the computer use tool from the Python or TypeScript SDK. The SDK runs the loop and the checks you configure, and you supply the browser or the desktop. --- -With the browser and computer toolsets in the Python and TypeScript SDKs, you can build an agent that works in a web browser or on a desktop. It can use applications with no programmatic interface. Through the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool), Claude navigates, reads, and interacts with webpages. Through the [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool), Claude sees a desktop in screenshots and uses the mouse and keyboard. +With the browser and computer toolsets in the Python and TypeScript SDKs, you can build an agent that works in a web browser or on a desktop. It can use applications with no programmatic interface. Through the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool), Claude navigates, reads, and interacts with webpages. Through the [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool), Claude receives screenshots of a desktop and uses the mouse and keyboard. The SDK connects Claude to your browser or desktop. It runs the checks you configure, such as a URL policy for `navigate` or an approval callback. It sends each call that passes to your driver and builds the `tool_result` from what the driver returns. The [tool runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner) can run the agentic loop for you. @@ -89,7 +89,7 @@ Browser Use, Browserbase, Daytona, and E2B publish their own drivers for the SDK -Our partners also publish code on GitHub: the [Browser Use quickstart](https://github.com/browser-use/browser-use/tree/main/examples/integrations/toolsets-for-claude), the [Browserbase toolset](https://github.com/browserbase/claude-cua-toolset), and the [E2B example](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/anthropic-computer-use-orangehrm-js). +Partner code is also available on GitHub: the [Browser Use quickstart](https://github.com/browser-use/browser-use/tree/main/examples/integrations/toolsets-for-claude), the [Browserbase toolset](https://github.com/browserbase/claude-cua-toolset), and the [E2B example](https://github.com/e2b-dev/e2b-cookbook/tree/main/examples/anthropic-computer-use-orangehrm-js). Do these two things before you run a driver against anything but a throwaway browser: @@ -173,7 +173,7 @@ Overriding `execute` changes which members Claude is offered. The SDK counts eve A driver is your subclass of `BetaAbstractBrowserToolset20260801`. In it, override the members your browser supports. A member you don't implement is sent to the API as disabled. If Claude calls it anyway, the SDK returns an error, and the run continues. Overriding `execute` changes which members are sent as disabled ([Add before and after hooks](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#add-before-and-after-hooks)). Each member receives the call context and the member's input as a typed object, such as `BetaBrowserNavigateInput`. The input types come from `anthropic.types.beta` (typescript: `@anthropic-ai/sdk/resources/beta`). [Member tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#member-tools) lists each input's fields. -In TypeScript, write members as methods, not arrow-function fields, because the SDK finds them on the prototype. Spell the `type` member `type_` in TypeScript. In Python, it's `type`. +In TypeScript, spell the `type` member `type_`, and write members as methods, not arrow-function fields, because the SDK finds them on the prototype. ### Return results @@ -191,25 +191,25 @@ What a member returns determines what Claude reads. A successful result ends wit The SDK calls `_browser_state` (typescript: `browserState`) after each call that returns a result, including refused and failed calls. Return every open tab, and what changed since the last report: -* Opened tabs and download events. -* A `BetaNavigationRefused` for each navigation your [request hook](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#intercept-requests-in-the-driver) blocked. -* A `BetaDialogDismissed` for each native dialog your driver dismissed. +* Opened tabs and download events +* A `BetaNavigationRefused` for each navigation your [request hook](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#intercept-requests-in-the-driver) blocked +* A `BetaDialogDismissed` for each native dialog your driver dismissed -Put all of these in `state_changes`. In Python, `BetaNavigationRefused()` and `BetaDialogDismissed(kind=..., message=...)` come from `anthropic.tools.browser`. In TypeScript, they're `{ type: "navigation_refused" }` and `{ type: "dialog_dismissed", kind, message }`. +Put all of these in `state_changes`. A refused navigation is `anthropic.tools.browser.BetaNavigationRefused()` (typescript: `{ type: "navigation_refused" }`), and a dismissed dialog is `anthropic.tools.browser.BetaDialogDismissed(kind=..., message=...)` (typescript: `{ type: "dialog_dismissed", kind, message }`). The last two aren't API state changes. The SDK reports them to Claude as text outside the `browser_state` block: one line for all refused navigations, which doesn't include a URL, and a line for each of the first three dismissed dialogs, then a count of any others. When any tab is open, exactly one must be active. Every member that takes a `tab_id` must act on the tab it names. The API's limits on the report are listed under [Track tabs with `browser_state`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#track-tabs-and-page-state). -Claude reads each tab's URL, each download's URL, and the URL that your `navigate` returns, as your driver wrote them. The SDK doesn't parse these URLs. It turns line breaks and other control characters into spaces, trims the ends, and cuts each URL at 4,096 characters. So a `data:` URL's contents, a `file:` URL's path, and a user name or password in a URL all reach Claude. +Claude reads each tab's URL, each download's URL, and the URL that your `navigate` returns, as your driver wrote them. The SDK doesn't parse these URLs. It turns line breaks and other control characters into spaces, trims the ends, and cuts each URL at 4,096 characters. So a `data:` URL's contents, a `file:` URL's path, and a username or password in a URL all reach Claude. ### Handle errors -| Raised by a member or the SDK | Claude reads | The run | -| ----------------------------- | ------------------------------------------------------------------------------------ | --------- | -| `ToolError` | Its message, as an error result | Continues | -| `ToolsetUsageError` | Nothing | Stops | -| Any other exception | `ClassName: message` in Python or `Error: message` in TypeScript, as an error result | Continues | +| Raised by a member or the SDK | Claude reads | The run | +| ----------------------------- | ----------------------------------------------------------------------- | --------- | +| `ToolError` | Its message, as an error result | Continues | +| `ToolsetUsageError` | Nothing | Stops | +| Any other exception | `ClassName: message` (typescript: `Error: message`), as an error result | Continues | The SDK raises `ToolsetUsageError` for a configuration error, a misuse of the SDK during a call, or a call after `close`. It also raises one when `_browser_state` (typescript: `browserState`) raises any exception, even a `ToolError`. The tool runner and `tool_result` (typescript: `toolResult`) don't catch it, so it reaches their caller. @@ -227,11 +227,11 @@ Early start changes when a call can start, not how the toolset runs it: * **The checks still run first:** The SDK calls your URL policy, your file policy, and `confirm` before a call runs. With early start, it can call `confirm` while the response is still streaming. * **Calls still run one at a time:** A toolset runs its calls in the order Claude wrote them. A failed call still stops that toolset's later calls in the turn. -* **A call that has started can't be taken back:** If the response is then cut off, for example at `max_tokens`, or your loop stops early, the action still happens, and Claude never reads its result. +* **A call that has started can't be taken back:** If the response is then cut off, for example at `max_tokens`, or your loop stops early, the action still occurs, and Claude never reads its result. ### Run without the tool runner -Pass the instance in `tools` (`browser.toJSON()` in TypeScript), and answer each member call with `tool_result` (typescript: `toolResult`). The browser use tool requires you to stop at the first failed call ([Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions)). +Pass `browser` (typescript: `browser.toJSON()`) in `tools`, and answer each member call with `tool_result` (typescript: `toolResult`). The browser use tool requires you to stop at the first failed call ([Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions)). This loop uses `MyBrowser` and the URL policy from the [advanced example](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#quick-start). After a failed call, it answers the turn's later calls without running them: @@ -567,7 +567,7 @@ This example puts the main parts of [Implement a driver](https://platform.claude ## Run the toolset safely -Claude's next action depends on the pages it reads. A page, or text injected into one, can try to reach internal services or pull files off the host. It can also try to trigger actions with real effects. Before you run a driver against anything but a throwaway browser, take these six steps: +Claude's next action depends on the pages it reads. A page, or text injected into one, can attempt to reach internal services or pull files off the host. It can also attempt to trigger actions with real effects. Before you run a driver against anything but a throwaway browser, take these six steps: 1. [Write a URL policy](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#write-a-url-policy) that refuses every `navigate` URL the task doesn't need. 2. [Intercept requests in the driver](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#intercept-requests-in-the-driver), and check each request with the same rules. @@ -587,7 +587,7 @@ The SDK applies steps 1, 4, and 5 through the policies and the callable you pass Without a URL policy, the SDK checks no URL, and the API doesn't filter the URLs Claude opens. Even with a policy, a link Claude clicks or a redirect can take the browser to loopback (`localhost`, `127.0.0.1`), to link-local addresses such as the cloud metadata address `169.254.169.254`, and to private network ranges. [Egress rules on the container](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#put-egress-policy-on-the-container) can block the link-local and private addresses. Rules enforced outside the container can't block loopback. - The SDK doesn't check a URL's scheme, so your driver must refuse every scheme it doesn't mean to open, such as `javascript:`, `view-source:`, `data:`, and `file:`. Most drivers need only `http` and `https`. The example policy below allows only `http` and `https` URLs, plus `about:blank`. + The SDK doesn't check a URL's scheme, so your driver must refuse every scheme it doesn't mean to open, such as `javascript:`, `view-source:`, `data:`, and `file:`. Most drivers need only `http` and `https`. The example policy later in this section allows only `http` and `https` URLs, plus `about:blank`. A `file:` URL lets Claude read files on the browser host. A `javascript:` URL runs script in the current page, even when `javascript_exec` is off. Egress rules don't stop either one. @@ -676,7 +676,7 @@ If you pass `url_policy=None` (typescript: `urlPolicy: null`), the SDK refuses e ### Intercept requests in the driver -The URL policy judges only the URL in a `navigate` call. A link Claude clicks, a form it submits, a redirect, or an image or script on an allowed page can still reach a host the policy would refuse. Use [egress rules](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#put-egress-policy-on-the-container) to block those hosts. +The URL policy checks only the URL in a `navigate` call. A link Claude clicks, a form it submits, a redirect, or an image or script on an allowed page can still reach a host the policy would refuse. Use [egress rules](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#put-egress-policy-on-the-container) to block those hosts. A driver with request interception can also check those requests in its request hook, the function your automation library calls before each request. Call the function that your policy uses, so that you write the rules once: @@ -868,7 +868,7 @@ This example asks about the two gated members through your own `ask_user` (types Each call to `make_confirm()` (typescript: `makeConfirm()`) returns a callable with no approvals. Call it once for each toolset, and give each user their own toolset. -An approval covers the page as the last state report showed it, and the page can change before the call runs. Purchases, sent messages, and accepted terms happen through ordinary members such as `left_click` and `type`, so `confirm` can't pick them out by name. To have a person approve them, ask about those members too. +An approval covers the page as the last state report showed it, and the page can change before the call runs. Purchases, sent messages, and accepted terms go through ordinary members such as `left_click` and `type`, so `confirm` can't pick them out by name. To have a person approve them, ask about those members too. Don't enable `javascript_exec` unless [egress rules](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#put-egress-policy-on-the-container) limit the browser's outbound connections to the hosts the task needs. A script can send the page's content to any address that the browser can reach. @@ -899,7 +899,7 @@ With a hosted browser, the provider controls egress and host isolation. Your own The shipped path checks don't protect a remote browser. `BetaLocalFilePolicy` (typescript: `BetaNodeFilePolicy`) checks paths on the filesystem of the process that runs the SDK, and the browser reads and writes its own filesystem. -The SDK can't detect that a browser is remote. So for a remote browser, keep `file_upload` off unless your driver checks upload paths where the browser runs, with a `BetaFilePolicy` of its own. A `BetaFilePolicy` vets each upload's paths and document IDs, and decides whether Claude sees a download's path. +The SDK can't detect that a browser is remote. So for a remote browser, keep `file_upload` off unless your driver checks upload paths where the browser runs, with a `BetaFilePolicy` of its own. A `BetaFilePolicy` vets each upload's paths and document IDs, and determines whether Claude sees a download's path. Have a remote browser refuse downloads, unless its own host has the download setup from [Confine uploads and downloads](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#confine-uploads-and-downloads). @@ -907,7 +907,7 @@ Keep the provider's API key and the session's connection URL, which can contain ## Computer toolset -`BetaAbstractComputerToolset20260801` is the class for the [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool). A driver is a subclass with one method per tool, such as `screenshot` or `left_click`. Start from a partner's driver under [Partner integrations](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#partner-integrations). To write your own, the claude-quickstarts repository has a [minimal VNC example](https://github.com/anthropics/claude-quickstarts/tree/main/computer-toolset) in Python and TypeScript. It controls a desktop over VNC, and it isn't production code. +`BetaAbstractComputerToolset20260801` is the class for the [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool). A driver is a subclass with one method for each tool, such as `screenshot` or `left_click`. Start from a partner's driver under [Partner integrations](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#partner-integrations). To write your own, the claude-quickstarts repository has a [minimal VNC example](https://github.com/anthropics/claude-quickstarts/tree/main/computer-toolset) in Python and TypeScript. It controls a desktop over VNC, and it isn't production code. The class takes `configs`, `confirm`, and `tool_configs` (typescript: `toolConfigs`), and you pass them as you do for the browser class. [Customize a driver](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#customize-a-driver), [Handle errors](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#handle-errors), [Start calls while the response streams](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#start-calls-while-the-response-streams), and [Run without the tool runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#run-without-the-tool-runner) apply to it too, with these differences: @@ -1165,7 +1165,7 @@ The SDK never reads or resizes an image. The API rejects an image over the model Don't rely on the SDK to check a call's input. Have your driver check the fields it uses and refuse a call it can't run: raise `ToolError` (throw it in TypeScript). Claude reads the message and can send a corrected call. -Neither SDK limits a `duration`, a `repeat` count, or a `scroll_amount`. Step 4 under [Run the computer toolset safely](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#run-the-computer-toolset-safely) covers them. +The SDK doesn't limit a `duration`, a `repeat` count, or a `scroll_amount`. Step 4 under [Run the computer toolset safely](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk#run-the-computer-toolset-safely) covers them. What a tool returns determines what Claude reads: @@ -1177,7 +1177,7 @@ What a tool returns determines what Claude reads: ### Run the computer toolset safely -What's on the screen steers Claude's next action. A page or a notification can try to make Claude type into the wrong window, or trigger an action with real effects. +What's on the screen steers Claude's next action. A page or a notification can attempt to make Claude type into the wrong window, or trigger an action with real effects. A driver that implements `type`, `key`, or `hold_key` needs a `confirm` callable. Without one, the constructor raises a configuration error, unless `configs` turns those tools off. The SDK itself asks no one: it runs every call that your `confirm` approves, and with no `confirm` it runs every call, including every click. Every computer tool you implement is on by default. diff --git a/content/en/agents-and-tools/tool-use/browser-use-tool.md b/content/en/agents-and-tools/tool-use/browser-use-tool.md index 27140b2cfe..75642a1214 100644 --- a/content/en/agents-and-tools/tool-use/browser-use-tool.md +++ b/content/en/agents-and-tools/tool-use/browser-use-tool.md @@ -29,7 +29,7 @@ featureMetadata: The browser use tool lets Claude navigate, read, and interact with webpages in a browser that your application runs. Claude works with the page both through its structure (the accessibility tree, elements, forms, and tabs) and through screenshots and viewport coordinates. -The tool is an Anthropic-defined [client toolset](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets): one `browser_toolset_20260801` entry in `tools` gives Claude 27 member tools by default, such as `navigate`, `read_page`, `left_click`, and `screenshot`, plus four more when you [enable them](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#enable-optional-member-tools). Your application runs every call against its own browser automation; nothing runs on Anthropic's side. The tool isn't currently available in [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/tools). +The tool is an Anthropic-defined [client toolset](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets): one `browser_toolset_20260801` entry in `tools` gives Claude 27 member tools by default, such as `navigate`, `read_page`, `left_click`, and `screenshot`, plus four more when you [enable optional members](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#enable-optional-member-tools). Your application runs every call against its own browser automation; nothing runs on Anthropic's side. The tool isn't currently available in [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/tools). Choose browser use when the task stays inside webpages and means acting on them, or when pages build their content with JavaScript. When a task needs a whole desktop, use the [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool), which works through screenshots and coordinates alone. For reading pages you can point Claude to, or finding sources on the web, the [web fetch tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) and [web search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) are lighter. They're [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) that the API runs for you, with no browser to operate. @@ -119,11 +119,7 @@ The browser use tool is available on the Claude API and [Google Cloud](https://p Tools = [new BrowserToolset20260801()], Messages = [ - new MessageParam - { - Role = Role.User, - Content = "Open example.com/docs and tell me how to get started.", - }, + new UserMessageParam { Content = "Open example.com/docs and tell me how to get started." }, ], }; @@ -240,7 +236,7 @@ Claude's first response ends with `stop_reason: "tool_use"` and carries one or m } ``` -Your executor (the part of your application that drives the browser and produces tool results) runs `navigate`, then `read_page`. Your application returns one `tool_result` per block in its next request, echoing `toolset_name` on each. The `navigate` result reports the tab it loaded in a `browser_state` block; the `read_page` result is text in which every element carries a reference: +Your executor (the part of your application that drives the browser and produces tool results) runs `navigate`, then `read_page`. Your application returns one `tool_result` for each block in its next request, echoing `toolset_name` on each. The `navigate` result reports the tab it loaded in a `browser_state` block; the `read_page` result is text in which every element carries a reference: ```json { @@ -299,7 +295,7 @@ Browser use runs as an agent loop in your application: Claude returns member too * Iterate every `tool_use` block in `response.content` (don't assume there's exactly one) and run them sequentially, in the order they appear, because later calls usually depend on earlier ones. - * Return one `tool_result` per block in a new `user` message, matched by `tool_use_id`, and echo `"toolset_name": "browser"` on each. Every call must be answered or the next request is rejected. + * Return one `tool_result` for each block in a new `user` message, matched by `tool_use_id`, and echo `"toolset_name": "browser"` on each. Answer every call, or the next request is rejected. * If a call fails, return `is_error: true` with a text description for that block, then apply the halt rule in [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions) to every later block in the turn. @@ -1091,7 +1087,7 @@ Your application returns three `tool_result` blocks in one `user` message, each You don't need to return a screenshot after every call. Claude typically ends a batch with an observation call (`screenshot`, `read_page`, or `get_page_text`), and your application can also attach its own observation, such as a fresh screenshot or accessibility tree, as an extra content block on the last result in the batch to save a round trip. Because a tab-management result must be exactly one `browser_state` block, attach it to the last result that isn't a tab-management call. -If your executor can run only one call per round trip, set `disable_parallel_tool_use` to `true` in `tool_choice` and Claude returns at most one member call per turn, at the cost of more round trips ([Disable parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use#disable-parallel-tool-use)). The rest of the contract under [Batch actions for the computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions) carries over, including one `tool_result` for every `tool_use` in the next `user` message, except for two things: the halt text and what a successful result's `content` holds. Result content follows [Member tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#member-tools) on this page instead: a `new_tab`, `switch_tab`, `close_tab`, or `list_tabs` result is exactly one `browser_state` block with no text or image ([Tab management results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-management-results)), and any other member's result may add a `browser_state` block to its text or image ([Tab context on other results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-context-on-other-results)). Where cache breakpoints inside a batch take effect is described in the `cache_control` row of the computer use tool's [Tool parameters](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#tool-parameters). +If your executor can run only one call for each round trip, set `disable_parallel_tool_use` to `true` in `tool_choice` and Claude returns at most one member call for each turn, at the cost of more round trips ([Disable parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use#disable-parallel-tool-use)). The rest of the contract under [Batch actions for the computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions) carries over, including one `tool_result` for every `tool_use` in the next `user` message, except for two things: the halt text and what a successful result's `content` holds. Result content follows [Member tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#member-tools) on this page instead: a `new_tab`, `switch_tab`, `close_tab`, or `list_tabs` result is exactly one `browser_state` block with no text or image ([Tab management results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-management-results)), and any other member's result may add a `browser_state` block to its text or image ([Tab context on other results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-context-on-other-results)). Where cache breakpoints inside a batch take effect is described in the `cache_control` row of the computer use tool's [Tool parameters](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#tool-parameters). ### Targets and coordinates @@ -1102,7 +1098,7 @@ Member tools that act on a location take a `target` object, which is either a vi | `CoordinateTarget` | `"coordinate"` | `x`, `y` (integers, viewport pixels) | `left_click`, `right_click`, `middle_click`, `double_click`, `triple_click`, `hover`, `left_click_drag` (`from` and `target`), `left_mouse_down`, `left_mouse_up`, `mouse_move`, `scroll` | | `RefTarget` | `"ref"` | `ref` (an element reference such as `"ref_2"`) | `left_click`, `right_click`, `middle_click`, `double_click`, `triple_click`, `hover`, `scroll_to`, `form_input`, `file_upload` | -**Coordinates are viewport pixels**, the pixel space of a full-viewport `screenshot` with the origin at the top left of the rendered page; there's no surrounding desktop or window frame. The toolset declares no display dimensions and Claude infers the viewport size from the screenshots you return, so keep them one consistent size. A `zoom` doesn't change the frame, so its `region` and any coordinates Claude emits after seeing the zoomed image are still full-viewport pixels. +**Coordinates are viewport pixels**, the pixel space of a full-viewport `screenshot` with the origin at the top left of the rendered page; there's no surrounding desktop or window frame. The toolset declares no display dimensions and Claude infers the viewport size from the screenshots you return, so keep them one consistent size. A `zoom` doesn't change the frame, so its `region` and any coordinates Claude emits after receiving the zoomed image are still full-viewport pixels. **Screenshots must fit the image limits.** The API doesn't downscale toolset images: a screenshot or zoom image over your model's [image size limits](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size), or over the stricter per-image limit that applies once a request holds [more than 20 images](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits), is rejected. Resize before returning, and scale Claude's coordinates back up by the inverse of your factor before dispatching them ([Size screenshots to fit image limits](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#handle-coordinate-scaling-for-higher-resolutions)). @@ -1122,7 +1118,7 @@ References are scoped to the tab that produced them and stay valid until that ta Claude uses both targeting styles and switches between them based on what the page exposes; your prompt and what your executor returns steer the choice: -* **Prefer references where the page has a usable accessibility tree.** A reference survives layout shifts and reflows that make pixel coordinates fragile, and lets Claude act on controls that are hard to hit with a pointer. +* **Prefer references where the page has a usable accessibility tree.** A reference survives layout shifts and reflows that make pixel coordinates fragile, and lets Claude act on controls that are hard to click with a pointer. * **Fall back to coordinates for content the tree doesn't describe.** Canvas-rendered interfaces, embedded video or remote-desktop surfaces, heavily virtualized lists, and elements inside cross-origin iframes often have no useful node, so Claude works from `screenshot` and `zoom` and clicks by coordinate; your executor resolves which frame a coordinate lands in. * **Scope reads, and read the tree before you screenshot.** On large pages, `read_page` with `filter: "interactive"` or the `ref` of a container returns a focused subtree, and a tree read of a typical page often costs fewer input tokens than a screenshot while giving Claude references it can act on immediately. Screenshots remain the right observation when visual layout, images, or rendering state matter. @@ -1145,15 +1141,15 @@ Claude sometimes follows instructions found in page content even when they confl Anthropic has trained the model to resist these prompt injections and has added an extra layer of defense. If you use the browser use tool, classifiers will automatically scan what the browser returns, such as page text or screenshots, to flag potential prompt injections. When these classifiers identify a potential prompt injection, they will automatically steer the model to check whether the instruction really came from you before acting on it. -This extra protection won't be ideal for every use case (for example, use cases without a human in the loop), so if you'd like to opt out and turn it off, [contact support](https://support.claude.com/en/). The precautions above remain important even with these classifiers in place. +This extra protection isn't ideal for every use case (for example, use cases without a human in the loop), so if you'd like to opt out and turn it off, [contact support](https://support.claude.com/en/). The precautions listed earlier remain important even with these classifiers in place. Because the browser runs in your environment, the sites Claude visits see your executor's network identity, and page content reaches the API only as the tool results you return. Inform end users of the relevant risks and obtain their consent before enabling browser use in your products. ## Member tools -The `browser_toolset_20260801` entry declares 31 member tools; each call's `input` is exactly the parameters listed here, and `tab_id`, where optional, defaults to the active tab. `Target`, `CoordinateTarget`, and `RefTarget` are the shapes described in [Targets and coordinates](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#targets-and-coordinates). Four members (`javascript_exec`, `file_upload`, `read_console`, and `read_network`) are disabled by default and appear only when you [enable them](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#enable-optional-member-tools). The input bounds and output conventions noted in each member's row are stated to Claude, not enforced by the API, so validate inputs (including coordinates against your viewport) and apply the conventions in your executor. +The `browser_toolset_20260801` entry declares 31 member tools; each call's `input` is exactly the parameters listed here, and `tab_id`, where optional, defaults to the active tab. `Target`, `CoordinateTarget`, and `RefTarget` are the shapes described in [Targets and coordinates](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#targets-and-coordinates). Four members (`javascript_exec`, `file_upload`, `read_console`, and `read_network`) are disabled by default and appear only when you enable them (see [Enable optional members](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#enable-optional-member-tools)). The input bounds and output conventions noted in each member's row are stated to Claude, not enforced by the API, so validate inputs (including coordinates against your viewport) and apply the conventions in your executor. -Only `screenshot` and `zoom` require an [`image` block](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls#handling-results-from-client-tools) in their result, and the four tab-management members (`new_tab`, `list_tabs`, `switch_tab`, and `close_tab`) return exactly one `browser_state` block (see [Tab management results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-management-results)). Every other member returns a `text` block: either a short acknowledgment such as `Clicked element ref_2.` or the member's output. Any result other than a tab-management result may also carry an `image` block, typically a screenshot taken after the action, so Claude sees the outcome without a separate `screenshot` call; [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions) shows where to attach one in a batch. A member `tool_result` may contain only `text`, `image`, and `browser_state` content blocks. +Only `screenshot` and `zoom` require an [`image` block](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls#handling-results-from-client-tools) in their result, and the four tab-management members (`new_tab`, `list_tabs`, `switch_tab`, and `close_tab`) return exactly one `browser_state` block (see [Tab management results](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#tab-management-results)). Every other member returns a `text` block: either a short acknowledgment such as `Clicked element ref_2.` or the member's output. Any result other than a tab-management result may also carry an `image` block, typically a screenshot taken after the action, so Claude receives the outcome without a separate `screenshot` call; [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions) shows where to attach one in a batch. A member `tool_result` may contain only `text`, `image`, and `browser_state` content blocks. ### Navigation and capture @@ -1194,7 +1190,7 @@ Only `screenshot` and `zoom` require an [`image` block](https://platform.claude. | Member | Input | Description | | --------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `read_page` | `filter?`, `depth?`, `ref?`, `tab_id?` | Return the page's accessibility tree as text with each element tagged with a reference such as `[ref_2]`. With `filter` omitted, return every visible element; with `"interactive"`, only visible interactive elements; with `"all"`, also elements outside the viewport. `depth` caps the tree depth (minimum 1, default 15) and `ref` scopes the read to that element's subtree. Cap the output at 50,000 characters and say so in the text; Claude then narrows with a smaller `depth` or a `ref`. | -| `find` | `query`, `tab_id?` | Search for elements matching a natural-language description such as `"search field"` or `"add to cart button"`, and return up to 20 matches in the same tagged format as `read_page`. | +| `find` | `query`, `tab_id?` | Find elements matching a natural-language description such as `"search field"` or `"add to cart button"`, and return up to 20 matches in the same tagged format as `read_page`. | | `get_page_text` | `tab_id?` | Return the page's visible text as plain text, prioritizing the main article content; suited to articles, documentation, and other text-heavy pages. | ### Forms and files @@ -1248,7 +1244,7 @@ List only the members you want to change in `configs`; every member you omit kee } ``` -A disabled member disappears from the definition Claude sees; that doesn't guarantee Claude never names it, so your executor still answers such a call with an [error result](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#return-errors-from-your-executor). +A disabled member disappears from the definition Claude receives; that doesn't guarantee Claude never names it, so your executor still answers such a call with an [error result](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#return-errors-from-your-executor). ### Combine with other tools @@ -1289,13 +1285,13 @@ Claude writes these paths while it's reading untrusted pages, so an unrestricted ### Read console and network activity -`read_console` returns the tab's console entries and `read_network` returns its network requests, each as text with one line per entry accumulated since the previous read of that tab. A console line carries a log, warning, or error entry; a network line carries the method, URL, status, MIME type, and timing. Entries exist only from the moment your browser automation attached to the tab, so an empty result doesn't mean a tab that was already open had no traffic. +`read_console` returns the tab's console entries and `read_network` returns its network requests, each as text with one line for each entry accumulated since the previous read of that tab. A console line carries a log, warning, or error entry; a network line carries the method, URL, status, MIME type, and timing. Entries exist only from the moment your browser automation attached to the tab, so an empty result doesn't mean a tab that was already open had no traffic. -These members let Claude diagnose a misbehaving page (a failed request behind a spinner, a script error behind a dead button) without repeated screenshots. Console and network entries are page-controlled and often contain secrets such as tokens in request URLs, so redact credential-like values you don't want in Claude's context and truncate very long entries before returning them. +These members let Claude diagnose a misbehaving page (a failed request behind a spinner, a script error behind an unresponsive button) without repeated screenshots. Console and network entries are page-controlled and often contain secrets such as tokens in request URLs, so redact credential-like values you don't want in Claude's context and truncate very long entries before returning them. ## Track tabs with `browser_state` -Claude addresses tabs by `tab_id`, your application is the source of truth for which tabs exist, and you report that state in a `browser_state` content block that Claude never sees directly: the API renders the text Claude reads from it. +Claude addresses tabs by `tab_id`, your application is the source of truth for which tabs exist, and you report that state in a `browser_state` content block that Claude never receives directly: the API renders the text Claude reads from it. ```json { @@ -1313,8 +1309,8 @@ Claude addresses tabs by `tab_id`, your application is the source of truth for w ``` * `tabs` is the full inventory of open tabs after the call, not a delta. It may be empty; whenever it isn't, exactly one entry carries `"active": true`. -* `state_changes` (not shown here) reports side effects of the call: a `tab_opened` entry for each tab the call opened that's still open when it finishes, whose `tab_id` must also appear in `tabs`, and [download events](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#report-downloads). Omit the field when there's nothing to report; an empty array is rejected. -* Send the block only on results that answer a browser member call, at most once per `tool_result`, and never on a result with `is_error: true`. You express "no tab state to report" by omitting the block. +* `state_changes` (not shown here) reports side effects of the call: a `tab_opened` entry for each tab the call opened that's still open when it completes, whose `tab_id` must also appear in `tabs`, and [download events](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#report-downloads). Omit the field when there's nothing to report; an empty array is rejected. +* Send the block only on results that answer a browser member call, at most once for each `tool_result`, and never on a result with `is_error: true`. You express "no tab state to report" by omitting the block. * The API renders `tabs`, and any download entries in `state_changes`, into text for Claude. The next two sections and [Report downloads](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#report-downloads) show that text. **You assign `tab_id` values.** Any stable string works, such as your automation library's page identifier or your own counter, as long as you don't reuse a `tab_id` while a tab with that identifier is still listed as open in an earlier result. The API enforces these limits on the block: @@ -1324,14 +1320,14 @@ Claude addresses tabs by `tab_id`, your application is the source of truth for w * The same limits apply to the `tab_id` Claude passes to `switch_tab` and `close_tab`, because the API renders it into the result text, so answer a call whose `tab_id` violates them with an error result instead of a `browser_state` block. - Tab titles and URLs come from the page and render into text Claude reads, so they're a prompt-injection surface. The API renders tab URLs verbatim, so sanitize page-supplied URLs before populating `tabs`. It escapes double quotes and backslashes in titles when it renders them, so don't pre-escape titles (a pre-escaped title reaches Claude double-escaped); truncating or dropping suspicious titles is still worthwhile. A download entry's `url`, `path`, and `error` also render into text Claude reads, so treat them as untrusted too; the API quotes and escapes them as it does titles. The length and character limits the API enforces are a floor, not a defense. + Tab titles and URLs come from the page and render into text Claude reads, so they're a prompt-injection surface. The API renders tab URLs verbatim, so sanitize page-supplied URLs before populating `tabs`. It escapes double quotes and backslashes in titles when it renders them, so don't pre-escape titles (a pre-escaped title reaches Claude double-escaped); truncating or dropping suspicious titles is still worthwhile. A download entry's `url`, `path`, and `error` also render into text Claude reads, so treat them as untrusted too; the API quotes and escapes them as it does titles. The length and character limits the API enforces are a minimum, not a defense. ### Tab management results -For `new_tab`, `switch_tab`, `close_tab`, and `list_tabs`, a successful result's `content` is exactly one `browser_state` block with no text or image, and the API writes the text Claude sees. A `new_tab` result's block must also carry exactly one `tab_opened` state change whose `tab_id` matches the entry marked `active: true`. +For `new_tab`, `switch_tab`, `close_tab`, and `list_tabs`, a successful result's `content` is exactly one `browser_state` block with no text or image, and the API writes the text Claude receives. A `new_tab` result's block must also carry exactly one `tab_opened` state change whose `tab_id` matches the entry marked `active: true`. -| Member | Text Claude sees | +| Member | Text Claude receives | | ------------ | --------------------------------------------------------------------------------------------------------------------------- | | `switch_tab` | `Switched to tab {tab_id}`, taken from the call's `input.tab_id` | | `close_tab` | `Closed tab {tab_id}`, taken from the call's `input.tab_id` | @@ -1374,7 +1370,7 @@ For example, when Claude calls `new_tab` (its `input` is empty), your executor o } ``` -Claude sees `Created new tab with tab_id: tab-3, URL: about:blank. It is now the current tab.` Report the URL the tab was opened at, as here, not one it later redirects to; later results report the tab's then-current URL. +Claude receives `Created new tab with tab_id: tab-3, URL: about:blank. It is now the current tab.` Report the URL the tab was opened at, as here, not one it later redirects to; later results report the tab's then-current URL. ### Tab context on other results @@ -1393,7 +1389,7 @@ Tab Context: Three cases render no footer even when the block is present: * Any `zoom` result. -* A result with no `text` block (an image-only `screenshot` result, for example). Nothing is rendered or remembered for that result; the tab context appears on the next result that carries both text and a `browser_state` block, so include a short text block alongside the image when you want Claude to see a tab change on that same result. The exception is a result whose block reports a [download event](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#report-downloads). The API adds the download lines as a text block, and the footer follows them as it would on any result with text. +* A result with no `text` block (an image-only `screenshot` result, for example). Nothing is rendered or remembered for that result; the tab context appears on the next result that carries both text and a `browser_state` block, so include a short text block alongside the image when you want the tab change to reach Claude on that same result. The exception is a result whose block reports a [download event](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#report-downloads). The API adds the download lines as a text block, and the footer follows them as it would on any result with text. * A result whose `tabs` list is empty on a call that carried no `tab_id`, because there's no tab to name. For example, when Claude clicked the "Pricing" link (`ref_5`) earlier in this session, the page opened it in a new tab Claude didn't ask for, and without a report Claude would have to call `list_tabs` to discover it. Return the click's acknowledgment plus a block whose `state_changes` names the opened tab, marking whichever tab your executor left active: @@ -1427,17 +1423,17 @@ For example, when Claude clicked the "Pricing" link (`ref_5`) earlier in this se } ``` -Claude sees `Clicked element ref_5.` followed by the Tab Context footer shown earlier. A tab opened during a call that failed gets no `tab_opened` entry, because error results carry no `browser_state`; it appears in the `tabs` inventory of the next successful result instead. In a batch, attach the block to the result of the call during which the change happened, and give every successful tab-management result its own block even when an earlier result in the same turn reported the same state. +Claude receives `Clicked element ref_5.` followed by the Tab Context footer shown earlier. A tab opened during a call that failed gets no `tab_opened` entry, because error results carry no `browser_state`; it appears in the `tabs` inventory of the next successful result instead. In a batch, attach the block to the result of the call during which the change occurred, and give every successful tab-management result its own block even when an earlier result in the same turn reported the same state. ### Report downloads -When a click or navigation starts a file download, report it in `state_changes` on the result of the call during which it happened, correlated across results by a `download_id` you assign. Downloads run asynchronously and can span several results, so there are three event types: +When a click or navigation starts a file download, report it in `state_changes` on the result of the call during which it occurred, correlated across results by a `download_id` you assign. Downloads run asynchronously and can span several results, so there are three event types: -| `type` | Fields | When to send | -| -------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `download_started` | `download_id`, `url` | On the result of the call during which the download began. `url` is the final URL the file is served from, after redirects. | -| `download_completed` | `download_id`, `url`, `path?`, `size_bytes?` | On the result of whichever later call is running when the download finishes. Include `path` only when another tool in the same environment (for example, the [bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) or `file_upload`) can read the file there; otherwise `download_id` is the download's only identifier. | -| `download_failed` | `download_id`, `url`, `error?` | When the download fails or is canceled, with the reason in `error` if the browser provides one. | +| `type` | Fields | When to send | +| -------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `download_started` | `download_id`, `url` | On the result of the call during which the download started. `url` is the final URL the file is served from, after redirects. | +| `download_completed` | `download_id`, `url`, `path?`, `size_bytes?` | On the result of whichever later call is running when the download completes. Include `path` only when another tool in the same environment (for example, the [bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) or `file_upload`) can read the file there; otherwise `download_id` is the download's only identifier. | +| `download_failed` | `download_id`, `url`, `error?` | When the download fails or is canceled, with the reason in `error` if the browser provides one. | The API renders each entry as one line of text for Claude, in the order the entries appear. It adds the lines after the result's text, separated by a blank line, and before any Tab Context footer. Every kind of member result carries the lines, including `zoom` and tab-management results. A result with no `text` block gets them as a text block of its own. Each line gives the `download_id` and `url`, plus `path` and `size_bytes` (for `download_completed`) or `error` (for `download_failed`) when you send them. You don't need to describe the download in your own text. The API wraps `url`, `path`, and `error` in double quotes and escapes double quotes and backslashes inside them, so don't pre-escape these values. @@ -1467,7 +1463,7 @@ For example, a click on "Download price list (CSV)" (`ref_8`) in the Pricing tab } ``` -Claude sees `Screenshot captured.` followed by a blank line and a line like this: +Claude receives `Screenshot captured.` followed by a blank line and a line like this: ```text wrap Download completed with download_id: dl-1, URL: "https://example.com/pricing/price-list.csv". Saved to "/home/user/downloads/price-list.csv". Size: 48213 bytes. @@ -1475,7 +1471,7 @@ Download completed with download_id: dl-1, URL: "https://example.com/pricing/pri Download reports follow these rules: -* At most one entry per `download_id` in a single block, so a download that starts and finishes during the same call reports only `download_completed`. +* Send at most one entry for each `download_id` in a single block, so a download that starts and finishes during the same call reports only `download_completed`. * Never send `state_changes` on an `is_error: true` result; report a download event that occurred during a failed call on the next successful result. * `state_changes` isn't an inventory of downloads in progress; report each event once. * Each entry carries only the fields its `type` declares. `size_bytes` is a non-negative integer, `download_id` is non-empty, and `download_id`, `url`, `path`, and `error` are each at most 4,096 characters with no control characters or Unicode line or paragraph separators. The `url` comes from the remote server and often carries signed query-string credentials after redirects, so strip query parameters you don't want in Claude's context and sanitize it before reporting it or using it in a filesystem path. diff --git a/content/en/agents-and-tools/tool-use/build-a-tool-using-agent.md b/content/en/agents-and-tools/tool-use/build-a-tool-using-agent.md index efd814a8f6..873656a084 100644 --- a/content/en/agents-and-tools/tool-use/build-a-tool-using-agent.md +++ b/content/en/agents-and-tools/tool-use/build-a-tool-using-agent.md @@ -304,7 +304,7 @@ The request sends a `tools` array alongside the user message. When Claude determ MaxTokens = 1024, Tools = tools, ToolChoice = toolChoice, - Messages = [new() { Role = Role.User, Content = userPrompt }], + Messages = [new UserMessageParam { Content = userPrompt }], }); // When Claude calls a tool, the response has stop_reason "tool_use" @@ -349,9 +349,9 @@ The request sends a `tools` array alongside the user message. When Claude determ ToolChoice = toolChoice, Messages = [ - new() { Role = Role.User, Content = userPrompt }, - new() { Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() { Role = Role.User, Content = new MessageParamContent(toolResults) }, + new UserMessageParam { Content = userPrompt }, + new AssistantMessageParam { Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, + new UserMessageParam { Content = toolResults }, ], }); @@ -588,7 +588,7 @@ The request sends a `tools` array alongside the user message. When Claude determ .toolChoice(toolChoice) .addUserMessage(userPrompt) .addMessage(response) - .addUserMessageOfBlockParams(List.of(ContentBlockParam.ofToolResult( + .addUserMessageOfContentBlockParams(List.of(ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() .toolUseId(toolUse.id()) .content(result) @@ -770,7 +770,7 @@ The request sends a `tools` array alongside the user message. When Claude determ # Send the user's request along with the tool definition. Claude decides # whether to call the tool based on the request and the tool description. response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, tool_choice: tool_choice, @@ -795,7 +795,7 @@ The request sends a `tools` array alongside the user message. When Claude determ # its tool_use_id must match the id from the tool_use block above. The # assistant's previous response is included so Claude has the full history. followup = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, tool_choice: tool_choice, @@ -840,7 +840,7 @@ The first `stop_reason` is `tool_use` because Claude is waiting for the calendar Ring 1 assumed Claude would call the tool exactly once. Real tasks often need several calls: Claude might create an event, read the confirmation, then create another. The fix is a `while` loop that keeps running tools and feeding results back until `stop_reason` is no longer `"tool_use"`. -The other change is conversation history. Instead of rebuilding the `messages` array from scratch on each request, keep a running list and append to it. Every turn sees the complete prior context. +The other change is conversation history. Instead of rebuilding the `messages` array on each request, keep a running list and append to it. Each request then includes the complete prior context. @@ -1100,9 +1100,8 @@ The other change is conversation history. Instead of rebuilding the `messages` a // Keep the full conversation history in a list so each turn sees prior context. List messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Schedule a weekly team standup every Monday at 9am for the next 4 weeks, starting Monday, March 30, 2026. Invite the whole team: alice@example.com, bob@example.com, carol@example.com.", }, ]; @@ -1131,15 +1130,13 @@ The other change is conversation history. Instead of rebuilding the `messages` a } var result = RunTool(toolUse!); - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList(), }); - messages.Add(new() + messages.Add(new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent( + Content = new MessageContentParam( [ new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = toolUse!.ID, Content = result }), ]), @@ -1348,10 +1345,8 @@ The other change is conversation history. Instead of rebuilding the `messages` a // Keep the full conversation history in a list so each turn sees prior context. List messages = new ArrayList<>(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content("Schedule a weekly team standup every Monday at 9am for the next 4 weeks, starting Monday, March 30, 2026. Invite the whole team: alice@example.com, bob@example.com, carol@example.com.") - .build()); + messages.add(MessageParam.ofUser( + "Schedule a weekly team standup every Monday at 9am for the next 4 weeks, starting Monday, March 30, 2026. Invite the whole team: alice@example.com, bob@example.com, carol@example.com.")); Message response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -1372,14 +1367,11 @@ The other change is conversation history. Instead of rebuilding the `messages` a String result = runTool(toolUse); messages.add(response.toParam()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(List.of(ContentBlockParam.ofToolResult( - ToolResultBlockParam.builder() - .toolUseId(toolUse.id()) - .content(result) - .build()))) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(List.of(ContentBlockParam.ofToolResult( + ToolResultBlockParam.builder() + .toolUseId(toolUse.id()) + .content(result) + .build())))); response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -1559,7 +1551,7 @@ The other change is conversation history. Instead of rebuilding the `messages` a ] response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, tool_choice: tool_choice, @@ -1585,7 +1577,7 @@ The other change is conversation history. Instead of rebuilding the `messages` a } response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, tool_choice: tool_choice, @@ -1907,9 +1899,8 @@ When Claude has multiple independent tool calls to make, it might return several List messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Check what I have on Monday, March 30, 2026, then schedule a one-hour planning session that day that avoids any conflicts.", }, ]; @@ -1939,12 +1930,11 @@ When Claude has multiple independent tool calls to make, it might return several } } - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList(), }); - messages.Add(new() { Role = Role.User, Content = new MessageParamContent(toolResults) }); + messages.Add(new UserMessageParam { Content = toolResults }); response = await client.Messages.Create(new MessageCreateParams { @@ -2159,10 +2149,8 @@ When Claude has multiple independent tool calls to make, it might return several .build(); List messages = new ArrayList<>(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content("Check what I have on Monday, March 30, 2026, then schedule a one-hour planning session that day that avoids any conflicts.") - .build()); + messages.add(MessageParam.ofUser( + "Check what I have on Monday, March 30, 2026, then schedule a one-hour planning session that day that avoids any conflicts.")); Message response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -2189,10 +2177,7 @@ When Claude has multiple independent tool calls to make, it might return several } messages.add(response.toParam()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(toolResults)); response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -2384,7 +2369,7 @@ When Claude has multiple independent tool calls to make, it might return several ] response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, messages: messages @@ -2405,7 +2390,7 @@ When Claude has multiple independent tool calls to make, it might return several messages << {role: "user", content: tool_results} response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, messages: messages @@ -2755,7 +2740,7 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d List messages = [ - new() { Role = Role.User, Content = $"Schedule a one-hour all-hands on Monday, March 30, 2026 at 10am with everyone: {emails}" }, + new UserMessageParam { Content = $"Schedule a one-hour all-hands on Monday, March 30, 2026 at 10am with everyone: {emails}" }, ]; var response = await client.Messages.Create(new MessageCreateParams @@ -2792,12 +2777,11 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d } } - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList(), }); - messages.Add(new() { Role = Role.User, Content = new MessageParamContent(toolResults) }); + messages.Add(new UserMessageParam { Content = toolResults }); response = await client.Messages.Create(new MessageCreateParams { @@ -3037,10 +3021,8 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d .collect(Collectors.joining(", ")); List messages = new ArrayList<>(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content("Schedule a one-hour all-hands on Monday, March 30, 2026 at 10am with everyone: " + emails) - .build()); + messages.add(MessageParam.ofUser( + "Schedule a one-hour all-hands on Monday, March 30, 2026 at 10am with everyone: " + emails)); Message response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -3069,10 +3051,7 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d } messages.add(response.toParam()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(toolResults)); response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -3282,7 +3261,7 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d ] response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, messages: messages @@ -3311,7 +3290,7 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d messages << {role: "user", content: tool_results} response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: tools, messages: messages @@ -3330,13 +3309,13 @@ Tools fail. A calendar API might reject an event with too many attendees, or a d I tried to schedule the all-hands but the calendar only allows 10 attendees per event. I can split this into two sessions, or you can let me know which 10 people to prioritize. ``` -The `is_error` flag is the only difference from a successful result. Claude sees the flag and the error text, and responds accordingly. See [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) for the full error-handling reference. +The `is_error` flag is the only difference from a successful result. Claude receives the flag and the error text, and responds accordingly. See [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) for the full error-handling reference. ## Ring 5: The Tool Runner SDK abstraction Rings 2 through 4 wrote the same loop by hand: call the API, check `stop_reason`, run tools, append results, repeat. The Tool Runner does this for you. Define each tool as a function, pass the list to `client.beta.messages.tool_runner()` (typescript: `client.beta.messages.toolRunner()`; java: `client.beta().messages().toolRunner()`; php: `$client->beta->messages->toolRunner()`; csharp: `client.Beta.Messages.ToolRunner()`; go: `client.Beta.Messages.NewToolRunner()`), and retrieve the final message once the loop completes. Error wrapping, result formatting, and conversation management are handled internally. -Each SDK provides a helper that turns an ordinary function into a runnable tool and derives the input schema from its signature; the following tabs show the idiomatic form for each language. +The SDK provides a helper that turns an ordinary function into a runnable tool and derives the input schema from its signature; the following example shows the idiomatic form. @@ -3490,7 +3469,6 @@ Each SDK provides a helper that turns an ordinary function into a runnable tool using Anthropic.Models.Beta.Messages; using MessageCreateParams = Anthropic.Models.Beta.Messages.MessageCreateParams; using InputSchema = Anthropic.Models.Beta.Messages.InputSchema; - using Role = Anthropic.Models.Beta.Messages.Role; using Model = Anthropic.Models.Messages.Model; AnthropicClient client = new(); @@ -3574,9 +3552,8 @@ Each SDK provides a helper that turns an ordinary function into a runnable tool MaxTokens = 1024, Messages = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "Check what I have on Monday, March 30, 2026, then schedule a one-hour planning session that day that avoids any conflicts.", }, ], @@ -3928,7 +3905,7 @@ Each SDK provides a helper that turns an ordinary function into a runnable tool # The runner calls the API, runs requested tools, and feeds results back # until Claude produces a final answer. runner = client.beta.messages.tool_runner( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: [CreateCalendarEvent.new, ListCalendarEvents.new], messages: [ @@ -3954,7 +3931,7 @@ Each SDK provides a helper that turns an ordinary function into a runnable tool I checked your calendar for Monday, March 30 and found an existing meeting from 2pm to 3pm. I've scheduled the planning session for 10am to 11am to avoid the conflict. ``` -The output is identical to Ring 3. The difference is in the code: roughly half the lines, no manual loop, and the schema lives next to the implementation. +The output is identical to Ring 3. The difference is in the code: roughly half the lines, no manual loop, and a schema that lives next to the implementation. ## What you built diff --git a/content/en/agents-and-tools/tool-use/code-execution-tool.md b/content/en/agents-and-tools/tool-use/code-execution-tool.md index ff20c22658..72b6f2f553 100644 --- a/content/en/agents-and-tools/tool-use/code-execution-tool.md +++ b/content/en/agents-and-tools/tool-use/code-execution-tool.md @@ -1,7 +1,7 @@ --- title: Code execution tool url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool -description: Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. +description: Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. featureMetadata: status: ga zdr: not-eligible @@ -40,7 +40,7 @@ Claude can analyze data, create visualizations, perform complex calculations, ru Code execution also powers dynamic filtering in the [web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) and [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) tools: Claude filters results inside the code execution environment before they reach the context window. When dynamic filtering runs, the API provisions the code execution it needs for the request automatically, so you don't add the code execution tool to your request for it. - Reach out through the [feedback form](https://forms.gle/LTAU6Xn2puCJMi1n6) to share your feedback on this feature. + Use the [feedback form](https://forms.gle/LTAU6Xn2puCJMi1n6) to share your feedback on this feature. ## Tool versions @@ -49,7 +49,7 @@ The code execution tool has three current versions, and every [supported model]( * `code_execution_20250825` supports Bash commands and file operations. * `code_execution_20260120` adds REPL state persistence and [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) from within the sandbox. Claude Haiku 4.5 accepts the `code_execution_20260120` and `code_execution_20260521` tool types, but programmatic tool calling and the REPL state persistence that depends on it aren't available on it, so the newer versions behave like `code_execution_20250825` there. -* `code_execution_20260521` is the same runtime as `code_execution_20260120`. The difference is that the tool description tells Claude about the 90-second wall-clock limit on each Python cell in programmatic tool calling, so Claude can budget long-running cells. A cell that exceeds the limit returns a normal code execution result with a non-zero `return_code` and a `detection_timeout` status message in its output. This is separate from the `execution_time_exceeded` [error code](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors), which the API returns when a whole tool invocation exceeds the maximum execution time. +* `code_execution_20260521` is the same runtime as `code_execution_20260120`. The difference is that the tool description tells Claude about the 90-second wall-clock limit on each Python cell in programmatic tool calling, so Claude can budget long-running cells. A cell that exceeds the limit returns a normal code execution result with a non-zero `return_code` and a `detection_timeout` status message in its output. This is separate from the `execution_time_exceeded` [error code](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors), which the API returns when a whole tool call exceeds the maximum execution time. None of the three tool versions requires an `anthropic-beta` header. The legacy code execution beta headers remain valid opt-ins. @@ -147,7 +147,7 @@ Here's an example that asks Claude to perform a calculation: { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" }], + Messages = [new UserMessageParam { Content = "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" }], Tools = [new CodeExecutionTool20250825()] }); @@ -230,22 +230,22 @@ The response interleaves `server_tool_use` blocks (the commands Claude ran) with When you add the code execution tool to your API request: -1. Claude evaluates whether code execution would help answer your question +1. Claude evaluates whether code execution would help answer your question. 2. The tool automatically provides Claude with the following capabilities: * **Bash commands:** Run shell commands for system operations * **File operations:** Create, view, and edit files directly, including writing code -3. Claude can use any combination of these capabilities in a single request +3. Claude can use any combination of these capabilities in a single request. -4. All operations run in a secure, sandboxed container. The container has no internet access, so Claude can't download packages at runtime: only the [pre-installed libraries](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#pre-installed-libraries) are available +4. All operations run in a secure, sandboxed container. The container has no internet access, so Claude can't download packages at runtime: only the [pre-installed libraries](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#pre-installed-libraries) are available. -5. The API runs every command server-side and returns the results to Claude within the same request, so you never execute code or send back `tool_result` blocks yourself. One exception is when Claude calls one of your client tools alongside code execution: the API returns the code execution call without its result. The result arrives in a later response, after you send back the `tool_result` blocks for your client tools +5. The API runs every command server-side and returns the results to Claude within the same request, so you never run code or send back `tool_result` blocks yourself. One exception is when Claude calls one of your client tools alongside code execution: the API returns the code execution call without its result. The result arrives in a later response, after you send back the `tool_result` blocks for your client tools. -6. Each request runs in a new container unless you pass an earlier response's container ID back (see [Container reuse](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#container-reuse)) +6. Each request runs in a new container unless you pass an earlier response's container ID back (see [Container reuse](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#container-reuse)). -7. Claude provides results with any generated charts, calculations, or analysis +7. Claude provides results with any generated charts, calculations, or analysis. The container has Python pre-installed. Claude writes Python with the file operations sub-tool and runs it with a Bash command. With `code_execution_20260120` or later and [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), the Python interpreter state (such as variable bindings) also persists across requests that reuse the container. @@ -256,7 +256,7 @@ Claude runs code when the request benefits from computation or file handling: * Non-trivial math (large numbers, many steps, precision-sensitive results) * Data analysis, file parsing, or visualization * Algorithm execution or simulation -* Explicit requests to "run", "compute", or "execute" +* Explicit requests to "run," "compute," or "execute" Claude answers directly without running code for: @@ -283,9 +283,9 @@ The Python environment can process various file types uploaded through the Files #### Upload and analyze files -1. **Upload your file** using the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) -2. **Reference the file** in your message using a `container_upload` content block -3. **Include the code execution tool** in your API request +1. **Upload your file** using the [Files API](https://platform.claude.com/docs/en/build-with-claude/files). +2. **Reference the file** in your message using a `container_upload` content block. +3. **Include the code execution tool** in your API request. ```bash cURL @@ -412,9 +412,8 @@ The Python environment can process various file types uploaded through the Files Model = Model.ClaudeOpus5_5, MaxTokens = 4096, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new([ new TextBlockParam { Text = "Analyze this CSV data" }, new ContainerUploadBlockParam { FileID = fileObject.ID } @@ -482,7 +481,7 @@ The Python environment can process various file types uploaded through the Files MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(4096L) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text("Analyze this CSV data") .build()), @@ -652,7 +651,7 @@ When Claude saves files to its output directory during code execution (see [How { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Create a matplotlib visualization and save it as output.png" }], + Messages = [new UserMessageParam { Content = "Create a matplotlib visualization and save it as output.png" }], Tools = [new CodeExecutionTool20250825()] }; @@ -895,9 +894,9 @@ When Claude saves files to its output directory during code execution (see [How #### How generated files are captured -Each `bash_code_execution` call gets a new, empty directory, available to the command as `$OUTPUT_DIR`. When the command finishes, the files at the top level of that directory are captured and returned as the `file_id` entries in the result's `content` list. Files written anywhere else stay in the container and aren't returned. +Each `bash_code_execution` call gets a new, empty directory, available to the command as `$OUTPUT_DIR`. When the command completes, the files at the top level of that directory are captured and returned as the `file_id` entries in the result's `content` list. Files written anywhere else stay in the container and aren't returned. -The tool description tells Claude to share files by copying them into `$OUTPUT_DIR`. If your application depends on receiving a file, prompt Claude to copy it into `$OUTPUT_DIR` and list the directory in the same command, so the `ls` output confirms the capture (Claude doesn't see the `content` list): +The tool description tells Claude to share files by copying them into `$OUTPUT_DIR`. If your application depends on receiving a file, prompt Claude to copy it into `$OUTPUT_DIR` and list the directory in the same command, so the `ls` output confirms the capture (Claude doesn't receive the `content` list): ```bash python /tmp/make_report.py && cp /tmp/report.pdf "$OUTPUT_DIR/" && ls "$OUTPUT_DIR" @@ -1074,14 +1073,14 @@ Each tool type can return specific errors: **Error codes by tool type:** -| Tool | Error code | Description | -| ------------ | ------------------------- | ------------------------------------------------------- | -| All tools | `unavailable` | The tool is temporarily unavailable | -| All tools | `execution_time_exceeded` | The tool invocation exceeded the maximum execution time | -| All tools | `invalid_tool_input` | Invalid parameters provided to the tool | -| All tools | `too_many_requests` | Rate limit exceeded for tool usage | -| bash | `output_file_too_large` | Command output exceeded the maximum size | -| text\_editor | `file_not_found` | File doesn't exist (for view/edit operations) | +| Tool | Error code | Description | +| ------------ | ------------------------- | ------------------------------------------------- | +| All tools | `unavailable` | The tool is temporarily unavailable | +| All tools | `execution_time_exceeded` | The tool call exceeded the maximum execution time | +| All tools | `invalid_tool_input` | Invalid parameters provided to the tool | +| All tools | `too_many_requests` | Rate limit exceeded for tool usage | +| bash | `output_file_too_large` | Command output exceeded the maximum size | +| text\_editor | `file_not_found` | File doesn't exist (for view/edit operations) | An expired container can't be reused: requests that reference it return an error instead of restoring it. Send the request again without the `container` parameter to get a new container. @@ -1104,12 +1103,12 @@ The code execution tool runs in a secure, containerized environment designed spe * **Memory:** 5 GiB RAM * **Disk space:** 5 GiB workspace storage * **CPU:** 1 CPU -* **Execution time:** A tool invocation that runs past the maximum execution time returns an `execution_time_exceeded` [error](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors). With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), each REPL cell also has a 90-second wall-clock limit +* **Execution time:** A tool call that runs past the maximum execution time returns an `execution_time_exceeded` [error](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors). With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), each REPL cell also has a 90-second wall-clock limit ### Networking and security * **Internet access:** Completely disabled for security -* **External connections:** No outbound network requests permitted +* **External connections:** No outbound network requests allowed * **Sandbox isolation:** Full isolation from host system and other containers * **File access:** Limited to workspace directory only * **Workspace scoping:** Like the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), containers are scoped to the request's workspace @@ -1272,7 +1271,7 @@ Containers expire 30 days after creation. After about 5 minutes of inactivity a { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Write a file with a random number and save it to '/tmp/number.txt'" }], + Messages = [new UserMessageParam { Content = "Write a file with a random number and save it to '/tmp/number.txt'" }], Tools = [new CodeExecutionTool20250825()] }); @@ -1282,7 +1281,7 @@ Containers expire 30 days after creation. After about 5 minutes of inactivity a Container = response1.Container!.ID, Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Read the number from '/tmp/number.txt' and calculate its square" }], + Messages = [new UserMessageParam { Content = "Read the number from '/tmp/number.txt' and calculate its square" }], Tools = [new CodeExecutionTool20250825()] }); @@ -1424,7 +1423,7 @@ Containers expire 30 days after creation. After about 5 minutes of inactivity a ## Using code execution with other execution tools -When you provide code execution alongside client-provided tools that also run code (such as a [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) or custom REPL), Claude is operating in a multicomputer environment. The code execution tool runs in Anthropic's sandboxed container, while your client-provided tools run in a separate environment that you control. Claude can sometimes confuse these environments, attempting to use the wrong tool or assuming state is shared between them. +When you provide code execution alongside client-provided tools that also run code (such as a [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) or custom REPL), Claude is operating in a multicomputer environment. The code execution tool runs in Anthropic's sandboxed container, whereas your client-provided tools run in a separate environment that you control. Claude can sometimes use the wrong tool or act as if state is shared between these environments. To avoid this, add instructions to your system prompt that clarify the distinction: @@ -1436,7 +1435,7 @@ When multiple code execution environments are available, be aware that: - If you need to pass results between environments, explicitly include outputs in subsequent tool calls rather than assuming shared state ``` -This is especially important when combining code execution with [web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) or [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool), which enable code execution automatically. If your application already provides a client-side shell tool, the automatic code execution creates a second execution environment that Claude needs to distinguish between. +This is especially important when combining code execution with [web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) or [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool), which enable code execution automatically. If your application already provides a client-side shell tool, the automatic code execution creates a second execution environment that Claude needs to distinguish from the first. When Claude calls one of your client tools alongside code execution, the API returns the code execution call without its result. The result arrives in a later response, after you send back the `tool_result` blocks for your client tools. @@ -1469,10 +1468,10 @@ You can include the code execution tool in the [Messages Batches API](https://pl When used without these tools, code execution is billed by execution time, tracked separately from token usage: -* Execution time has a minimum of 5 minutes -* Each organization receives **1,550 free hours** of usage per month -* Additional usage beyond 1,550 hours is billed at **$0.05 USD per hour, per container** -* If files are included in the request, execution time is billed even if the tool is not called, because files are preloaded onto the container +* Execution time has a minimum of 5 minutes. +* Each organization receives **1,550 free hours** of usage per month. +* Additional usage beyond 1,550 hours is billed at **$0.05 USD per hour, per container**. +* If files are included in the request, execution time is billed even if the tool is not called, because files are preloaded onto the container. Code execution usage is tracked in the response: @@ -1519,8 +1518,8 @@ To upgrade, update the tool type in your API requests: **Review response handling** (if parsing responses programmatically): -* The API no longer sends the previous blocks for Python execution responses -* Instead, the API sends new response types for Bash and file operations (see [Response format](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#response-format)) +* The API no longer sends the previous blocks for Python execution responses. +* Instead, the API sends new response types for Bash and file operations (see [Response format](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#response-format)). ## Data retention diff --git a/content/en/agents-and-tools/tool-use/computer-use-tool.md b/content/en/agents-and-tools/tool-use/computer-use-tool.md index dbb4139f59..f21ca22ca2 100644 --- a/content/en/agents-and-tools/tool-use/computer-use-tool.md +++ b/content/en/agents-and-tools/tool-use/computer-use-tool.md @@ -37,7 +37,7 @@ featureMetadata: Claude can interact with computer environments through the computer use tool, which provides screenshot capabilities and mouse/keyboard control for autonomous desktop interaction. -The computer use tool is an Anthropic-defined [client toolset](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets): one `{"type": "computer_toolset_20260801"}` entry in `tools` gives Claude 17 member tools such as `screenshot`, `left_click`, `type`, and `zoom`, and your application runs every call in an environment you control. It isn't currently available in [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/tools). Claude's calls are `tool_use` blocks whose `name` is the member and which carry `"toolset_name": "computer"`, often several per turn (a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions)). +The computer use tool is an Anthropic-defined [client toolset](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets): one `{"type": "computer_toolset_20260801"}` entry in `tools` gives Claude 17 member tools such as `screenshot`, `left_click`, `type`, and `zoom`, and your application runs every call in an environment you control. It isn't currently available in [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/tools). Claude's calls are `tool_use` blocks whose `name` is the member and which carry `"toolset_name": "computer"`, often several in one turn (a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions)). For tasks that stay inside webpages, the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) is the closer fit: its member tools read and act on the page itself, and it doesn't need a full desktop environment. @@ -60,11 +60,11 @@ Computer use has unique risks distinct from standard API features. These risks a 4. Asking a human to confirm decisions that might result in meaningful real-world consequences and any tasks requiring affirmative consent, such as accepting cookies, completing financial transactions, or agreeing to terms of service. -In some circumstances, Claude will follow commands found in content even when they conflict with your instructions. For example, instructions on webpages or contained in images might override your instructions or cause Claude to make mistakes. Take precautions to isolate Claude from sensitive data and actions to avoid risks related to prompt injection. +In some circumstances, Claude follows commands found in content even when they conflict with your instructions. For example, instructions on webpages or contained in images might override your instructions or cause Claude to make mistakes. Take precautions to isolate Claude from sensitive data and actions to avoid risks related to prompt injection. Anthropic has trained the model to resist these prompt injections and has added an extra layer of defense. If you use the computer use tools, classifiers will automatically scan what the tools return, such as screenshots, to flag potential prompt injections. When these classifiers identify a potential prompt injection, they will automatically steer the model to check whether the instruction really came from you before acting on it. -This extra protection won't be ideal for every use case (for example, use cases without a human in the loop), so if you'd like to opt out and turn it off, [contact support](https://support.claude.com/en/). The precautions above remain important even with these classifiers in place. +This extra protection isn't ideal for every use case (for example, use cases without a human in the loop), so if you'd like to opt out and turn it off, [contact support](https://support.claude.com/en/). The precautions listed earlier remain important even with these classifiers in place. Inform end users of relevant risks and obtain their consent prior to enabling computer use in your own products. @@ -173,14 +173,7 @@ Add the computer use toolset to the `tools` array of a [Messages API](https://pl new ToolTextEditor20250728(), new ToolBash20250124(), ], - Messages = - [ - new MessageParam - { - Role = Role.User, - Content = "Save a picture of a cat to my desktop.", - }, - ], + Messages = [new UserMessageParam { Content = "Save a picture of a cat to my desktop." }], }; var response = await client.Messages.Create(parameters); @@ -282,7 +275,7 @@ Add the computer use toolset to the `tools` array of a [Messages API](https://pl ``` -When Claude acts on the desktop, the response has a `stop_reason` of `tool_use` and contains one or more member `tool_use` blocks, each naming a member tool and carrying `"toolset_name": "computer"`. Partway through this task, after Claude has seen a screenshot of the desktop, a response might look like this: +When Claude acts on the desktop, the response has a `stop_reason` of `tool_use` and contains one or more member `tool_use` blocks, each naming a member tool and carrying `"toolset_name": "computer"`. Partway through this task, after Claude has received a screenshot of the desktop, a response might look like this: ```json Output { @@ -315,7 +308,7 @@ When Claude acts on the desktop, the response has a `stop_reason` of `tool_use` } ``` -Your application runs each call in order in your own environment, returns one `tool_result` block per `tool_use` block, and calls the API again; [How computer use works](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#how-computer-use-works) describes that loop, and the rest of this page shows how to implement it. +Your application runs each call in order in your own environment, returns one `tool_result` block for each `tool_use` block, and calls the API again; [How computer use works](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#how-computer-use-works) describes that loop, and the rest of this page shows how to implement it. *** @@ -335,13 +328,13 @@ Your application runs each call in order in your own environment, returns one `t * Iterate over every `tool_use` block in the response, in order. For each one, dispatch on the member `name` together with `toolset_name`, and perform that action with the block's `input` on your container or virtual machine. - * Continue the conversation with a new `user` message that contains one `tool_result` block per `tool_use` block, matched by `tool_use_id` and each echoing `"toolset_name": "computer"`. Return an image for `screenshot` and `zoom`; a short text such as `OK` is enough for the other actions. + * Continue the conversation with a new `user` message that contains one `tool_result` block for each `tool_use` block, matched by `tool_use_id` and each echoing `"toolset_name": "computer"`. Return an image for `screenshot` and `zoom`; a short text such as `OK` is enough for the other actions. * If an action fails, return `is_error: true` for that block and answer the rest of the batch as described in [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions). * Claude analyzes the tool results to determine if more actions are needed or the task has been completed. - * If Claude determines more actions are needed, it responds with another `tool_use` `stop_reason` and you should return to step 3. + * If Claude determines more actions are needed, it responds with another `tool_use` `stop_reason`; return to step 3. * Otherwise, it returns a text response to the user. @@ -383,7 +376,7 @@ A response with a three-action batch looks like this: } ``` -Return one `tool_result` block for each `tool_use` block, matched by `tool_use_id`, all in the next `user` message. Every result for a member tool must carry `"toolset_name": "computer"`; a result that omits it, or that names a different toolset than its `tool_use` block, is rejected. Only `screenshot` and `zoom` results need an image; for the other members, a short text acknowledgment such as `OK` is enough (`cursor_position` returns the coordinates as text): +Return one `tool_result` block for each `tool_use` block, matched by `tool_use_id`, all in the next `user` message. Every result for a member tool must carry `"toolset_name": "computer"`; a result that omits it, or that names a different toolset from its `tool_use` block, is rejected. Only `screenshot` and `zoom` results need an image; for the other members, a short text acknowledgment such as `OK` is enough (`cursor_position` returns the coordinates as text): ```json { @@ -436,15 +429,15 @@ Return one `tool_result` block for each `tool_use` block, matched by `tool_use_i } ``` -Claude then sees which actions succeeded, which one failed, and which were skipped, and replans on its next turn. A request that leaves any `tool_use` block in the batch unanswered is rejected with an `invalid_request_error`, so an agent loop that reads only the first block fails on its next call. If your application asks a human to confirm consequential actions, make that check before each block runs, because a batch can complete a multistep action within one turn. +Claude then reads which actions succeeded, which one failed, and which were skipped, and replans on its next turn. A request that leaves any `tool_use` block in the batch unanswered is rejected with an `invalid_request_error`, so an agent loop that reads only the first block fails on its next call. If your application asks a human to confirm consequential actions, make that check before each block runs, because a batch can complete a multistep action within one turn. -Claude typically finishes a batch with `screenshot` so it can observe the outcome before determining what to do next. When a batch doesn't end with one, your application can attach a screenshot as an extra `image` block on the last result in the batch so that Claude always sees the current state of the screen, which saves a round trip compared with waiting for Claude to ask. You can also prompt Claude to end every batch with a screenshot (see [Optimize model performance with prompting](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#optimize-model-performance-with-prompting)). +Claude typically finishes a batch with `screenshot` so it can observe the outcome before determining what to do next. When a batch doesn't end with one, your application can attach a screenshot as an extra `image` block on the last result in the batch so that Claude always receives the current state of the screen, which saves a round trip compared with waiting for Claude to ask. You can also prompt Claude to end every batch with a screenshot (see [Optimize model performance with prompting](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#optimize-model-performance-with-prompting)). ### The computing environment Computer use requires a sandboxed computing environment where Claude can safely interact with applications and the web. This environment includes: -1. **Virtual display:** A virtual X11 display server (using Xvfb) that renders the desktop interface Claude will see through screenshots and control with mouse/keyboard actions. +1. **Virtual display:** A virtual X11 display server (using Xvfb) that renders the desktop interface Claude sees through screenshots and controls with mouse/keyboard actions. 2. **Desktop environment:** A lightweight UI with window manager (Mutter) and panel (Tint2) running on Linux, which provides a consistent graphical interface for Claude to interact with. @@ -475,7 +468,7 @@ Upgrading an existing `computer_20251124` integration? Start with [Migrate from ### Understand the agent loop -The core of computer use is the "agent loop": a cycle where Claude requests tool actions, your application runs them, and returns results to Claude. The loop uses the client you created in the [Quick start](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#quick-start), a `tools` array that declares only the computer use toolset, and the tool-call processing helper under [Implement the computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#implement-the-computer-use-tool). If you also declare other tools, such as the Quick start's bash and text editor tools, dispatch their `tool_use` blocks in the same pass; the helper answers only computer use member calls, and the loop treats a turn with no answered calls as finished. Here's a simplified example: +The core of computer use is the "agent loop": a cycle where Claude requests tool actions, and your application runs them and returns results to Claude. The loop uses the client you created in the [Quick start](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#quick-start), a `tools` array that declares only the computer use toolset, and the tool-call processing helper under [Implement the computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#implement-the-computer-use-tool). If you also declare other tools, such as the Quick start's bash and text editor tools, dispatch their `tool_use` blocks in the same pass; the helper answers only computer use member calls, and the loop treats a turn with no answered calls as complete. Here's a simplified example: ```python Python @@ -562,9 +555,8 @@ The core of computer use is the "agent loop": a cycle where Claude requests tool // Add Claude's response to the conversation history messages.Add( - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = response .Content.Select(block => new ContentBlockParam(block.Json)) .ToList(), @@ -579,7 +571,7 @@ The core of computer use is the "agent loop": a cycle where Claude requests tool } // Send tool results back to Claude for the next iteration - messages.Add(new() { Role = Role.User, Content = toolResults }); + messages.Add(new UserMessageParam { Content = toolResults }); } return messages; @@ -632,10 +624,7 @@ The core of computer use is the "agent loop": a cycle where Claude requests tool .build()); // Add Claude's response to the conversation history - messages.add(MessageParam.builder() - .role(MessageParam.Role.ASSISTANT) - .contentOfBlockParams(response.content().stream().map(ContentBlock::toParam).toList()) - .build()); + messages.add(response.toParam()); // Run any tools Claude requested and collect results List toolResults = processToolCalls(response); @@ -644,10 +633,7 @@ The core of computer use is the "agent loop": a cycle where Claude requests tool } // Send tool results back to Claude for the next iteration - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(toolResults)); } return messages; } @@ -876,7 +862,7 @@ For example, this entry withholds `zoom` for an environment that doesn't impleme } ``` -If your agent loop can run only one action per round trip, set `disable_parallel_tool_use` to `true` in `tool_choice`; Claude then returns at most one member `tool_use` block per turn (see [Disable parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use#disable-parallel-tool-use)). +If your agent loop can run only one action for each round trip, set `disable_parallel_tool_use` to `true` in `tool_choice`; Claude then returns at most one member `tool_use` block for each turn (see [Disable parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use#disable-parallel-tool-use)). The entry rejects these parameters from earlier tool versions, and a request that includes any of them returns an `invalid_request_error`: @@ -1579,7 +1565,7 @@ The computer use tool is implemented as a schema-less tool. When using this tool - Wrap the two previous steps in a loop that sends the results back and repeats until Claude returns no member tool calls; [Understand the agent loop](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#understanding-the-agentic-loop) shows this loop in each language. + Wrap the two previous steps in a loop that sends the results back and repeats until Claude returns no member tool calls; [Understand the agent loop](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#understanding-the-agentic-loop) shows this loop. @@ -1608,10 +1594,10 @@ Use the same shape for coordinates outside the display bounds and for actions th ### Size screenshots to fit image limits -Screenshots and zoom images that you return to the computer use toolset must already fit within your model's [image size limits](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size): the toolset takes no display dimensions and the API doesn't downscale for you, so an oversized `tool_result` image is rejected with a validation error. Because Claude returns coordinates in the pixel space of the image it sees, keep the scale factor you used so you can map those coordinates back to your screen. +Screenshots and zoom images that you return to the computer use toolset must already fit within your model's [image size limits](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size): the toolset takes no display dimensions and the API doesn't downscale for you, so an oversized `tool_result` image is rejected with a validation error. Because Claude returns coordinates in the pixel space of the image it receives, keep the scale factor you used so you can map those coordinates back to your screen. - Limits vary by model. Claude Opus 4.7 and later models, including every model that supports `computer_toolset_20260801`, accept up to 2576 pixels on the long edge and 4784 visual tokens total (`⌈width / 28⌉ × ⌈height / 28⌉`, approximately 3.75 megapixels); earlier models accept up to 1568 pixels on the long edge and approximately 1.15 megapixels total (see [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size) for each model's tier). The following example uses the earlier-model 1568 px / 1.15 MP limits. For a high-resolution-tier model, size to the visual-token limit rather than a pixel total, for example with the resize helper in [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading). + Limits vary by model. Claude Opus 4.7 and later models, including every model that supports `computer_toolset_20260801`, accept up to 2576 pixels on the long edge and 4,784 visual tokens total (`⌈width / 28⌉ × ⌈height / 28⌉`, approximately 3.75 megapixels); earlier models accept up to 1568 pixels on the long edge and approximately 1.15 megapixels total (see [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size) for each model's tier). The following example uses the earlier-model 1568 px / 1.15 MP limits. For a high-resolution-tier model, size to the visual-token limit rather than a pixel total, for example with the resize helper in [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading). If your screen is larger than the limit, resize each screenshot before returning it and scale Claude's returned coordinates back to the original screen space. Because the toolset takes no display dimensions, the resize and the coordinate scaling in your application code are all you need: @@ -1830,7 +1816,7 @@ Long agent loops accumulate screenshots quickly (roughly 1,000–1,800 input tok To keep [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) effective while bounding context: -* Place one `cache_control` breakpoint after the system prompt and tool definitions, and up to three more on the last `tool_result` block of each of the most recent turns, advancing them each turn. Within a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), markers on several blocks act as a single breakpoint but each still counts toward the limit of four, so use one per turn. +* Place one `cache_control` breakpoint after the system prompt and tool definitions, and up to three more on the last `tool_result` block of each of the most recent turns, advancing them each turn. Within a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), markers on several blocks act as a single breakpoint but each still counts toward the limit of four, so use one for each turn. * Prune old screenshots in *batches*, not one each turn. Dropping a screenshot every turn changes the prefix every turn and invalidates the cache. A reasonable default is to keep the last three screenshots and prune every 25 turns, so the prefix stays byte-identical between prune events; if your screenshots exceed 2000 px on either side, choose an interval that keeps each request at 20 or fewer images. * On Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, avoid pruning on the client: removing an earlier screenshot [invalidates every later thinking block](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation) in every request that still carries those turns. Resize screenshots to 2000 px or less per side instead, and use server-side [tool result clearing](https://platform.claude.com/docs/en/build-with-claude/context-editing#tool-result-clearing) to drop old ones from the context. If you must prune, keep [`prefix_mismatch_behavior: "drop_block"`](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls) set from then on; after each prune, Claude continues without the thinking produced since the pruned screenshot, on that request and every later one. On Claude Sonnet 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`. With `between_tools`, keep the history append-only, or strip the thinking blocks from the edited turn on. On Claude Haiku 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`; with `thinking: {"type": "disabled"}`, keep the history append-only, or strip the thinking blocks from the edited turn on. @@ -2125,7 +2111,7 @@ Upgrading from `computer_20251124` to the toolset is optional: the models listed 2. **Change the `tools` entry.** Set `type` to `computer_toolset_20260801` and delete `name`, `display_width_px`, `display_height_px`, `display_number`, and `enable_zoom`. The toolset rejects each of these fields. 3. **Choose whether to keep zoom enabled.** Zoom is enabled by default on the toolset, whereas `enable_zoom` defaults to `false`. If your environment doesn't implement zoom, add `"configs": {"zoom": {"enabled": false}}` to keep the previous behavior; otherwise implement it (see [Available actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#available-actions)). 4. **Handle every block in a turn.** Update your agent loop to iterate over every `tool_use` block in a response rather than reading only the first, and to dispatch on the block's `name` together with `toolset_name` instead of on `input.action`. Member inputs no longer contain an `action` field; the remaining fields are unchanged. -5. **Run blocks in order and use the halt text.** Run the blocks sequentially, stop at the first failure, and answer the remaining blocks with `Not executed: an earlier computer action in this turn failed.` as described in [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions). If your loop can't run batches yet, [Tool parameters](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#tool-parameters) explains how to limit Claude to one action per turn. +5. **Run blocks in order and use the halt text.** Run the blocks sequentially, stop at the first failure, and answer the remaining blocks with `Not executed: an earlier computer action in this turn failed.` as described in [Batch actions](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions). If your loop can't run batches yet, [Tool parameters](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#tool-parameters) explains how to limit Claude to one action for each turn. 6. **Echo `toolset_name` on results.** Add `"toolset_name": "computer"` to every `tool_result` that answers a member call. Results may contain only `text` and `image` content. 7. **Support `repeat` on `key`.** The `key` member accepts an optional `repeat` count from 1 to 100. A handler that ignores unrecognized fields would press the key once, so make your `key` handler honor `repeat`. 8. **Resize screenshots yourself.** The toolset rejects a screenshot or zoom image that exceeds the model's image limits instead of downscaling it. Resize before returning the image and keep scaling coordinates as described in [Size screenshots to fit image limits](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#handle-coordinate-scaling-for-higher-resolutions). @@ -2241,7 +2227,7 @@ Computer use follows the standard [tool use pricing](https://platform.claude.com - Connect Claude to external tools and APIs. See where tools execute, when Claude calls them, and which tool fits your task. + Connect Claude to external tools and APIs. See where tools run, when Claude calls them, and which tool fits your task. diff --git a/content/en/agents-and-tools/tool-use/define-tools.md b/content/en/agents-and-tools/tool-use/define-tools.md index 43a0476328..7da413329c 100644 --- a/content/en/agents-and-tools/tool-use/define-tools.md +++ b/content/en/agents-and-tools/tool-use/define-tools.md @@ -17,14 +17,14 @@ description: Specify tool schemas, write effective descriptions, and control whe Client tools are specified in the `tools` top-level parameter of the API request. Anthropic-schema client tools, such as the bash and text editor tools, are declared by a date-versioned `type`; see each tool's page, linked from the [Tool reference](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference), for the fields it accepts. The computer use and browser use tools are [client toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets): a single entry with no `name` that declares a fixed set of member tools. A user-defined tool definition includes: -| Parameter | Description | -| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | The name of the tool. Must match the regex `^[a-zA-Z0-9_-]{1,128}$`. | -| `description` | A detailed plaintext description of what the tool does, when it should be used, and how it behaves. | -| `input_schema` | A [JSON Schema](https://json-schema.org/) object defining the expected parameters for the tool. | -| `input_examples` | (Optional) An array of example input objects to help Claude understand how to use the tool. See [Providing tool use examples](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools#providing-tool-use-examples). | +| Parameter | Description | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | The name of the tool. Must match the regex `^[a-zA-Z0-9_-]{1,128}$`. | +| `description` | A detailed plain text description of what the tool does, when it should be used, and how it behaves. | +| `input_schema` | A [JSON Schema](https://json-schema.org/) object defining the expected parameters for the tool. | +| `input_examples` | (Optional) An array of example input objects that show Claude how to use the tool. See [Providing tool use examples](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools#providing-tool-use-examples). | -For the full set of optional properties available on any single tool definition, including `cache_control`, `strict`, `defer_loading`, and `allowed_callers`, see the [Tool reference](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#tool-definition-properties). A client toolset entry accepts `cache_control` and `allowed_callers` on the entry and sets `defer_loading` per member; see [Client toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets). +For the full set of optional properties available on any single tool definition, including `cache_control`, `strict`, `defer_loading`, and `allowed_callers`, see [Tool definition properties](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#tool-definition-properties). A client toolset entry accepts `cache_control` and `allowed_callers` on the entry and sets `defer_loading` for each member; see [Client toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets). ```json JSON @@ -85,7 +85,7 @@ To get the best performance out of Claude when using tools, follow these guideli * **Design tool responses to return only high-signal information.** Return semantic, stable identifiers (for example, slugs or UUIDs) rather than opaque internal references, and include only the fields Claude needs to reason about its next step. Bloated responses waste context and make it harder for Claude to extract what matters. -* **Ask for an explanation, not reasoning.** If a parameter asks Claude why it is making the call, ask for a short explanation or the supporting evidence. A parameter that asks for the model's thinking or step-by-step reasoning may lead to a `reasoning_extraction` refusal. See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). +* **Ask for an explanation, not reasoning.** If a parameter asks Claude why it is making the call, ask for a short explanation or the supporting evidence. A parameter that asks for the model's thinking or step-by-step reasoning might lead to a `reasoning_extraction` refusal. See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). @@ -134,7 +134,7 @@ The good description clearly explains what the tool does, when to use it, what d ## Providing tool use examples -You can provide concrete examples of valid tool inputs to help Claude understand how to use your tools more effectively. This is particularly useful for complex tools with nested objects, optional parameters, or format-sensitive inputs. +You can provide concrete examples of valid tool inputs to show Claude how to use your tools more effectively. This is particularly useful for complex tools with nested objects, optional parameters, or format-sensitive inputs. ### Basic usage @@ -338,9 +338,7 @@ Add an optional `input_examples` field to your tool definition with an array of ], }), ], - Messages = [ - new() { Role = Role.User, Content = "What's the weather like in San Francisco?" } - ] + Messages = [new UserMessageParam { Content = "What's the weather like in San Francisco?" }] }; var message = await client.Messages.Create(parameters); @@ -540,21 +538,21 @@ Add an optional `input_examples` field to your tool definition with an array of ``` -Examples are included in the prompt alongside your tool schema, showing Claude concrete patterns for well-formed tool calls. This helps Claude understand when to include optional parameters, what formats to use, and how to structure complex inputs. +Examples are included in the prompt alongside your tool schema, showing Claude concrete patterns for well-formed tool calls. These patterns indicate when to include optional parameters, what formats to use, and how to structure complex inputs. ### Requirements and limitations -* **Schema validation** - Each example must be valid according to the tool's `input_schema`. Invalid examples return a 400 error -* **Not supported for server-side tools or client toolsets** - Input examples work on user-defined and Anthropic-schema client tools other than the [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) toolsets, but not on server tools such as web search or code execution -* **Token cost** - Examples add to prompt tokens: \~20–50 tokens for simple examples, \~100–200 tokens for complex nested objects +* **Schema validation** - Each example must be valid according to the tool's `input_schema`. Invalid examples return a 400 error. +* **Not supported for server-side tools or client toolsets** - Input examples work on user-defined and Anthropic-schema client tools other than the [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) toolsets, but not on server tools such as web search or code execution. +* **Token cost** - Examples add to prompt tokens: \~20–50 tokens for simple examples, \~100–200 tokens for complex nested objects. ## Controlling Claude's output ### Forcing tool use -In some cases, you may want Claude to use a specific tool to answer the user's question, even if Claude would otherwise answer directly without calling a tool. You can do this by specifying the tool in the `tool_choice` field of the request. +In some cases, you might want Claude to use a specific tool to answer the user's question, even if Claude would otherwise answer directly without calling a tool. You can do this by specifying the tool in the `tool_choice` field of the request. -Not every model and setting supports forced tool use. Where it isn't supported, `tool_choice: {"type": "any"}` and `tool_choice: {"type": "tool", "name": "..."}` fail, while `tool_choice: {"type": "auto"}` (the default) and `tool_choice: {"type": "none"}` still work: +Not every model and setting supports forced tool use. Where it isn't supported, `tool_choice: {"type": "any"}` and `tool_choice: {"type": "tool", "name": "..."}` fail, whereas `tool_choice: {"type": "auto"}` (the default) and `tool_choice: {"type": "none"}` still work: | Model or setting | Restriction | What to use instead | | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -701,9 +699,7 @@ On models that support it, the highlighted lines are the only difference from a }), ], ToolChoice = new ToolChoiceTool { Name = "get_weather" }, - Messages = [ - new() { Role = Role.User, Content = "What's the weather like in San Francisco?" } - ] + Messages = [new UserMessageParam { Content = "What's the weather like in San Francisco?" }] }; var message = await client.Messages.Create(parameters); @@ -840,7 +836,7 @@ On models that support it, the highlighted lines are the only difference from a When working with the `tool_choice` parameter, there are four possible options: -* `auto` allows Claude to determine whether to call any provided tools or not. This is the default value when `tools` are provided. +* `auto` allows Claude to determine whether to call any provided tools. This is the default value when `tools` are provided. * `any` tells Claude that it must use one of the provided tools, but doesn't force a particular tool. * `tool` forces Claude to always use a particular tool. * `none` prevents Claude from using any tools. This is the default value when no `tools` are provided. @@ -893,16 +889,16 @@ For example, given the prompt "What's the weather like in San Francisco right no This natural response style helps users understand what Claude is doing and creates a more conversational interaction. You can guide the style and content of these responses through your system prompts and by providing `` in your prompts. -It's important to note that Claude may use various phrasings and approaches when explaining its actions. Your code should treat these responses like any other assistant-generated text, and not rely on specific formatting conventions. +It's important to note that Claude might use various phrasings and approaches when explaining its actions. Your code should treat these responses like any other assistant-generated text, and not rely on specific formatting conventions. ## Next steps - Parse tool\_use blocks and format tool\_result responses. + Parse `tool_use` blocks and format `tool_result` responses. - + Let the SDK handle the agentic loop automatically. diff --git a/content/en/agents-and-tools/tool-use/fine-grained-tool-streaming.md b/content/en/agents-and-tools/tool-use/fine-grained-tool-streaming.md index 2bbd7d6bf2..8c1c309eeb 100644 --- a/content/en/agents-and-tools/tool-use/fine-grained-tool-streaming.md +++ b/content/en/agents-and-tools/tool-use/fine-grained-tool-streaming.md @@ -212,9 +212,8 @@ The following example turns on fine-grained streaming for a `make_file` tool and ], Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Can you write a long poem and make a file called poem.txt?", }, ], @@ -487,11 +486,11 @@ Where your SDK provides an accumulator helper (as the Python, TypeScript, Go, Ja The accumulation contract: -1. On `content_block_start` with `type: "tool_use"`, initialize an empty string: `input_json = ""` -2. For each `content_block_delta` with `type: "input_json_delta"`, append: `input_json += event.delta.partial_json` -3. On `content_block_stop`, parse the accumulated string +1. On `content_block_start` with `type: "tool_use"`, initialize an empty string: `input_json = ""`. +2. For each `content_block_delta` with `type: "input_json_delta"`, append: `input_json += event.delta.partial_json`. +3. On `content_block_stop`, parse the accumulated string. -Guard the parse, as the following SDK examples do. A response can also stop at `max_tokens` midway through a parameter. Check the [stop reason](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons) and decide whether to retry the request with a higher `max_tokens` or repair the partial input. +Guard the parse, as the following example does. A response can also stop at `max_tokens` midway through a parameter. Check the [stop reason](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons) and decide whether to retry the request with a higher `max_tokens` or repair the partial input. The type mismatch between the initial `input: {}` (object) and `partial_json` (string) is by design. The empty object marks the slot in the content array. The delta strings build the real value. @@ -622,7 +621,7 @@ The type mismatch between the initial `input: {}` (object) and `partial_json` (s }, }, ], - Messages = [new() { Role = Role.User, Content = "Weather in Paris?" }], + Messages = [new UserMessageParam { Content = "Weather in Paris?" }], }; // Block index -> accumulated JSON fragments @@ -932,7 +931,7 @@ Return the wrapper, serialized to a string, as the `content` of a [tool result]( - Parse tool\_use blocks, format tool\_result responses, and handle errors with is\_error. + Parse `tool_use` blocks, format `tool_result` responses, and handle errors with `is_error`. diff --git a/content/en/agents-and-tools/tool-use/handle-tool-calls.md b/content/en/agents-and-tools/tool-use/handle-tool-calls.md index a5453702f5..b6205619d7 100644 --- a/content/en/agents-and-tools/tool-use/handle-tool-calls.md +++ b/content/en/agents-and-tools/tool-use/handle-tool-calls.md @@ -14,9 +14,9 @@ Claude's response differs based on whether it uses a [client or server tool](htt ## Handling results from client tools -The response will have a `stop_reason` of `tool_use` and one or more `tool_use` content blocks that include: +The response has a `stop_reason` of `tool_use` and one or more `tool_use` content blocks that include: -* `id`: A unique identifier for this particular tool use block. This will be used to match up the tool results later. +* `id`: A unique identifier for this particular tool use block. This is used to match up the tool results later. * `name`: The name of the tool being used. * `input`: An object containing the input being passed to the tool, conforming to the tool's `input_schema`. @@ -49,7 +49,7 @@ When you receive a tool use response for a client tool, you should: 1. Extract the `name`, `id`, and `input` from the `tool_use` block. -2. Run the actual tool in your codebase corresponding to that tool name, passing in the tool `input`. +2. Run the actual tool in your code base corresponding to that tool name, passing in the tool `input`. 3. Continue the conversation by sending a new message with the `role` of `user`, and a `content` block containing the `tool_result` type and the following information: @@ -63,10 +63,10 @@ A `tool_result` that answers a computer use or browser use member block must als **Important formatting requirements:** * Tool result blocks must immediately follow their corresponding tool use blocks in the message history. You cannot include any messages between the assistant's tool use message and the user's tool result message. - * In the user message containing tool results, the tool\_result blocks must come FIRST in the content array. Any text must come AFTER all tool results. + * In the user message containing tool results, the `tool_result` blocks must come FIRST in the content array. Any text must come AFTER all tool results. * If the assistant turn also called a [server tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) that has no result block yet, the user message must contain only `tool_result` blocks. Text after the results ends the turn early; for a server tool Claude called directly, the request then fails with a 400 error that names the unresolved server tool. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use). - For example, this will cause a 400 error: + For example, this causes a 400 error: ```json { @@ -90,11 +90,11 @@ A `tool_result` that answers a computer use or browser use member block must als } ``` - If you receive an error like "tool\_use ids were found without tool\_result blocks immediately after", check that your tool results are formatted correctly. + If you receive an error such as "tool\_use ids were found without tool\_result blocks immediately after", check that your tool results are formatted correctly. - Tool results often carry content from sources outside your control: web pages, inbound email, user uploads, third-party APIs. Treat that content as untrusted: an attacker who can influence it may embed instructions that try to redirect Claude (indirect prompt injection). Keep untrusted content inside `tool_result` blocks rather than `system` prompts or plain user `text` blocks, and see [Mitigate jailbreaks and prompt injections](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks#indirect-prompt-injection) for further hardening. + Tool results often carry content from sources outside your control: webpages, inbound email, user uploads, third-party APIs. Treat that content as untrusted: an attacker who can influence it might embed instructions that try to redirect Claude (indirect prompt injection). Keep untrusted content inside `tool_result` blocks rather than `system` prompts or plain user `text` blocks, and see [Mitigate jailbreaks and prompt injections](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks#indirect-prompt-injection) for further hardening. @@ -182,10 +182,10 @@ After receiving the tool result, Claude will use that information to continue ge ## Handling results from server tools -Claude executes the tool internally and incorporates the results directly into its response without requiring additional user interaction. +Claude runs the tool internally and incorporates the results directly into its response without requiring additional user interaction. - A response can contain both a client `tool_use` block and a `server_tool_use` block that has no result block. That server tool call is not finished yet, and its result block arrives in a later response. Reply with a user message that contains only the `tool_result` blocks for the client tools and keep the same `tools` array; for a server tool Claude called directly, the API runs it on that request and the next response starts with its result block. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use). + A response can contain both a client `tool_use` block and a `server_tool_use` block that has no result block. That server tool call is not complete yet, and its result block arrives in a later response. Reply with a user message that contains only the `tool_result` blocks for the client tools and keep the same `tools` array; for a server tool Claude called directly, the API runs it on that request and the next response starts with its result block. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use). @@ -193,7 +193,7 @@ Claude executes the tool internally and incorporates the results directly into i Unlike APIs that separate tool use or use special roles like `tool` or `function`, the Claude API integrates tools directly into the `user` and `assistant` message structure. - Messages contain arrays of `text`, `image`, `tool_use`, and `tool_result` blocks. `user` messages include client content and `tool_result`, while `assistant` messages contain AI-generated content and `tool_use`. + Messages contain arrays of `text`, `image`, `tool_use`, and `tool_result` blocks. `user` messages include client content and `tool_result`, whereas `assistant` messages contain AI-generated content and `tool_use`. ## Handling errors with is\_error @@ -221,14 +221,14 @@ There are a few different types of errors that can occur when using tools with C Claude will then incorporate this error into its response to the user. For example: "I'm sorry, I was unable to retrieve the current weather because the weather service API is not available. Please try again later." - Write instructive error messages. Instead of generic errors like `"failed"`, include what went wrong and what Claude should try next (for example, `"Rate limit exceeded. Retry after 60 seconds."`). This gives Claude the context it needs to recover or adapt without guessing. + Write instructive error messages. Instead of generic errors such as `"failed"`, include what went wrong and what Claude should try next (for example, `"Rate limit exceeded. Retry after 60 seconds."`). This gives Claude the context it needs to recover or adapt without guessing. - If Claude's attempted use of a tool is invalid (for example, missing required parameters), it usually means that there wasn't enough information for Claude to use the tool correctly. Your best bet during development is to try the request again with more-detailed `description` values in your tool definitions. + If Claude's attempted use of a tool is invalid (for example, missing required parameters), it usually means that there wasn't enough information for Claude to use the tool correctly. The best approach during development is to try the request again with more-detailed `description` values in your tool definitions. - However, you can also continue the conversation forward with a `tool_result` that indicates the error, and Claude will try to use the tool again with the missing information filled in: + However, you can also continue the conversation forward with a `tool_result` that indicates the error, and Claude will attempt to use the tool again with the missing information filled in: ```json JSON { @@ -244,15 +244,15 @@ There are a few different types of errors that can occur when using tools with C } ``` - If a tool request is invalid or missing parameters, Claude will retry 2-3 times with corrections before apologizing to the user. + If a tool request is invalid or missing parameters, Claude will retry 2–3 times with corrections before apologizing to the user. - To eliminate invalid tool calls entirely, use [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use) with `strict: true` on your tool definitions. This guarantees that tool inputs will always match your schema exactly, preventing missing parameters and type mismatches. + To eliminate invalid tool calls entirely, use [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use) with `strict: true` on your tool definitions. This guarantees that tool inputs always match your schema exactly, preventing missing parameters and type mismatches. - When server tools encounter errors (for example, network issues with Web Search), Claude will transparently handle these errors and attempt to provide an alternative response or explanation to the user. Unlike client tools, you do not need to handle `is_error` results for server tools. + When server tools encounter errors (for example, network issues with web search), Claude will transparently handle these errors and attempt to provide an alternative response or explanation to the user. Unlike client tools, you do not need to handle `is_error` results for server tools. For web search specifically, possible error codes include: @@ -271,7 +271,7 @@ There are a few different types of errors that can occur when using tools with C Handle responses where Claude calls several tools in a single turn. - + Let the SDK manage the `tool_use` loop, result formatting, and retries for you. diff --git a/content/en/agents-and-tools/tool-use/how-tool-use-works.md b/content/en/agents-and-tools/tool-use/how-tool-use-works.md index 514c5792a0..2dce2331ac 100644 --- a/content/en/agents-and-tools/tool-use/how-tool-use-works.md +++ b/content/en/agents-and-tools/tool-use/how-tool-use-works.md @@ -1,26 +1,26 @@ --- title: How tool use works url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works -description: Understand the tool use loop, where tools execute, and when to use tools instead of prose. +description: Understand the tool use loop, where tools run, and when to use tools instead of prose. --- This page explains the concepts behind tool use: where tools run, how the agentic loop works, and when tool use is the right approach. For hands-on guidance, start with the [Build a tool-using agent](https://platform.claude.com/docs/en/agents-and-tools/tool-use/build-a-tool-using-agent) tutorial or the [Define tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) guide. ## The tool-use contract -Tool use is a contract between your application and the model. You specify what operations are available and what shape their inputs and outputs take; Claude determines when and how to call them. The model never executes anything on its own. It emits a structured request, your code (or Anthropic's servers) runs the operation, and the result flows back into the conversation. +Tool use is a contract between your application and the model. You specify what operations are available and what shape their inputs and outputs take; Claude determines when and how to call them. The model never runs anything on its own. It emits a structured request, your code (or Anthropic's servers) runs the operation, and the result flows back into the conversation. This contract makes the model behave less like a text generator and more like a function you call. Engineers with classical API experience can integrate tool use the same way they would any other typed interface: define the schema, handle the callback, return a result. The difference is that the caller on the other side is a language model choosing which function to call based on the conversation. ## Where tools run -The primary axis along which tools differ is where the code executes. Every tool falls into one of three buckets, and the bucket determines what your application is responsible for. +The primary axis along which tools differ is where the code runs. Every tool falls into one of three buckets, and the bucket determines what your application is responsible for. ### User-defined tools (client-executed) -You write the schema, you execute the code, you return the results. This is the most common case: the vast majority of tool-use traffic is [user-defined tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) calling into application-specific logic. +You write the schema, run the code, and return the results. This is the most common case: the vast majority of tool-use traffic is [user-defined tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) calling into application-specific logic. -When Claude calls one of your tools, the API response contains a `tool_use` block with the tool name and a JSON object of arguments. Your application extracts those arguments, runs the operation (a database query, an HTTP call, a file write, whatever the tool does), and sends the output back in a `tool_result` block on the next request. Claude never sees your implementation; it only sees the schema you provided and the result you returned. +When Claude calls one of your tools, the API response contains a `tool_use` block with the tool name and a JSON object of arguments. Your application extracts those arguments, runs the operation (a database query, an HTTP call, a file write, whatever the tool does), and sends the output back in a `tool_result` block on the next request. Claude never receives your implementation; it only receives the schema you provided and the result you returned. ### Anthropic-schema tools (client-executed) @@ -30,7 +30,7 @@ The execution model is identical to user-defined tools: the response contains a ### Server-executed tools -For [`web_search`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool), [`web_fetch`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool), [`code_execution`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool), and [`tool_search`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool), Anthropic runs the code. You enable the tool in your request and the server handles everything else. You never construct a `tool_result` block for these tools. When a turn calls only [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), the server-side loop executes the operation and feeds the output back to the model before the response reaches you, unless the loop stops before it finishes, most often because it pauses. +For [`web_search`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool), [`web_fetch`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool), [`code_execution`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool), and [`tool_search`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool), Anthropic runs the code. You enable the tool in your request and the server handles everything else. You never construct a `tool_result` block for these tools. When a turn calls only [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), the server-side loop runs the operation and feeds the output back to the model before the response reaches you, unless the loop stops before it completes, most often because it pauses. The response you receive contains `server_tool_use` blocks showing what ran and what came back. In the common case, execution is already complete by the time you see them, and your application's job is to enable the tool and read the final answer rather than to participate in the execution loop; the main exceptions are a paused loop ([`pause_turn`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works#the-server-side-loop)) and a turn that also calls a client tool. @@ -42,11 +42,11 @@ The canonical shape is a `while` loop keyed on `stop_reason`: 1. Send a request with your `tools` array and the user message. 2. Claude responds with `stop_reason: "tool_use"` and one or more `tool_use` blocks. -3. Execute each tool. Format the outputs as `tool_result` blocks. +3. Run each tool. Format the outputs as `tool_result` blocks. 4. Send a new request containing the original messages, the assistant's response, and a user message with the `tool_result` blocks. 5. Repeat from step 2 while `stop_reason` is `"tool_use"`. -In practice this reads as: while `stop_reason == "tool_use"`, execute the tools and continue the conversation. The loop exits on any other stop reason (`"end_turn"`, `"max_tokens"`, `"stop_sequence"`, or `"refusal"`), which means Claude has either produced a final answer or stopped for another reason that your application should handle. +In practice this reads as: while `stop_reason == "tool_use"`, run the tools and continue the conversation. The loop exits on any other stop reason (`"end_turn"`, `"max_tokens"`, `"stop_sequence"`, or `"refusal"`), which means Claude has either produced a final answer or stopped for another reason that your application should handle. For the mechanics of building requests, handling parallel tool calls, and formatting results, see [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). @@ -54,7 +54,7 @@ For the mechanics of building requests, handling parallel tool calls, and format Server-executed tools run their own loop inside Anthropic's infrastructure. A single request from your application might trigger several web searches or code executions before a response comes back. The model searches, reads results, determines whether to search again, and iterates until it has what it needs, all without your application participating. -This internal loop has an iteration limit. If the model is still iterating when it hits the cap, the response comes back with `stop_reason: "pause_turn"` instead of `"end_turn"`. A paused turn means the work isn't finished; re-send the conversation (including the paused response) to let the model continue where it left off. See [Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) for the continuation pattern. +This internal loop has an iteration limit. If the model is still iterating when it hits the cap, the response comes back with `stop_reason: "pause_turn"` instead of `"end_turn"`. A paused turn means the work isn't complete; re-send the conversation (including the paused response) to let the model continue where it left off. See [Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) for the continuation pattern. The loop also hands control back to you before a server tool runs if Claude calls that server tool and a client tool in the same group of parallel tool calls. The response then comes back with `stop_reason: "tool_use"` and a `server_tool_use` block that has no result block yet; the API runs it after you return the client tool results. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use) for the exact contract. @@ -72,7 +72,7 @@ A clear sign that you should be using tools: if you're writing a regex to extrac Tool use doesn't fit when: * The model can answer from training alone. Summarization, translation, and general-knowledge questions don't need a tool round trip. -* The interaction is one-shot Q\&A with no side effects. If there's nothing to execute, there's nothing for a tool to do. +* The interaction is one-shot Q\&A with no side effects. If there's nothing to run, there's nothing for a tool to do. * Tool-calling latency would dominate a trivial response. Every tool call is at least one extra round trip; for lightweight tasks the overhead can exceed the work. ## Choosing between approaches diff --git a/content/en/agents-and-tools/tool-use/manage-tool-context.md b/content/en/agents-and-tools/tool-use/manage-tool-context.md index 65f2bd635f..9875f42176 100644 --- a/content/en/agents-and-tools/tool-use/manage-tool-context.md +++ b/content/en/agents-and-tools/tool-use/manage-tool-context.md @@ -1,10 +1,10 @@ --- title: Manage tool context url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/manage-tool-context -description: Choose between tool search, programmatic tool calling, prompt caching, and context editing to manage context bloat. +description: Choose among tool search, programmatic tool calling, prompt caching, and context editing to manage context bloat. --- -Tool definitions and accumulated `tool_result` blocks consume your context window. Long-running agents with many tools or many turns can exhaust available context before the task is finished. Four approaches address this at different points in the pipeline. +Tool definitions and accumulated `tool_result` blocks consume your context window. Long-running agents with many tools or many turns can exhaust available context before the task is complete. Four approaches address this at different points in the pipeline. ## The four approaches @@ -13,7 +13,7 @@ Each approach targets a different source of context pressure. Pick the one that | Approach | What it reduces | When it fits | Learn more | | ------------------------- | --------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | Tool search | Tool definitions loaded upfront | Large toolsets (20+ tools) where most tools aren't needed every turn | [Tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) | -| Programmatic tool calling | `tool_result` roundtrips | Chains of tool calls that can execute as a single script | [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) | +| Programmatic tool calling | `tool_result` roundtrips | Chains of tool calls that can run as a single script | [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) | | Prompt caching | Token cost of repeated tool definitions | Stable toolsets across many requests | [Tool use with prompt caching](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-use-with-prompt-caching) | | Context editing | Old `tool_result` blocks in history | Long conversations where early results are no longer relevant | [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) | @@ -31,7 +31,7 @@ Prompt caching doesn't reduce the number of tokens in context, but it reduces wh ### Context editing -Context editing removes old `tool_result` blocks from the conversation history once they've served their purpose. A long agent loop might produce hundreds of intermediate results that were useful at the time but are now dead weight. Context editing lets you trim them without restarting the conversation. +Context editing removes old `tool_result` blocks from the conversation history once they've served their purpose. A long agent loop might produce hundreds of intermediate results that were useful at the time but are no longer needed. Context editing lets you trim them without restarting the conversation. ## Combining approaches @@ -39,7 +39,7 @@ These approaches compose. A long-running agent might use tool search to keep the A reasonable starting point for a high-volume agent: -1. Enable prompt caching on your tool definitions from day one. Cache writes carry a 25% markup over base input pricing, which pays back on the second request that hits the cache. +1. Enable prompt caching on your tool definitions from the start. Cache writes carry a 25 percent markup over base input pricing, which pays back on the second request that hits the cache. 2. Add tool search once your toolset grows past roughly 20 tools or your baseline context usage becomes noticeable. 3. Add context editing once individual conversations start running long enough that early results become irrelevant. 4. Consider programmatic tool calling if you notice repetitive chains of small tool calls that could run as a single batch. diff --git a/content/en/agents-and-tools/tool-use/memory-tool.md b/content/en/agents-and-tools/tool-use/memory-tool.md index d734a9955e..14a4325985 100644 --- a/content/en/agents-and-tools/tool-use/memory-tool.md +++ b/content/en/agents-and-tools/tool-use/memory-tool.md @@ -8,10 +8,10 @@ The memory tool lets Claude store and retrieve information across conversations Memory supports just-in-time context retrieval. Rather than loading all relevant information up front, an agent records what it learns in memory files and reads them back on demand. This keeps the active context focused on the current task, which matters for long-running sessions that would otherwise overwhelm the context window. See [Effective context engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) for the broader pattern. -The memory tool operates client-side: Claude requests file operations, and your application executes them. You control where and how the data is stored through your own infrastructure. +The memory tool operates client-side: Claude requests file operations, and your application runs them. You control where and how the data is stored through your own infrastructure. - Reach out through the [feedback form](https://forms.gle/YXC2EKGMhjN1c4L88) to share your feedback on this feature. + Use the [feedback form](https://forms.gle/YXC2EKGMhjN1c4L88) to share your feedback on this feature. @@ -28,7 +28,7 @@ The memory tool operates client-side: Claude requests file operations, and your When the memory tool is enabled, Claude automatically checks its memory directory before starting a task. As it works, Claude stores what it learns in files under `/memories` and reads them back in later conversations to continue earlier work. -Because the memory tool is client-side, Claude only requests memory operations. Your application executes each request against storage you control and returns the result in a `tool_result` block (see [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls)). The `/memories` path is a prefix that your handler maps onto real storage, such as a per-user directory or keys in a database. Memory lives entirely in your application. A later conversation continues from the same memory when it sends the same `tools` entry and your handler serves the same store. For security, restrict all memory operations to the `/memories` directory (see [Path traversal protection](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool#path-traversal-protection)). +Because the memory tool is client-side, Claude only requests memory operations. Your application runs each request against storage you control and returns the result in a `tool_result` block (see [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls)). The `/memories` path is a prefix that your handler maps onto real storage, such as a per-user directory or keys in a database. Memory lives entirely in your application. A later conversation continues from the same memory when it sends the same `tools` entry and your handler serves the same store. For security, restrict all memory operations to the `/memories` directory (see [Path traversal protection](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool#path-traversal-protection)). ### Example: How memory tool calls work @@ -192,11 +192,7 @@ Using the memory tool takes two steps: MaxTokens = 2048, Messages = [ - new() - { - Role = Role.User, - Content = "Help me respond to this customer service ticket.", - }, + new UserMessageParam { Content = "Help me respond to this customer service ticket." }, ], Tools = [new MemoryTool20250818()], } @@ -283,7 +279,7 @@ Using the memory tool takes two steps: ## Implement the memory handler -Claude's reply to a request like the previous one ends with a `tool_use` block that requests a memory operation, such as `view /memories`. Your application executes the operation and returns the result in a `tool_result` block, then sends the conversation back so Claude can continue: the standard [tool-use loop](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). +Claude's reply to a request like the previous one ends with a `tool_use` block that requests a memory operation, such as `view /memories`. Your application runs the operation and returns the result in a `tool_result` block, then sends the conversation back so Claude can continue: the standard [tool-use loop](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). Four SDKs provide memory tool helpers that handle the tool interface and the loop. Subclass `BetaAbstractMemoryTool` (Python and C#), use `betaMemoryTool` (TypeScript), or implement `BetaMemoryToolHandler` (Java) to back memory with your own storage, such as files on disk, a database, cloud storage, or encrypted files. Python and TypeScript also ship a ready-made local-filesystem implementation, `BetaLocalFilesystemMemoryTool`. The helper and tool-runner surfaces live in your SDK's beta namespace even though the memory tool itself doesn't require a beta header. The Go and Ruby SDKs have no memory helper, so those examples run the tool-use loop themselves, and PHP wraps your handler closure in its generic `BetaRunnableTool`. All three use an in-memory store that you replace with your own storage. @@ -356,9 +352,8 @@ Four SDKs provide memory tool helpers that handle the tool interface and the loo MaxTokens = 1024, Messages = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "Remember that customer Acme Corp prefers email follow-ups.", }, ], @@ -738,7 +733,7 @@ Shows directory contents or file contents with optional line ranges: #### Return values -**For directories:** Return a listing that shows files and directories with their sizes: +**For directories:** Return a list that shows files and directories with their sizes: ```text Here're the files and directories up to 2 levels deep in {path}, excluding hidden items and node_modules: @@ -752,7 +747,7 @@ Here're the files and directories up to 2 levels deep in {path}, excluding hidde * Excludes hidden items (files starting with `.`) and `node_modules` * Uses a tab character between the size and the path -The first `view` of `/memories` on an empty store is not an error. Where your SDK ships a local-filesystem memory tool, `BetaLocalFilesystemMemoryTool`, it creates the memory root before Claude's first call and returns the listing header followed by a single size-and-path line for the empty directory itself. +The first `view` of `/memories` on an empty store is not an error. Where your SDK ships a local-filesystem memory tool, `BetaLocalFilesystemMemoryTool`, it creates the memory root before Claude's first call and returns the list header followed by a single size-and-path line for the empty directory itself. **For files:** Return file contents with a header and line numbers: @@ -934,7 +929,7 @@ You can also guide what Claude writes to memory. For example: "Only write down i ## Security considerations -Your application executes every file operation Claude requests, so these safeguards are your responsibility: +Your application runs every file operation Claude requests, so these safeguards are your responsibility: ### Sensitive information @@ -991,7 +986,7 @@ For software projects that span multiple agent sessions, set up memory files del ### How the pattern works -1. **Initializer session:** The first session sets up the memory files before any substantive work begins. This includes a progress log (tracking what has been done and what comes next), a feature checklist (defining the scope of work), and a reference to any startup or initialization script the project needs. +1. **Initializer session:** The first session sets up the memory files before any substantive work starts. This includes a progress log (tracking what has been done and what comes next), a feature checklist (defining the scope of work), and a reference to any startup or initialization script the project needs. 2. **Subsequent sessions:** Each new session opens by reading those memory files. This restores the project state without re-exploring the code base or retracing earlier decisions. @@ -1002,14 +997,14 @@ For software projects that span multiple agent sessions, set up memory files del Work on one feature at a time. Mark a feature complete only after end-to-end verification confirms it works, not when the code is written. This keeps the progress log accurate from session to session. - For a detailed case study of this pattern in practice, including the initializer script, progress file structure, and git-based recovery, see [Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents). + For a detailed case study of this pattern in practice, including the initializer script, progress file structure, and Git-based recovery, see [Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents). ## Next steps - Execute shell commands in a persistent bash session. + Run shell commands in a persistent bash session. diff --git a/content/en/agents-and-tools/tool-use/overview.md b/content/en/agents-and-tools/tool-use/overview.md index dd2094f04c..c2e71dd47b 100644 --- a/content/en/agents-and-tools/tool-use/overview.md +++ b/content/en/agents-and-tools/tool-use/overview.md @@ -1,12 +1,12 @@ --- title: Tool use with Claude url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview -description: Connect Claude to external tools and APIs. See where tools execute, when Claude calls them, and which tool fits your task. +description: Connect Claude to external tools and APIs. See where tools run, when Claude calls them, and which tool fits your task. --- -Tool use (also called function calling) lets Claude call functions that you define or that Anthropic provides. Claude determines when to call a tool based on the user's request and the tool's description. It then returns a structured call that your application executes (client tools) or that Anthropic executes (server tools). +Tool use (also called function calling) lets Claude call functions that you define or that Anthropic provides. Claude determines when to call a tool based on the user's request and the tool's description. It then returns a structured call that your application runs (client tools) or that Anthropic runs (server tools). -Here's a minimal example using a server tool, the [Web search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool), which Anthropic executes for you: +Here's a minimal example using a server tool, the [Web search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool), which Anthropic runs for you: ```bash cURL @@ -60,7 +60,7 @@ Here's a minimal example using a server tool, the [Web search tool](https://plat Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Tools = [new ToolUnion(new WebSearchTool20260209())], - Messages = [new() { Role = Role.User, Content = "What's the latest on the Mars rover?" }] + Messages = [new UserMessageParam { Content = "What's the latest on the Mars rover?" }] }; var message = await client.Messages.Create(parameters); @@ -134,11 +134,11 @@ Here's a minimal example using a server tool, the [Web search tool](https://plat ``` -Claude runs the search on Anthropic's infrastructure and returns the cited results in the same response. To have Claude call a function that you define, pass a tool with an `input_schema`, then execute the call when Claude returns a `tool_use` block. [How tool use works](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview#how-tool-use-works) shows that round trip end to end. Learn more about [defining tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) and [handling tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). +Claude runs the search on Anthropic's infrastructure and returns the cited results in the same response. To have Claude call a function that you define, pass a tool with an `input_schema`, then run the call when Claude returns a `tool_use` block. The [client tool example](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview#how-tool-use-works) shows that round trip end to end. Learn more about [defining tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) and [handling tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). ## How tool use works -Tools differ primarily by where the code executes. **Client tools** (including user-defined tools and tools with Anthropic-defined schemas, such as `bash` and `text_editor`) run in your application. Claude responds with `stop_reason: "tool_use"` and one or more `tool_use` blocks. Your code executes the operation and sends back a `tool_result`. **Server tools** (such as `web_search`, `web_fetch`, `code_execution`, and `tool_search`) run on Anthropic's infrastructure: you see the results directly without handling execution, unless Claude calls the tool in the same group of parallel tool calls as one of your client tools (see [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use)). +Tools differ primarily by where the code runs. **Client tools** (including user-defined tools and tools with Anthropic-defined schemas, such as `bash` and `text_editor`) run in your application. Claude responds with `stop_reason: "tool_use"` and one or more `tool_use` blocks. Your code runs the operation and sends back a `tool_result`. **Server tools** (such as `web_search`, `web_fetch`, `code_execution`, and `tool_search`) run on Anthropic's infrastructure: you see the results directly without handling execution, unless Claude calls the tool in the same group of parallel tool calls as one of your client tools (see [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use)). Here's that round trip in full for a client tool. The first request defines a `get_weather` tool, and Claude answers the question by calling it: the response carries a `tool_use` block, your code runs the lookup, and a second request sends the result back in a `tool_result` block so Claude can reply with the answer. @@ -298,7 +298,7 @@ Here's that round trip in full for a client tool. The first request defines a `g MaxTokens = 1024, Tools = tools, ToolChoice = toolChoice, - Messages = [new() { Role = Role.User, Content = userPrompt }], + Messages = [new UserMessageParam { Content = userPrompt }], }); ToolUseBlock? toolUse = null; foreach (var block in response.Content) @@ -329,9 +329,9 @@ Here's that round trip in full for a client tool. The first request defines a `g ToolChoice = toolChoice, Messages = [ - new() { Role = Role.User, Content = userPrompt }, - new() { Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() { Role = Role.User, Content = new MessageParamContent(toolResults) }, + new UserMessageParam { Content = userPrompt }, + new AssistantMessageParam { Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, + new UserMessageParam { Content = toolResults }, ], }); @@ -479,7 +479,7 @@ Here's that round trip in full for a client tool. The first request defines a `g .toolChoice(toolChoice) .addUserMessage(userPrompt) .addMessage(response) - .addUserMessageOfBlockParams(List.of(ContentBlockParam.ofToolResult( + .addUserMessageOfContentBlockParams(List.of(ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() .toolUseId(toolUse.id()) .content(weather) @@ -627,7 +627,7 @@ Claude called get_weather with {"location": "San Francisco, CA"} The current weather in San Francisco is 15 degrees Celsius with partly cloudy skies. ``` -[Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) covers each step in detail, including result formatting and error signaling; [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use) covers responses that call several tools at once. To skip writing this round trip yourself, use [Tool Runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner): the SDK executes your tools and sends the results back automatically. +[Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) covers each step in detail, including result formatting and error signaling; [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use) covers responses that call several tools at once. To skip writing this round trip yourself, use [Tool Runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner): the SDK runs your tools and sends the results back automatically. For the full conceptual model including the agentic loop and when to choose each approach, see [How tool use works](https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works). @@ -672,7 +672,7 @@ For `type` strings, versions, and beta headers, see [Tool reference](https://pla ### Your own tools -For tools you define, you write the schema and your application executes each call. +For tools you define, you write the schema and your application runs each call. @@ -686,7 +686,7 @@ For tools you define, you write the schema and your application executes each ca ### Anthropic-schema client tools -Anthropic publishes the schema and trains Claude on it. Your application still executes each call and returns the `tool_result`. +Anthropic publishes the schema and trains Claude on it. Your application still runs each call and returns the `tool_result`. @@ -720,11 +720,11 @@ Server tools run on Anthropic's infrastructure, with no handler code in your app - Retrieve the full content of specified web pages and PDF documents. + Retrieve the full content of specified webpages and PDF documents. - Run Python and bash code in a sandboxed container to analyze data and generate files. + Run Python and Bash code in a sandboxed container to analyze data and generate files. @@ -797,7 +797,7 @@ Some server tools add usage-based charges on top of tokens: see [Web search tool - Understand the tool use loop, where tools execute, and when to use tools instead of prose. + Understand the tool use loop, where tools run, and when to use tools instead of prose. diff --git a/content/en/agents-and-tools/tool-use/parallel-tool-use.md b/content/en/agents-and-tools/tool-use/parallel-tool-use.md index ccd24c3d95..2f391d1587 100644 --- a/content/en/agents-and-tools/tool-use/parallel-tool-use.md +++ b/content/en/agents-and-tools/tool-use/parallel-tool-use.md @@ -298,7 +298,7 @@ The following script sends a request that should trigger parallel tool calls, ve { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "What's the weather in SF and NYC, and what time is it there?" }], + Messages = [new UserMessageParam { Content = "What's the weather in SF and NYC, and what time is it there?" }], Tools = tools }; @@ -357,9 +357,9 @@ The following script sends a request that should trigger parallel tool calls, ve Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Messages = [ - new() { Role = Role.User, Content = "What's the weather in SF and NYC, and what time is it there?" }, - new() { Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() { Role = Role.User, Content = new MessageParamContent(toolResults) } + new UserMessageParam { Content = "What's the weather in SF and NYC, and what time is it there?" }, + new AssistantMessageParam { Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, + new UserMessageParam { Content = toolResults } ], Tools = tools }; @@ -592,7 +592,7 @@ The following script sends a request that should trigger parallel tool calls, ve .addTool(timeTool) .addUserMessage("What's the weather in SF and NYC, and what time is it there?") .addMessage(response) - .addUserMessageOfBlockParams(toolResults) + .addUserMessageOfContentBlockParams(toolResults) .build(); Message finalResponse = client.messages().create(finalParams); @@ -738,7 +738,7 @@ The following script sends a request that should trigger parallel tool calls, ve puts "Requesting parallel tool calls..." response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { role: "user", content: "What's the weather in SF and NYC, and what time is it there?" } @@ -776,7 +776,7 @@ The following script sends a request that should trigger parallel tool calls, ve puts "\nGetting final response..." final_response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { role: "user", content: "What's the weather in SF and NYC, and what time is it there?" }, @@ -847,7 +847,7 @@ Parallel tool use is on by default. To turn it off, set `disable_parallel_tool_u ### At most one tool call -When `tool_choice` type is `auto` (the default), setting `disable_parallel_tool_use: true` means Claude calls at most one tool per response. Claude can still answer in plain text without calling any tool. The highlighted lines are the only change from a standard tool use request: +When `tool_choice` type is `auto` (the default), setting `disable_parallel_tool_use: true` means Claude calls at most one tool in each response. Claude can still answer in plain text without calling any tool. The highlighted lines are the only change from a standard tool use request: ```bash cURL @@ -986,7 +986,7 @@ When `tool_choice` type is `auto` (the default), setting `disable_parallel_tool_ }), ], ToolChoice = new ToolChoiceAuto { DisableParallelToolUse = true }, - Messages = [new() { Role = Role.User, Content = "What is the weather in San Francisco and New York?" }] + Messages = [new UserMessageParam { Content = "What is the weather in San Francisco and New York?" }] }; var response = await client.Messages.Create(parameters); @@ -1099,7 +1099,7 @@ When `tool_choice` type is `auto` (the default), setting `disable_parallel_tool_ client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: [ { @@ -1267,7 +1267,7 @@ When `tool_choice` type is `any` or `tool`, setting `disable_parallel_tool_use: }), ], ToolChoice = new ToolChoiceAny { DisableParallelToolUse = true }, - Messages = [new() { Role = Role.User, Content = "What is the weather in San Francisco and New York?" }] + Messages = [new UserMessageParam { Content = "What is the weather in San Francisco and New York?" }] }; var response = await client.Messages.Create(parameters); @@ -1380,7 +1380,7 @@ When `tool_choice` type is `any` or `tool`, setting `disable_parallel_tool_use: client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5", + model: Anthropic::Model::CLAUDE_OPUS_5, max_tokens: 1024, tools: [ { @@ -1575,12 +1575,12 @@ Execution order is your choice. If your tools have ordering dependencies, runnin ## Next steps - - Use the SDK's Tool Runner abstraction to handle the agentic loop, error wrapping, and type safety automatically. + + Use the SDK's tool runner abstraction to handle the agentic loop, error wrapping, and type safety automatically. - Parse tool\_use blocks, format tool\_result responses, and handle errors with is\_error. + Parse `tool_use` blocks, format `tool_result` responses, and handle errors with `is_error`. diff --git a/content/en/agents-and-tools/tool-use/programmatic-tool-calling.md b/content/en/agents-and-tools/tool-use/programmatic-tool-calling.md index 1f82c02974..a249e0f4b4 100644 --- a/content/en/agents-and-tools/tool-use/programmatic-tool-calling.md +++ b/content/en/agents-and-tools/tool-use/programmatic-tool-calling.md @@ -32,9 +32,9 @@ featureMetadata: - Claude Haiku 4.5 accepts the `code_execution_20260120` and later tool versions but doesn't support programmatic tool calling. --- -Programmatic tool calling allows Claude to write code that calls your tools programmatically within a [code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) container, rather than requiring round trips through the model for each tool invocation. This reduces latency for multi-tool workflows and decreases token consumption by allowing Claude to filter or process data before it reaches the model's context window. On agentic search benchmarks like [BrowseComp](https://arxiv.org/abs/2504.12516) and [DeepSearchQA](https://github.com/google-deepmind/deepsearchqa), which test multistep web research and complex information retrieval, adding programmatic tool calling on top of basic search tools improved performance by an average of 11% while using 24% fewer input tokens (see [Improved web search with dynamic filtering](https://claude.com/blog/improved-web-search-with-dynamic-filtering)). +Programmatic tool calling allows Claude to write code that calls your tools programmatically within a [code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) container, rather than requiring round trips through the model for each tool call. This reduces latency for multi-tool workflows and decreases token consumption by allowing Claude to filter or process data before it reaches the model's context window. On agentic search benchmarks such as [BrowseComp](https://arxiv.org/abs/2504.12516) and [DeepSearchQA](https://github.com/google-deepmind/deepsearchqa), which test multistep web research and complex information retrieval, adding programmatic tool calling on top of basic search tools improved performance by an average of 11 percent while using 24 percent fewer input tokens (see [Improved web search with dynamic filtering](https://claude.com/blog/improved-web-search-with-dynamic-filtering)). -Consider checking budget compliance across 20 employees: the traditional approach requires 20 separate model round-trips, pulling thousands of expense line items into the context along the way. With programmatic tool calling, a single script runs all 20 lookups, filters the results, and returns only the employees who exceeded their limits, shrinking what Claude needs to reason over from hundreds of kilobytes down to a handful of lines. +Consider checking budget compliance across 20 employees: the traditional approach requires 20 separate model round-trips, pulling thousands of expense line items into the context along the way. With programmatic tool calling, a single script runs all 20 lookups, filters the results, and returns only the employees who exceeded their limits, shrinking what Claude needs to reason over from hundreds of kilobytes down to a few lines. For a deeper look at the inference and context costs that programmatic tool calling addresses, see [Advanced tool use](https://www.anthropic.com/engineering/advanced-tool-use). @@ -49,10 +49,10 @@ Here's an example where Claude programmatically queries a database multiple time ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --data '{ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -d '{ "model": "claude-opus-5-5", "max_tokens": 4096, "messages": [ @@ -194,8 +194,7 @@ Here's an example where Claude programmatically queries a database multiple time Model = Model.ClaudeOpus5_5, MaxTokens = 4096, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Query sales data for the West, East, and Central regions, then tell me which region had the highest revenue" } ], @@ -327,7 +326,7 @@ Here's an example where Claude programmatically queries a database multiple time client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: [ { @@ -362,23 +361,23 @@ Here's an example where Claude programmatically queries a database multiple time ``` -The response stops with `stop_reason: "tool_use"`, a `container` ID, and a `tool_use` block for `query_database` whose `caller` field identifies the code execution run that called it. Return the result as shown in [Step 3 of the example workflow](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling#step-3-provide-tool-result) so the code can finish. +The response stops with `stop_reason: "tool_use"`, a `container` ID, and a `tool_use` block for `query_database` whose `caller` field identifies the code execution run that called it. Return the result as shown in [Step 3 of the example workflow](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling#step-3-provide-tool-result) so the code can complete. ## How programmatic tool calling works When you configure a tool to be callable from code execution and Claude determines that tool is needed: -1. Claude writes Python code that invokes the tool as a function, potentially including multiple tool calls and pre/post-processing logic -2. Claude runs this code in a sandboxed container through code execution -3. When a tool function is called, code execution pauses and the API returns a `tool_use` block -4. You provide the tool result, and code execution continues (intermediate results are not loaded into Claude's context window) -5. Once all code execution completes, Claude receives the final output and continues working on the task +1. Claude writes Python code that invokes the tool as a function, potentially including multiple tool calls and pre/post-processing logic. +2. Claude runs this code in a sandboxed container through code execution. +3. When a tool function is called, code execution pauses and the API returns a `tool_use` block. +4. You provide the tool result, and code execution continues (intermediate results are not loaded into Claude's context window). +5. Once all code execution completes, Claude receives the final output and continues working on the task. This approach is particularly useful for: -* **Large data processing:** Filter or aggregate tool results before they reach Claude's context -* **Multistep workflows:** Save tokens and latency by calling tools serially or in a loop without sampling Claude in-between tool calls -* **Conditional logic:** Make decisions based on intermediate tool results +* **Large data processing:** Filter or aggregate tool results before they reach Claude's context. +* **Multistep workflows:** Save tokens and latency by calling tools serially or in a loop without sampling Claude in-between tool calls. +* **Conditional logic:** Make decisions based on intermediate tool results. Tools that allow a code execution caller are exposed to Claude's code as async Python functions, so Claude can run them in parallel with `asyncio.gather`. Each function takes a single dict of arguments and returns a string: the text of the `tool_result` you send back. Claude's code awaits these functions with top-level `await` and parses results that it needs as structured data, for example `rows = json.loads(await query_database({"sql": ""}))`. @@ -388,7 +387,7 @@ This approach is particularly useful for: ### The `allowed_callers` field -The `allowed_callers` field specifies which contexts can invoke a tool: +The `allowed_callers` field specifies which contexts can call a tool: ```json { @@ -403,9 +402,9 @@ The `allowed_callers` field specifies which contexts can invoke a tool: **Possible values:** -* `["direct"]` - Claude is guided to call this tool directly (default if omitted) -* `["code_execution_20260120"]` - Claude is guided to call this tool only from within code execution -* `["direct", "code_execution_20260120"]` - Claude may call this tool directly or from within code execution +* `["direct"]` - Claude is guided to call this tool directly (default if omitted). +* `["code_execution_20260120"]` - Claude is guided to call this tool only from within code execution. +* `["direct", "code_execution_20260120"]` - Claude may call this tool directly or from within code execution. Both `"code_execution_20260120"` and `"code_execution_20260521"` are accepted in `allowed_callers` and are interchangeable: a request using either code-execution tool version satisfies tools that list either caller. Response blocks always tag the caller as `code_execution_20260120` regardless of which version the request declared. @@ -414,14 +413,14 @@ Both `"code_execution_20260120"` and `"code_execution_20260521"` are accepted in - `allowed_callers` controls how the tool is presented to Claude and is validated against `tool_choice`, but it is not a hard API-level block on direct invocation. Claude is strongly guided to respect it, but your client should still be prepared to handle a direct `tool_use` for any tool it defines. Do not rely on `allowed_callers` as a security boundary. + `allowed_callers` controls how the tool is presented to Claude and is validated against `tool_choice`, but it is not a hard API-level block on direct calls. Claude is strongly guided to respect it, but your client should still be prepared to handle a direct `tool_use` for any tool it defines. Do not rely on `allowed_callers` as a security boundary. ### The `caller` field in responses -Every tool use block includes a `caller` field indicating how it was invoked: +Every tool use block includes a `caller` field indicating how it was called: -**Direct invocation (traditional tool use):** +**Direct call (traditional tool use):** ```json { @@ -433,7 +432,7 @@ Every tool use block includes a `caller` field indicating how it was invoked: } ``` -**Programmatic invocation:** +**Programmatic call:** ```json { @@ -454,8 +453,8 @@ The `tool_id` is the `id` of the code execution `server_tool_use` block that mad Programmatic tool calling uses the same containers as code execution: -* **Container creation:** A new container is created for each request unless you reuse an existing one -* **Container ID:** Returned in responses in the `container` field, along with an `expires_at` timestamp +* **Container creation:** A new container is created for each request unless you reuse an existing one. +* **Container ID:** Returned in responses in the `container` field, along with an `expires_at` timestamp. * **Reuse:** Pass the container ID back on the next request to keep state. While a programmatic tool call is waiting for your result, the container ID is required on that request, not optional: the API rejects the request without it. * **Expiration:** `expires_at` tells you how long the container has left. Idle containers are currently reclaimed after about 5 minutes, and no container can be reused more than 30 days after it was created. @@ -527,10 +526,10 @@ Send the full conversation history plus your tool result. Three details matter o ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --data '{ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -d '{ "model": "claude-opus-5-5", "max_tokens": 4096, "container": "container_xyz789", @@ -804,14 +803,12 @@ Send the full conversation history plus your tool result. Three details matter o Container = "container_xyz789", Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Query customer purchase history from the last quarter and identify our top 5 customers by revenue" }, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = new ContentBlock[] { new TextBlock { Text = "I'll query the purchase history and analyze the results." }, @@ -834,9 +831,8 @@ Send the full conversation history plus your tool result. Three details matter o } } }, - new() + new UserMessageParam { - Role = Role.User, Content = new ContentBlockParam[] { new ToolResultBlockParam @@ -954,7 +950,7 @@ Send the full conversation history plus your tool result. Three details matter o .maxTokens(4096L) .container("container_xyz789") .addUserMessage("Query customer purchase history from the last quarter and identify our top 5 customers by revenue") - .addAssistantMessageOfBlockParams(List.of( + .addAssistantMessageOfContentBlockParams(List.of( ContentBlockParam.ofText( TextBlockParam.builder() .text("I'll query the purchase history and analyze the results.") @@ -962,7 +958,7 @@ Send the full conversation history plus your tool result. Three details matter o ContentBlockParam.ofServerToolUse( ServerToolUseBlockParam.builder() .id("srvtoolu_abc123") - .name("code_execution") + .name(ServerToolUseBlockParam.Name.CODE_EXECUTION) .input(JsonValue.from(Map.of("code", "..."))) .build()), ContentBlockParam.ofToolUse( @@ -973,7 +969,7 @@ Send the full conversation history plus your tool result. Three details matter o .codeExecution20260120Caller("srvtoolu_abc123") .build()) )) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() .toolUseId("toolu_def456") @@ -1207,7 +1203,7 @@ print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue") This pattern: -* Reduces model round-trips from N (one per region) to 1 +* Reduces model round-trips from N (one for each region) to 1 * Processes large result sets programmatically before returning to Claude * Saves tokens by only returning aggregated conclusions instead of raw data @@ -1305,14 +1301,14 @@ When all tool calls are satisfied and code completes: ### Common errors -| Error | Where it appears | Description | Solution | -| ------------------------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | -| `invalid_tool_input` | `error_code` on the `code_execution_tool_result` error block in the response | Invalid parameters were passed to the code execution tool | See the [code execution tool errors](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors) | -| `invalid_request_error` (on `tool_choice`) | HTTP 400 error response | `tool_choice` names a tool whose `allowed_callers` does not include `"direct"` | Either add `"direct"` to that tool's `allowed_callers`, or remove the tool from `tool_choice` and let Claude invoke it from code | +| Error | Where it appears | Description | Solution | +| ------------------------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | +| `invalid_tool_input` | `error_code` on the `code_execution_tool_result` error block in the response | Invalid parameters were passed to the code execution tool | See the [code execution tool errors](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#errors) | +| `invalid_request_error` (on `tool_choice`) | HTTP 400 error response | `tool_choice` names a tool whose `allowed_callers` does not include `"direct"` | Either add `"direct"` to that tool's `allowed_callers`, or remove the tool from `tool_choice` and let Claude call it from code | ### Container expiration during tool call -If your tool result doesn't arrive within about 4 minutes, the pending call raises a `TimeoutError` inside Claude's running code. Claude sees the error in `stderr` and typically retries the call: +If your tool result doesn't arrive within about 4 minutes, the pending call raises a `TimeoutError` inside Claude's running code. Claude receives the error in `stderr` and typically retries the call: ```json { @@ -1330,9 +1326,9 @@ If your tool result doesn't arrive within about 4 minutes, the pending call rais To prevent timeouts: -* Monitor the `expires_at` field in responses -* Implement timeouts for your tool execution -* Consider breaking long operations into smaller chunks +* Monitor the `expires_at` field in responses. +* Implement timeouts for your tool execution. +* Consider breaking long operations into smaller chunks. ### Tool execution errors @@ -1352,9 +1348,9 @@ Claude's code receives this error and can handle it appropriately. ### Feature incompatibilities -* **Structured outputs:** Tools with `strict: true` are not supported with programmatic calling -* **Tool choice:** You cannot force programmatic calling of a specific tool through `tool_choice` -* **Parallel tool use:** `disable_parallel_tool_use: true` is not supported with programmatic calling +* **Structured outputs:** Tools with `strict: true` are not supported with programmatic calling. +* **Tool choice:** You cannot force programmatic calling of a specific tool through `tool_choice`. +* **Parallel tool use:** `disable_parallel_tool_use: true` is not supported with programmatic calling. ### Input schema limitations @@ -1378,7 +1374,7 @@ When responding to programmatic tool calls, there are strict formatting requirem **Tool result only responses:** If there are pending programmatic tool calls waiting for results, your response message must contain **only** `tool_result` blocks. You cannot include any text content, even after the tool results. -Invalid - Cannot include text when responding to programmatic tool calls: +Invalid (cannot include text when responding to programmatic tool calls): ```json { @@ -1394,7 +1390,7 @@ Invalid - Cannot include text when responding to programmatic tool calls: } ``` -Valid - Only tool results when responding to programmatic tool calls: +Valid (only tool results when responding to programmatic tool calls): ```json { @@ -1415,30 +1411,30 @@ This restriction only applies when responding to programmatic (code execution) t ### Rate limits -Programmatic tool calls are subject to the same rate limits as regular tool calls. Each tool call from code execution counts as a separate invocation. +Programmatic tool calls are subject to the same rate limits as regular tool calls. Each tool call from code execution counts toward those limits individually. ### Validate tool results before use When implementing user-defined tools that will be called programmatically: -* **Tool results are returned as strings:** They can contain any content, including code snippets or executable commands that may be processed by the execution environment. -* **Validate external tool results:** If your tool returns data from external sources or accepts user input, be aware of code injection risks if the output will be interpreted or executed as code. +* **Tool results are returned as strings:** They can contain any content, including code snippets or executable commands that might be processed by the execution environment. +* **Validate external tool results:** If your tool returns data from external sources or accepts user input, be aware of code injection risks if the output is interpreted or run as code. ## Token efficiency Programmatic tool calling reduces token consumption in three ways: * **Tool results from programmatic calls are not added to Claude's context** - only the final code output is -* **Intermediate processing happens in code** - filtering, aggregation, and other transformations don't consume model tokens +* **Intermediate processing occurs in code** - filtering, aggregation, and other transformations don't consume model tokens * **Multiple tool calls in one code execution** - reduces overhead compared to separate model turns For example, calling 10 tools directly uses \~10x the tokens of calling them programmatically and returning a summary. In Anthropic's internal evaluations on a production Claude model: -* On a 75-tool project-management agent benchmark, enabling programmatic tool calling reduced billed input tokens by roughly 38% with no change in task accuracy. -* On [τ²-bench](https://arxiv.org/abs/2506.07982) (airline, retail, and telecom domains), where each turn makes one or two sequential tool calls, programmatic tool calling left scores unchanged and cost roughly 8% more. Sequential single-call workflows do not benefit. -* Across production API traffic, requests whose `tools` array contains 10 to 49 tool definitions see typical token savings of 20% to 40% with programmatic tool calling enabled. +* On a 75-tool project-management agent benchmark, enabling programmatic tool calling reduced billed input tokens by roughly 38 percent with no change in task accuracy. +* On [τ²-bench](https://arxiv.org/abs/2506.07982) (airline, retail, and telecom domains), where each turn makes one or two sequential tool calls, programmatic tool calling left scores unchanged and cost roughly 8 percent more. Sequential single-call workflows do not benefit. +* Across production API traffic, requests whose `tools` array contains 10 to 49 tool definitions see typical token savings of 20 to 40 percent with programmatic tool calling enabled. Actual savings vary with workload shape. See [When to use programmatic calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling#when-to-use-programmatic-calling). @@ -1447,20 +1443,20 @@ Actual savings vary with workload shape. See [When to use programmatic calling]( Programmatic tool calling uses the same pricing as code execution. See the [code execution pricing](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#usage-and-pricing) for details. - Token counting for programmatic tool calls: Tool results from programmatic invocations do not count toward your input/output token usage. Only the final code execution result and Claude's response count. + Token counting for programmatic tool calls: Tool results from programmatic calls do not count toward your input/output token usage. Only the final code execution result and Claude's response count. ## Best practices ### Tool design -* **Provide detailed output descriptions:** Because Claude deserializes tool results in code, document the format (JSON structure and field types) -* **Return structured data:** JSON or other machine-readable formats work best for programmatic processing -* **Keep responses concise:** Return only necessary data to minimize processing overhead +* **Provide detailed output descriptions:** Because Claude deserializes tool results in code, document the format (JSON structure and field types). +* **Return structured data:** JSON or other machine-readable formats work best for programmatic processing. +* **Keep responses concise:** Return only necessary data to minimize processing overhead. ### When to use programmatic calling -Programmatic tool calling trades a small fixed overhead (container startup, script generation) for large savings on tool-result tokens and model round-trips. Whether that trade pays off depends on workload shape. +Programmatic tool calling trades a small fixed overhead (container startup, script generation) for large savings on tool-result tokens and model round-trips. Whether that trade is worthwhile depends on workload shape. **Strong fit:** @@ -1478,8 +1474,8 @@ If you are unsure, measure billed input tokens with and without `allowed_callers ### Performance optimization -* **Reuse containers** when making multiple related requests to maintain state -* **Batch similar operations** in a single code execution when possible +* **Reuse containers** when making multiple related requests to maintain state. +* **Batch similar operations** in a single code execution when possible. ## Troubleshooting @@ -1487,32 +1483,32 @@ If you are unsure, measure billed input tokens with and without `allowed_callers **`invalid_request_error` when setting `tool_choice`** -* `tool_choice` cannot name a tool whose `allowed_callers` omits `"direct"`. Either add `"direct"` to that tool's `allowed_callers`, or remove the tool from `tool_choice` and let Claude invoke it from code. +* `tool_choice` cannot name a tool whose `allowed_callers` omits `"direct"`. Either add `"direct"` to that tool's `allowed_callers`, or remove the tool from `tool_choice` and let Claude call it from code. **Container expiration** * Respond to each programmatic tool call well before the paused response's `expires_at` timestamp. Claude's code stops waiting for a result after about 4 minutes, and idle containers are currently reclaimed after about 5 minutes. -* Consider implementing faster tool execution +* Consider implementing faster tool execution. **Tool result not parsed correctly** -* Ensure your tool returns string data that Claude can deserialize -* Provide clear output format documentation in your tool description +* Ensure your tool returns string data that Claude can deserialize. +* Provide clear output format documentation in your tool description. ### Debugging tips -1. **Log all tool calls and results** to track the flow -2. **Check the `caller` field** to confirm programmatic invocation -3. **Monitor container IDs** to ensure proper reuse -4. **Test tools independently** before enabling programmatic calling +1. **Log all tool calls and results** to track the flow. +2. **Check the `caller` field** to confirm a programmatic call. +3. **Monitor container IDs** to ensure proper reuse. +4. **Test tools independently** before enabling programmatic calling. ## Why programmatic tool calling works Claude is trained on large amounts of code, so presenting tools as callable Python functions lets it use that strength: -* **Tool composition:** Chained calls, loops, and conditionals are ordinary Python control flow instead of a series of model round trips -* **Result processing:** Claude's code filters and aggregates large tool outputs, or writes them to files, and only the final output enters the context window -* **Latency:** The model is not re-sampled between the tool calls inside one code execution +* **Tool composition:** Chained calls, loops, and conditionals are ordinary Python control flow instead of a series of model round trips. +* **Result processing:** Claude's code filters and aggregates large tool outputs, or writes them to files, and only the final output enters the context window. +* **Latency:** The model is not re-sampled between the tool calls inside one code execution. ## Alternative implementations @@ -1520,7 +1516,7 @@ Programmatic tool calling is a generalizable pattern that can also be implemente ### Client-side direct execution -Provide Claude with a code execution tool and describe what functions are available in that environment. When Claude invokes the tool with code, your application executes it locally where those functions are defined. +Provide Claude with a code execution tool and describe what functions are available in that environment. When Claude calls the tool with code, your application runs it locally where those functions are defined. **Advantages:** @@ -1529,14 +1525,14 @@ Provide Claude with a code execution tool and describe what functions are availa **Disadvantages:** -* Executes untrusted code outside of a sandbox -* Tool invocations can be vectors for code injection +* Runs untrusted code outside of a sandbox +* Tool calls can be vectors for code injection -**Use when:** Your application can safely execute arbitrary code, you want the smallest implementation, and Anthropic's managed offering doesn't fit your needs. +**Use when:** Your application can safely run arbitrary code, you want the smallest implementation, and Anthropic's managed offering doesn't fit your needs. ### Self-managed sandboxed execution -Same approach from Claude's perspective, but code runs in a sandboxed container with security restrictions (for example, no network egress). If your tools require external resources, you'll need a protocol for executing tool calls outside the sandbox. +Same approach from Claude's perspective, but code runs in a sandboxed container with security restrictions (for example, no network egress). If your tools require external resources, you'll need a protocol for running tool calls outside the sandbox. **Advantages:** @@ -1552,7 +1548,7 @@ Same approach from Claude's perspective, but code runs in a sandboxed container ### Anthropic-managed execution -Anthropic's programmatic tool calling is a managed version of sandboxed execution with an opinionated Python environment tuned for Claude. Anthropic handles container management, code execution, and secure tool invocation communication. +Anthropic's programmatic tool calling is a managed version of sandboxed execution with an opinionated Python environment tuned for Claude. Anthropic handles container management, code execution, and secure tool call communication. **Advantages:** @@ -1576,11 +1572,11 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. + Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. - Connect Claude to external tools and APIs. See where tools execute, when Claude calls them, and which tool fits your task. + Connect Claude to external tools and APIs. See where tools run, when Claude calls them, and which tool fits your task. diff --git a/content/en/agents-and-tools/tool-use/server-tools.md b/content/en/agents-and-tools/tool-use/server-tools.md index fe740596d8..98248cf0cf 100644 --- a/content/en/agents-and-tools/tool-use/server-tools.md +++ b/content/en/agents-and-tools/tool-use/server-tools.md @@ -1,10 +1,10 @@ --- title: Server tools url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools -description: "Work with Anthropic-executed tools: server_tool_use blocks, pause_turn continuation, mixed server and client tool turns, and domain filtering." +description: "Work with tools that Anthropic runs: server_tool_use blocks, pause_turn continuation, mixed server and client tool turns, and domain filtering." --- -Server-executed tools share these mechanics: the `server_tool_use` block, `pause_turn` continuation, turns that mix server and client tools, Zero Data Retention (ZDR) eligibility, and domain filtering. For individual tools, see the [tool reference](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference). +Server-executed tools share these mechanics: the `server_tool_use` block, `pause_turn` continuation, turns that mix server and client tools, Zero Data Retention (ZDR) eligibility, and domain filtering. For individual tools, see the [Tool reference](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference). ## The server\_tool\_use block @@ -19,7 +19,7 @@ The `server_tool_use` block appears in Claude's response when a server-executed } ``` -The API executes the tool internally. You see the call and its result in the response, but you don't handle execution. Unlike client `tool_use` blocks, you don't need to respond with a `tool_result`. The tool's result block (for example, `web_search_tool_result` for web search) follows the `server_tool_use` block in the same assistant turn, paired by `tool_use_id`. If Claude calls one of your client tools at the same time, the `server_tool_use` block appears without its result, and the response ends with `stop_reason: "tool_use"`. The API runs the tool when you return the client `tool_result` blocks in your next request. +The API runs the tool internally. You see the call and its result in the response, but you don't handle execution. Unlike client `tool_use` blocks, you don't need to respond with a `tool_result`. The tool's result block (for example, `web_search_tool_result` for web search) follows the `server_tool_use` block in the same assistant turn, paired by `tool_use_id`. If Claude calls one of your client tools at the same time, the `server_tool_use` block appears without its result, and the response ends with `stop_reason: "tool_use"`. The API runs the tool when you return the client `tool_result` blocks in your next request. ## The server-side loop and pause\_turn @@ -164,8 +164,7 @@ Here's how to handle the `pause_turn` stop reason: Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Search for comprehensive information about quantum computing breakthroughs in 2025" } ], @@ -182,12 +181,10 @@ Here's how to handle the `pause_turn` stop reason: Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Search for comprehensive information about quantum computing breakthroughs in 2025" }, - new() { - Role = Role.Assistant, + new AssistantMessageParam { Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() } ], @@ -398,14 +395,14 @@ For the other `stop_reason` values and general handling patterns, see [Stop reas ## Mixing server tools and client tools in one turn -Claude can call a server tool and a client tool in the same group of parallel tool calls, for example, `web_fetch` together with a user-defined tool. A client tool is any tool that your code executes and that produces a `tool_use` block, whether it is user-defined or an Anthropic-schema client tool such as the [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool). When that happens, the API does not run the server tool. It returns immediately so that you can run the client tool first: +Claude can call a server tool and a client tool in the same group of parallel tool calls, for example, `web_fetch` together with a user-defined tool. A client tool is any tool that your code runs and that produces a `tool_use` block, whether it is user-defined or an Anthropic-schema client tool such as the [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool). When that occurs, the API does not run the server tool. It returns immediately so that you can run the client tool first: * `stop_reason` is `"tool_use"`, not `"pause_turn"`. -* `content` contains the `server_tool_use` block and the client `tool_use` block, but no result block for the server tool: that call is not finished. +* `content` contains the `server_tool_use` block and the client `tool_use` block, but no result block for the server tool: that call is not complete. * There is no other marker. Detect the state by looking for a `server_tool_use` block whose `id` has no matching result block in the response. An `mcp_tool_use` block from the [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) behaves the same way. Server tool calls that already have their result block in the same response are complete and need nothing from you. - With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), the same response shape means something different. The client `tool_use` block comes from code that is running in the `code_execution` tool rather than from Claude directly, and its `caller` field names the `code_execution` block that called it. That code has already started: it is paused waiting for your `tool_result` blocks, and sending them resumes the execution instead of starting a deferred tool. The `code_execution` block's own result block arrives once the code finishes, which can take more than one round of tool results. The follow-up user message itself is the same in both cases; with programmatic tool calling, also pass back the `id` from the response's `container` field, as that page shows. + With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), the same response shape means something different. The client `tool_use` block comes from code that is running in the `code_execution` tool rather than from Claude directly, and its `caller` field names the `code_execution` block that called it. That code has already started: it is paused waiting for your `tool_result` blocks, and sending them resumes the execution instead of starting a deferred tool. The `code_execution` block's own result block arrives once the code completes, which can take more than one round of tool results. The follow-up user message itself is the same in both cases; with programmatic tool calling, also pass back the `id` from the response's `container` field, as that page shows. ```json @@ -447,7 +444,7 @@ To continue the turn, run the client tools and send a user message whose content } ``` -The API attaches your results to the still-open assistant turn, runs the deferred server tool (for paused code execution, resumes it), and then lets Claude continue. For a server tool Claude called directly, the next response begins with the result block that answers the previous response's `server_tool_use` `id`, followed by the newly generated content and a fresh `stop_reason`: +The API attaches your results to the still-open assistant turn, runs the deferred server tool (for paused code execution, resumes it), and then lets Claude continue. For a server tool Claude called directly, the next response starts with the result block that answers the previous response's `server_tool_use` `id`, followed by the newly generated content and a fresh `stop_reason`: ```json { @@ -703,9 +700,8 @@ The following example enables web fetch together with a user-defined `run_comman }, }), ]; - MessageParam userMessage = new() + MessageParam userMessage = new UserMessageParam { - Role = Role.User, Content = "Summarize https://example.com/article and run uname -a to tell me what system this is on." }; @@ -743,12 +739,11 @@ The following example enables web fetch together with a user-defined `run_comman Messages = [ userMessage, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() { Role = Role.User, Content = new MessageParamContent(toolResults) } + new UserMessageParam { Content = toolResults } ] }); // If a web_fetch was deferred, it runs on this request and its @@ -875,7 +870,7 @@ The following example enables web fetch together with a user-defined `run_comman .addTool(runCommandTool) .addUserMessage(prompt) .addMessage(response) - .addUserMessageOfBlockParams(toolResults) + .addUserMessageOfContentBlockParams(toolResults) .build()); // If a web_fetch was deferred, it runs on this request and its // web_fetch_tool_result is the first block of continuation.content(). @@ -1026,9 +1021,9 @@ To use a `_20260209` or later server tool with ZDR, disable dynamic filtering by } ``` -This restricts the tool to direct invocation only, bypassing the internal code execution step. +This restricts the tool to direct calls only, bypassing the internal code execution step. -`allowed_callers` controls how a tool can be invoked: directly by Claude (`"direct"`), from inside a code execution container (for example, `"code_execution_20260120"`), or both. The `_20260209` versions of the web tools default to the code execution caller only; earlier versions default to `["direct"]`. On models that don't support programmatic tool calling, these versions require `allowed_callers: ["direct"]`; without it the API returns a validation error that says to set it. +`allowed_callers` controls how a tool can be called: directly by Claude (`"direct"`), from inside a code execution container (for example, `"code_execution_20260120"`), or both. The `_20260209` versions of the web tools default to the code execution caller only; earlier versions default to `["direct"]`. On models that don't support programmatic tool calling, these versions require `allowed_callers: ["direct"]`; without it the API returns a validation error that says to set it. Even when web fetch is used in a ZDR-eligible configuration, website publishers might retain any parameters passed to the URL if Claude fetches content from their site. @@ -1111,7 +1106,7 @@ Common batch workloads include enriching a dataset with information from the web - Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. + Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. diff --git a/content/en/agents-and-tools/tool-use/strict-tool-use.md b/content/en/agents-and-tools/tool-use/strict-tool-use.md index 1f51d13e35..59653900b7 100644 --- a/content/en/agents-and-tools/tool-use/strict-tool-use.md +++ b/content/en/agents-and-tools/tool-use/strict-tool-use.md @@ -6,7 +6,7 @@ description: Enforce JSON Schema compliance on Claude's tool inputs with grammar Setting `strict: true` on a tool definition guarantees Claude's tool inputs match your JSON Schema by constraining the model's token sampling to schema-valid outputs (a technique called grammar-constrained sampling). This page covers why strict mode matters for agents, how to enable it, and common use cases. For the supported JSON Schema subset, see [JSON Schema limitations](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#json-schema-limitations). For non-strict schema guidance, see [Define tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools). -Strict tool use validates tool parameters, ensuring Claude calls your functions with correctly-typed arguments. Use strict tool use when you need to: +Strict tool use validates tool parameters, ensuring Claude calls your functions with correctly typed arguments. Use strict tool use when you need to: * Validate tool parameters * Build agentic workflows @@ -19,7 +19,7 @@ Building reliable agentic systems requires guaranteed schema conformance. Withou Strict tool use guarantees type-safe parameters: -* Functions receive correctly-typed arguments every time +* Functions receive correctly typed arguments every time * No need to validate and retry tool calls * Production-ready agents that work consistently at scale @@ -172,7 +172,7 @@ For example, suppose a booking system needs `passengers: int`. Without strict mo { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "What's the weather like in San Francisco?" }], + Messages = [new UserMessageParam { Content = "What's the weather like in San Francisco?" }], Tools = [ new ToolUnion(new Tool() { @@ -517,7 +517,7 @@ The [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Search for flights to Tokyo departing June 1, 2026" }], + Messages = [new UserMessageParam { Content = "Search for flights to Tokyo departing June 1, 2026" }], Tools = [ new ToolUnion(new Tool() { @@ -878,7 +878,7 @@ The [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026" }], + Messages = [new UserMessageParam { Content = "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026" }], Tools = [ new ToolUnion(new Tool() { diff --git a/content/en/agents-and-tools/tool-use/text-editor-tool.md b/content/en/agents-and-tools/tool-use/text-editor-tool.md index e31635d482..fcecdf4de5 100644 --- a/content/en/agents-and-tools/tool-use/text-editor-tool.md +++ b/content/en/agents-and-tools/tool-use/text-editor-tool.md @@ -123,9 +123,8 @@ You can optionally specify a `max_characters` parameter to control truncation wh Tools = [new ToolTextEditor20250728 { MaxCharacters = 10000 }], Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "There's a syntax error in my primes.py file. Can you help me fix it?", }, ], @@ -226,35 +225,35 @@ Use the text editor tool in the following way: - * Include the text editor tool in your API request - * Provide a user prompt that may require examining or modifying files, such as "Can you fix the syntax error in my code?" + * Include the text editor tool in your API request. + * Provide a user prompt that might require examining or modifying files, such as "Can you fix the syntax error in my code?" - * Claude assesses what it needs to look at and uses the `view` command to examine file contents or list directory contents - * The API response will contain a `tool_use` content block with the `view` command + * Claude assesses what it needs to look at and uses the `view` command to examine file contents or list directory contents. + * The API response contains a `tool_use` content block with the `view` command. - - * Extract the file or directory path from Claude's tool use request - * Read the file's contents or list the directory contents - * If a `max_characters` parameter was specified in the tool configuration, truncate the file contents to that length - * Return the results to Claude by continuing the conversation with a new `user` message containing a `tool_result` content block + + * Extract the file or directory path from Claude's tool use request. + * Read the file's contents or list the directory contents. + * If you specified a `max_characters` parameter in the tool configuration, truncate the file contents to that length. + * Return the results to Claude by continuing the conversation with a new `user` message containing a `tool_result` content block. - * After examining the file or directory, Claude may use a command such as `str_replace` to make changes or `insert` to add text at a specific line number. - * If Claude uses the `str_replace` command, Claude constructs a properly formatted tool use request with the old text and new text to replace it with + * After examining the file or directory, Claude might use a command such as `str_replace` to make changes or `insert` to add text at a specific line number. + * If Claude uses the `str_replace` command, Claude constructs a properly formatted tool use request with the old text and new text to replace it with. - - * Extract the file path, old text, and new text from Claude's tool use request - * Perform the text replacement in the file - * Return the results to Claude + + * Extract the file path, old text, and new text from Claude's tool use request. + * Perform the text replacement in the file. + * Return the results to Claude. - * After examining and possibly editing the files, Claude provides a complete explanation of what it found and what changes it made + * After examining and possibly editing the files, Claude provides a complete explanation of what it found and what changes it made. @@ -471,9 +470,8 @@ First, your application provides Claude with the text editor tool and a prompt t Tools = [new ToolTextEditor20250728()], Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "There's a syntax error in my primes.py file. Can you help me fix it?", }, ], @@ -807,15 +805,13 @@ Your application should then read the file and return its contents to Claude: Tools = [new ToolTextEditor20250728()], Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "There's a syntax error in my primes.py file. Can you help me fix it?", }, - new() + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { @@ -831,19 +827,18 @@ Your application should then read the file and return its contents to Claude: ["path"] = JsonSerializer.SerializeToElement("primes.py"), }, }), - }), + }, }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = "toolu_01AbCdEfGhIjKlMnOpQrStU", Content = "1: def is_prime(n):\n2: \"\"\"Check if a number is prime.\"\"\"\n3: if n <= 1:\n4: return False\n5: if n <= 3:\n6: return True\n7: if n % 2 == 0 or n % 3 == 0:\n8: return False\n9: i = 5\n10: while i * i <= n:\n11: if n % i == 0 or n % (i + 2) == 0:\n12: return False\n13: i += 6\n14: return True\n15: \n16: def get_primes(limit):\n17: \"\"\"Generate a list of prime numbers up to the given limit.\"\"\"\n18: primes = []\n19: for num in range(2, limit + 1)\n20: if is_prime(num):\n21: primes.append(num)\n22: return primes\n23: \n24: def main():\n25: \"\"\"Main function to demonstrate prime number generation.\"\"\"\n26: limit = 100\n27: prime_list = get_primes(limit)\n28: print(f\"Prime numbers up to {limit}:\")\n29: print(prime_list)\n30: print(f\"Found {len(prime_list)} prime numbers.\")\n31: \n32: if __name__ == \"__main__\":\n33: main()", }), - }), + }, }, ], } @@ -894,7 +889,7 @@ Your application should then read the file and return its contents to Claude: .maxTokens(1024) .addTool(ToolTextEditor20250728.builder().build()) .addUserMessage("There's a syntax error in my primes.py file. Can you help me fix it?") - .addAssistantMessageOfBlockParams( + .addAssistantMessageOfContentBlockParams( List.of( ContentBlockParam.ofText( TextBlockParam.builder() @@ -915,7 +910,7 @@ Your application should then read the file and return its contents to Claude: ) ) ) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() @@ -1239,10 +1234,9 @@ Your application should then make the edit and return the result: Messages = [ // Previous messages... - new() + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { @@ -1260,19 +1254,18 @@ Your application should then make the edit and return the result: ["new_str"] = JsonSerializer.SerializeToElement(" for num in range(2, limit + 1):"), }, }), - }), + }, }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = "toolu_01PqRsTuVwXyZAbCdEfGh", Content = "Successfully replaced text at exactly one location.", }), - }), + }, }, ], } @@ -1328,7 +1321,7 @@ Your application should then make the edit and return the result: .maxTokens(1024) .addTool(ToolTextEditor20250728.builder().build()) // Previous messages would go here - .addAssistantMessageOfBlockParams( + .addAssistantMessageOfContentBlockParams( List.of( ContentBlockParam.ofText( TextBlockParam.builder() @@ -1359,7 +1352,7 @@ Your application should then make the edit and return the result: ) ) ) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() @@ -1491,7 +1484,7 @@ The tool type is `type: "text_editor_20250728"` for Claude 4 and later models. - Create helper functions to handle file operations like reading, writing, and modifying files. Consider implementing backup functionality to recover from mistakes. + Create helper functions to handle file operations such as reading, writing, and modifying files. Consider implementing backup functionality to recover from mistakes. @@ -1780,11 +1773,11 @@ The tool type is `type: "text_editor_20250728"` for Claude 4 and later models. ### Handle errors -When using the text editor tool, various errors may occur. Here is guidance on how to handle them: +When using the text editor tool, various errors might occur. Here is guidance on how to handle them: - If Claude tries to view or modify a file that doesn't exist, return an appropriate error message in the `tool_result`: + If Claude attempts to view or modify a file that doesn't exist, return an appropriate error message in the `tool_result`: ```json { @@ -1860,7 +1853,7 @@ When using the text editor tool, various errors may occur. Here is guidance on h - When asking Claude to fix or modify code, be specific about what files need to be examined or what issues need to be addressed. Clear context helps Claude identify the right files and make appropriate changes. + When asking Claude to fix or modify code, be specific about what files to examine or what issues to address. Clear context helps Claude identify the right files and make appropriate changes. **Less helpful prompt:** "Can you fix my code?" @@ -2257,7 +2250,7 @@ You can use the text editor tool alongside other Claude tools. When combining to | Date | Version | Changes | | ---------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | July 28, 2025 | `text_editor_20250728` | Release of an updated text editor tool that fixes some issues and adds an optional `max_characters` parameter. It is otherwise identical to `text_editor_20250429`. | -| April 29, 2025 | `text_editor_20250429` | Release of the text editor tool for Claude 4. This version removes the `undo_edit` command but maintains all other capabilities. The tool name has been updated to reflect its str\_replace-based architecture. | +| April 29, 2025 | `text_editor_20250429` | Release of the text editor tool for Claude 4. This version removes the `undo_edit` command but maintains all other capabilities. The tool name has been updated to reflect its `str_replace`-based architecture. | | March 13, 2025 | `text_editor_20250124` | Introduction of standalone text editor tool documentation. This version is optimized for Claude Sonnet 3.7 but has identical capabilities to the previous version. | | October 22, 2024 | `text_editor_20241022` | Initial release of the text editor tool with Claude Sonnet 3.5 (retired; see [Model deprecations](https://platform.claude.com/docs/en/about-claude/model-deprecations)). Provides capabilities for viewing, creating, and editing files through the `view`, `create`, `str_replace`, `insert`, and `undo_edit` commands. | @@ -2265,13 +2258,13 @@ You can use the text editor tool alongside other Claude tools. When combining to Here are some ideas for how to use the text editor tool in more convenient and powerful ways: -* **Integrate with your development workflow**: Build the text editor tool into your development tools or IDE -* **Create a code review system**: Have Claude review your code and make improvements -* **Build a debugging assistant**: Create a system where Claude can help you diagnose and fix issues in your code -* **Implement file format conversion**: Let Claude help you convert files from one format to another -* **Automate documentation**: Set up workflows for Claude to automatically document your code +* **Integrate with your development workflow:** Build the text editor tool into your development tools or IDE +* **Create a code review system:** Have Claude review your code and make improvements +* **Build a debugging assistant:** Create a system where Claude can help you diagnose and fix issues in your code +* **Implement file format conversion:** Let Claude help you convert files from one format to another +* **Automate documentation:** Set up workflows for Claude to automatically document your code -The text editor tool enables Claude to work directly with your code base, supporting workflows from debugging to automated documentation. +The text editor tool allows Claude to work directly with your code base, supporting workflows from debugging to automated documentation. @@ -2279,6 +2272,6 @@ The text editor tool enables Claude to work directly with your code base, suppor - Execute shell commands with Claude. + Run shell commands with Claude. diff --git a/content/en/agents-and-tools/tool-use/tool-combinations.md b/content/en/agents-and-tools/tool-use/tool-combinations.md index b9d5a57157..23a28cd854 100644 --- a/content/en/agents-and-tools/tool-use/tool-combinations.md +++ b/content/en/agents-and-tools/tool-use/tool-combinations.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-combinat description: Common Anthropic tool pairings for research agents, coding agents, and long-running agents. --- -Anthropic-provided tools are designed to work together. Common agent patterns pair tools that cover complementary stages of a workflow: one tool gathers or discovers, another processes or acts. The combinations below are starting points, not prescriptions. Mix them to fit your task. +Anthropic-provided tools are designed to work together. Common agent patterns pair tools that cover complementary stages of a workflow: one tool gathers or discovers, another processes or acts. The following combinations are starting points, not prescriptions. Mix them to fit your task. Each snippet shows only the `tools` array. See [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) for the full request shape. @@ -21,7 +21,7 @@ Search finds sources; code execution analyzes and synthesizes. Claude searches f } ``` -The flow is typically search, then execute, then optionally search again if the first pass surfaced a gap. Code execution runs server-side, so there's no client-side sandbox to manage. +The flow is typically search, then run code, then optionally search again if the first pass surfaced a gap. Code execution runs server-side, so there's no client-side sandbox to manage. ## Coding agent: text\_editor + bash @@ -69,7 +69,7 @@ Memory is orthogonal to your other tools. It doesn't change how they behave; it ## All-in-one: computer\_use -The computer use tool subsumes most others by operating a full desktop. Claude sees screenshots and issues mouse and keyboard actions, which means it can drive any application a human can. Use this when the task requires arbitrary GUI interaction that more specific tools can't reach: legacy software without an API, visual verification steps, or workflows that span multiple desktop apps. +The computer use tool subsumes most others by operating a full desktop. Claude receives screenshots and issues mouse and keyboard actions, which means it can drive any application a human can. Use this when the task requires arbitrary GUI interaction that more specific tools can't reach: legacy software without an API, visual verification steps, or workflows that span multiple desktop apps. ```json { @@ -83,7 +83,7 @@ Computer use is the most general option and also the slowest, because Claude typ ## Browser agent: browser\_use -When the whole task happens inside webpages (filling forms, reading page content, working across tabs), the browser use tool is a closer fit than computer use. Your application drives a browser it controls and returns screenshots or page state; Claude calls page-aware member tools such as `read_page`, `find`, `form_input`, and `get_page_text` alongside clicks and typing, so it can act on element references in addition to pixel coordinates. +When the whole task occurs inside webpages (filling forms, reading page content, working across tabs), the browser use tool is a closer fit than computer use. Your application drives a browser it controls and returns screenshots or page state; Claude calls page-aware member tools such as `read_page`, `find`, `form_input`, and `get_page_text` alongside clicks and typing, so it can act on element references in addition to pixel coordinates. ```json { diff --git a/content/en/agents-and-tools/tool-use/tool-reference.md b/content/en/agents-and-tools/tool-use/tool-reference.md index 9a1110c6db..35ba3c77e2 100644 --- a/content/en/agents-and-tools/tool-use/tool-reference.md +++ b/content/en/agents-and-tools/tool-use/tool-reference.md @@ -8,7 +8,7 @@ This page is a reference for the tools Anthropic provides and the optional prope ## Anthropic-provided tools -Anthropic provides two kinds of tools: **server tools** that execute on Anthropic's infrastructure, and **client tools** where Anthropic defines the schema but your application handles execution. Both kinds appear in your request's `tools` array alongside any user-defined tools. +Anthropic provides two kinds of tools: **server tools** that run on Anthropic's infrastructure, and **client tools** where Anthropic defines the schema but your application handles execution. Both kinds appear in your request's `tools` array alongside any user-defined tools. | Tool | `type` | Execution | [Beta header](https://platform.claude.com/docs/en/api/beta-headers) | | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------- | @@ -46,7 +46,7 @@ The `mcp_toolset` type is not date-versioned; versioning is carried in the `anth ### Client toolsets -The [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) are Anthropic-defined client toolsets: one entry in `tools` declares a fixed set of member tools whose names, descriptions, and input schemas Anthropic defines, and your application executes every call. The entry takes no `name`, because the dated `type` fixes the member names. `configs`, `cache_control`, and `allowed_callers` (which accepts only `["direct"]`) are optional. +The [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) are Anthropic-defined client toolsets: one entry in `tools` declares a fixed set of member tools whose names, descriptions, and input schemas Anthropic defines, and your application runs every call. The entry takes no `name`, because the dated `type` fixes the member names. `configs`, `cache_control`, and `allowed_callers` (which accepts only `["direct"]`) are optional. Client toolsets are Messages API tools. They aren't currently available as agent tools in [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/tools), which provides its own built-in agent toolset, MCP toolsets, and custom tools. @@ -65,18 +65,18 @@ Client toolsets are Messages API tools. They aren't currently available as agent * Keys are member names, and each value accepts only `enabled` and `defer_loading`. * A member you omit keeps its defaults. An absent value, `{}`, and a restated default are equivalent. * An unknown member name or any other field in a member's value is rejected, as is a `configs` that disables every member (omit the entry instead). -* A disabled member is removed from the tools Claude sees. If Claude still names it, return an error `tool_result`. +* A disabled member is removed from the tools Claude receives. If Claude still names it, return an error `tool_result`. -Set `defer_loading` per member, never on the entry, and give every enabled member the same value: under [tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#deferred-tool-loading) the toolset loads and expands as one definition. When every enabled member defers, only a [tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) that isn't itself deferred can surface the toolset, so declare one in the same request. Don't put `cache_control` on a toolset entry whose members defer; set the breakpoint on a non-deferred tool instead, because deferred definitions are not part of the cached prefix. +Set `defer_loading` for each member, never on the entry, and give every enabled member the same value: under [tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#deferred-tool-loading) the toolset loads and expands as one definition. When every enabled member defers, only a [tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) that isn't itself deferred can surface the toolset, so declare one in the same request. Don't put `cache_control` on a toolset entry whose members defer; set the breakpoint on a non-deferred tool instead, because deferred definitions are not part of the cached prefix. `cache_control` goes on the entry only; to learn where the breakpoint lands, including markers inside a batch action, see [Tool use with prompt caching](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-use-with-prompt-caching#cache-control-on-tool-definitions). -**Handle member tool calls.** Claude calls a member with a `tool_use` block whose `name` is the member name and whose `toolset_name` is `computer` or `browser`; `input` holds that member's parameters and no `action` field. Dispatch on the `toolset_name` and `name` pair, because a custom tool may share a member's name and the two toolsets share names such as `screenshot`. Only member results echo `toolset_name`. Several member calls in one turn form a batch action that you run in order ([computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions)). New members arrive only with a new dated `type`. +**Handle member tool calls.** Claude calls a member with a `tool_use` block whose `name` is the member name and whose `toolset_name` is `computer` or `browser`; `input` holds that member's parameters and no `action` field. Dispatch on the `toolset_name` and `name` pair, because a custom tool might share a member's name and the two toolsets share names such as `screenshot`. Only member results echo `toolset_name`. Several member calls in one turn form a batch action that you run in order ([computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#batch-actions)). New members arrive only with a new dated `type`. **Not supported on toolset entries.** The API rejects each of these with an `invalid_request_error`: * `strict: true` or `input_examples`. -* `defer_loading` on the entry, or enabled members whose `defer_loading` values differ (set it per member in `configs`, all to the same value). +* `defer_loading` on the entry, or enabled members whose `defer_loading` values differ (set it for each member in `configs`, all to the same value). * A code execution caller in `allowed_callers` (no [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling)). * The legacy `fine-grained-tool-streaming-2025-05-14` beta header. When you stream, each member's `input` arrives as one complete `input_json_delta`. * A `tool_choice` of type `tool` that names the toolset or a member (use `auto`, `any`, or `none`). diff --git a/content/en/agents-and-tools/tool-use/tool-runner.md b/content/en/agents-and-tools/tool-use/tool-runner.md index 53edc1b53f..f7d75a3628 100644 --- a/content/en/agents-and-tools/tool-use/tool-runner.md +++ b/content/en/agents-and-tools/tool-use/tool-runner.md @@ -83,7 +83,7 @@ Depending on the SDK's tool signature, a tool returns its result as a string or TypeScript offers two approaches for defining tools: - **Using Zod (recommended)** - Use `betaZodTool()` for type-safe tool definitions with Zod validation (requires Zod 3.25.0 or higher): + **Using Zod (recommended):** Use `betaZodTool()` for type-safe tool definitions with Zod validation (requires Zod 3.25.0 or higher): ```typescript import Anthropic from "@anthropic-ai/sdk"; @@ -118,7 +118,7 @@ Depending on the SDK's tool signature, a tool returns its result as a string or } ``` - **Using JSON Schema** - Use `betaTool()` for type-safe tool definitions without Zod: + **Using JSON Schema:** Use `betaTool()` for type-safe tool definitions without Zod: The input generated by Claude is not validated at runtime. Perform validation inside the `run` function if needed. @@ -171,7 +171,6 @@ Depending on the SDK's tool signature, a tool returns its result as a string or using Anthropic.Models.Beta.Messages; using MessageCreateParams = Anthropic.Models.Beta.Messages.MessageCreateParams; using InputSchema = Anthropic.Models.Beta.Messages.InputSchema; - using Role = Anthropic.Models.Beta.Messages.Role; using Model = Anthropic.Models.Messages.Model; var client = new AnthropicClient(); @@ -235,9 +234,8 @@ Depending on the SDK's tool signature, a tool returns its result as a string or MaxTokens = 1024, Messages = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "What's the weather like in Paris? Also, what's 15 + 27?", }, ], @@ -651,14 +649,7 @@ If you don't need intermediate messages, you can get the final message directly: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new() - { - Role = Role.User, - Content = "What's the weather like in Paris?", - }, - ], + Messages = [new BetaUserMessageParam { Content = "What's the weather like in Paris?" }], }, [getWeatherTool] ); @@ -823,7 +814,7 @@ By default, the runner manages conversation state for you: after each tool-call You take over by modifying the runner's messages from inside the loop body. The exact method depends on the SDK. See the per-language tabs that follow. -When you take over for an iteration, the runner does not append the assistant message or tool results from that turn. You become responsible for keeping the conversation valid: append the assistant message and a tool result yourself (if you want the turn to count), modify state conditionally so the loop can still exit when there are no tool calls, and pass `max_iterations` (csharp, java, php: `maxIterations`; go: `MaxIterations`) to bound the loop. All seven SDKs support `max_iterations` (csharp, java, php: `maxIterations`; go: `MaxIterations`). +When you take over for an iteration, the runner does not append the assistant message or tool results from that turn. You become responsible for keeping the conversation valid: append the assistant message and a tool result yourself (if you want the turn to count), modify state conditionally so the loop can still exit when there are no tool calls, and pass `max_iterations` (csharp, java, php: `maxIterations`; go: `MaxIterations`) to bound the loop. The SDK supports `max_iterations` (csharp, java, php: `maxIterations`; go: `MaxIterations`). @@ -909,7 +900,7 @@ When you take over for an iteration, the runner does not append the assistant me { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "What's the weather in San Francisco?" }], + Messages = [new BetaUserMessageParam { Content = "What's the weather in San Francisco?" }], }, [getWeatherTool], maxIterations: 10 @@ -936,21 +927,16 @@ When you take over for an iteration, the runner does not append the assistant me // PushMessages() flags state as modified; the runner skips its auto-append. // Supply the assistant turn and the tool result yourself, then add a follow-up. runner.PushMessages( - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, - Content = new BetaMessageParamContent( + Content = new BetaMessageContentParam( JsonSerializer.SerializeToElement( message.Content.Select(block => block.Json).ToArray() ) ), }, - new() - { - Role = Role.User, - Content = new List { toolResult }, - }, - new() { Role = Role.User, Content = "Please be concise in your response." } + new BetaUserMessageParam { Content = new List { toolResult } }, + new BetaUserMessageParam { Content = "Please be concise in your response." } ); } ``` @@ -993,7 +979,7 @@ When you take over for an iteration, the runner does not append the assistant me - Use `runner.params()` to read the current parameters and `runner.setNextParams()` to replace them for the next iteration. When you call `setNextParams()` inside the loop, the runner skips its automatic append. The just-yielded message is discarded, and the next iteration sends your new params unchanged. + Use `runner.params()` to read the current parameters and `runner.setNextParams()` to replace them for the next iteration. When you call `setNextParams()` inside the loop, the runner skips its automatic append. The just-yielded message is discarded, and the next iteration sends your new parameters unchanged. The following example retries a turn that hit the token limit by doubling `max_tokens`. Mutating only on the `max_tokens` branch keeps the loop converging: turns that complete normally fall through, and the runner auto-appends and exits when there are no more tool calls. @@ -1128,7 +1114,7 @@ The Go, Ruby, C#, and PHP SDKs don't read `ANTHROPIC_LOG`. Outside Python, no SD ### Intercepting tool errors -By default, tool errors are passed back to Claude, which can then respond appropriately. However, you might want to detect errors and handle them differently, for example, to stop execution early or implement custom error handling. +By default, the tool runner passes tool errors back to Claude, which can then respond appropriately. However, you might want to detect errors and handle them differently, for example, to stop execution early or implement custom error handling. @@ -1254,10 +1240,7 @@ By default, tool errors are passed back to Claude, which can then respond approp { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new() { Role = Role.User, Content = "What's the weather in San Francisco?" }, - ], + Messages = [new BetaUserMessageParam { Content = "What's the weather in San Francisco?" }], }, [getWeatherTool] ); @@ -1655,10 +1638,7 @@ Enable streaming to process each turn's response incrementally. Each iteration y { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new() { Role = Role.User, Content = "What is 15 + 27?" }, - ], + Messages = [new BetaUserMessageParam { Content = "What is 15 + 27?" }], }, [calculateSumTool] ); @@ -1725,7 +1705,7 @@ Enable streaming to process each turn's response incrementally. Each iteration y - Call `runner.streaming()` to get a stream for each turn. Each `StreamResponse` must be closed after use. + Call `runner.streaming()` to get a stream for each turn. Close each `StreamResponse` after use. ```java void main() { diff --git a/content/en/agents-and-tools/tool-use/tool-search-tool.md b/content/en/agents-and-tools/tool-use/tool-search-tool.md index 889c5bdeab..11ef0e0af4 100644 --- a/content/en/agents-and-tools/tool-use/tool-search-tool.md +++ b/content/en/agents-and-tools/tool-use/tool-search-tool.md @@ -73,7 +73,7 @@ When you enable the tool search tool: 2. You provide every tool definition in the `tools` array and set `defer_loading: true` on the tools that shouldn't load up front. At least one tool, normally the tool search tool itself, must stay non-deferred. 3. Initially, Claude's context contains only the tool search tool and any non-deferred tools. 4. When Claude needs additional tools, it searches using a tool search tool. -5. The API runs the search and returns the matching tools as `tool_reference` blocks (up to 5 by default; Claude can set a `limit` in its search input). +5. The API runs the search and returns the matching tools as `tool_reference` blocks (up to 5 by default, although Claude can set a `limit` in its search input). 6. The API automatically expands these references into full tool definitions. 7. Claude selects from the discovered tools and calls them. @@ -278,12 +278,7 @@ The following example includes the tool search tool and two deferred tools: { Model = Model.ClaudeOpus5_5, MaxTokens = 2048, - Messages = [ - new() { - Role = Role.User, - Content = "What is the weather in San Francisco?" - } - ], + Messages = [new UserMessageParam { Content = "What is the weather in San Francisco?" }], Tools = [ new ToolUnion(new ToolSearchToolRegex20251119 { @@ -533,7 +528,7 @@ The following example includes the tool search tool and two deferred tools: ``` -Claude searches the catalog, discovers `get_weather`, and calls it. The response ends with `stop_reason: "tool_use"`. Execute the discovered tool and return a `tool_result` as in [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). [Response format](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#response-format) shows the blocks you get back and what to send next. +Claude searches the catalog, discovers `get_weather`, and calls it. The response ends with `stop_reason: "tool_use"`. Run the discovered tool and return a `tool_result` as in [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls). [Response format](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#response-format) shows the blocks you get back and what to send next. ## Tool definition @@ -599,7 +594,7 @@ Mark tools for on-demand loading by adding `defer_loading: true`: * Never set `defer_loading: true` on the tool search tool itself. * Keep your 3–5 most frequently used tools non-deferred so Claude can call them without searching first. -The computer use and browser use toolsets (`computer_toolset_20260801` and `browser_toolset_20260801`) take `defer_loading` per member tool inside the entry's `configs` object, not on the entry itself; a request that sets it at the entry level is rejected. Because a toolset defers and expands as a unit, `defer_loading` must resolve to the same value on every enabled member, and when Claude discovers the toolset through search, every enabled member loads at once. See [Client toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets) for the `configs` format. +The computer use and browser use toolsets (`computer_toolset_20260801` and `browser_toolset_20260801`) take `defer_loading` for each member tool inside the entry's `configs` object, not on the entry itself; a request that sets it at the entry level is rejected. Because a toolset defers and expands as a unit, `defer_loading` must resolve to the same value on every enabled member, and when Claude discovers the toolset through search, every enabled member loads at once. See [Client toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference#client-toolsets) for the `configs` format. Both tool search variants (`regex` and `bm25`) search tool names, descriptions, argument names, and argument descriptions. @@ -651,10 +646,10 @@ When Claude uses the tool search tool, the response includes the following block ### Understanding the response -* **`server_tool_use`:** Claude's call to the tool search tool. The search runs on Anthropic's servers. Never return a `tool_result` for its `srvtoolu_...` ID. The `input` holds the search (`pattern` for the regex variant, `query` for BM25) and may include an optional `limit`, an integer from 1 to 10,000 that caps how many matching tools the search returns (default: 5). +* **`server_tool_use`:** Claude's call to the tool search tool. The search runs on Anthropic's servers. Never return a `tool_result` for its `srvtoolu_...` ID. The `input` holds the search (`pattern` for the regex variant, `query` for BM25) and might include an optional `limit`, an integer from 1 to 10,000 that caps how many matching tools the search returns (default: 5). * **`tool_search_tool_result`:** the search results, in a nested `tool_search_tool_search_result` object. Keep it in the message history as is. * **`tool_references`:** an array of `tool_reference` objects pointing to discovered tools. The API expands these for Claude. You never expand them yourself. -* **`tool_use`:** Claude's call to a discovered tool. Execute it and return a `tool_result` exactly as in standard tool use. +* **`tool_use`:** Claude's call to a discovered tool. Run it and return a `tool_result` exactly as in standard tool use. The API automatically expands `tool_reference` blocks into full tool definitions before showing them to Claude. You don't need to handle this expansion yourself, as long as you provide all matching tool definitions in the `tools` parameter. @@ -823,7 +818,7 @@ You can include the tool search tool in the [Messages Batches API](https://platf ### Limits -* **Maximum deferred tools:** 10,000 tools with `defer_loading: true` per request +* **Maximum deferred tools:** 10,000 tools with `defer_loading: true` for each request * **Search results:** each search returns up to 5 matching tools by default; Claude can set `limit` in its search input to any integer from 1 to 10,000 * **Pattern and query length:** maximum 200 characters for regex patterns and 500 characters for BM25 queries * **Model support:** see [Model compatibility](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool#model-compatibility) diff --git a/content/en/agents-and-tools/tool-use/tool-use-with-prompt-caching.md b/content/en/agents-and-tools/tool-use/tool-use-with-prompt-caching.md index 780b737cd3..d05e23ad0b 100644 --- a/content/en/agents-and-tools/tool-use/tool-use-with-prompt-caching.md +++ b/content/en/agents-and-tools/tool-use/tool-use-with-prompt-caching.md @@ -42,7 +42,7 @@ Place `cache_control: {"type": "ephemeral"}` on the last tool in your `tools` ar For `mcp_toolset`, the `cache_control` breakpoint lands on the last tool in the set. You don't control tool order within an MCP toolset, so place the breakpoint on the `mcp_toolset` entry itself and the API applies it to the final expanded tool. -The [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) toolset entries follow the same rule: place `cache_control` on the toolset entry itself, and the breakpoint lands after the toolset's definition. It isn't accepted inside a member's `configs` entry, because the toolset's members load as one definition. Within a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), a `cache_control` marker on any of the turn's member `tool_use` or `tool_result` blocks is accepted and takes effect at the end of that batch, so several markers in one batch act as a single breakpoint. Each marker still counts toward the request's limit of [four breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#when-to-use-multiple-breakpoints), so use one per turn. +The [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) toolset entries follow the same rule: place `cache_control` on the toolset entry itself, and the breakpoint lands after the toolset's definition. It isn't accepted inside a member's `configs` entry, because the toolset's members load as one definition. Within a [batch action](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#batch-actions), a `cache_control` marker on any of the turn's member `tool_use` or `tool_result` blocks is accepted and takes effect at the end of that batch, so several markers in one batch act as a single breakpoint. Each marker still counts toward the request's limit of [four breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#when-to-use-multiple-breakpoints), so use one for each turn. ## defer\_loading and cache preservation @@ -74,7 +74,7 @@ The cache follows a prefix hierarchy (`tools` → `system` → `messages`), so a When your request has prompt caching enabled and Claude uses a [server tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) such as web search, web fetch, or code execution, the API automatically places a cache breakpoint on the server tool result before running the next iteration of the agentic loop. This lets later iterations within the same request read the growing prefix from cache instead of reprocessing it. -This automatic breakpoint always uses the default 5-minute TTL, independent of any TTL you set on your own `cache_control` markers. In the response `usage`, these writes appear under `cache_creation.ephemeral_5m_input_tokens`, so you may see 5-minute cache writes even when every `cache_control` you set uses a 1-hour TTL. +This automatic breakpoint always uses the default 5-minute TTL, independent of any TTL you set on your own `cache_control` markers. In the response `usage`, these writes appear under `cache_creation.ephemeral_5m_input_tokens`, so you might see 5-minute cache writes even when every `cache_control` you set uses a 1-hour TTL. This behavior only applies when your request already has at least one `cache_control` marker. Requests without prompt caching do not receive the automatic breakpoint. diff --git a/content/en/agents-and-tools/tool-use/troubleshooting-tool-use.md b/content/en/agents-and-tools/tool-use/troubleshooting-tool-use.md index 3540ede4aa..7fa25eb877 100644 --- a/content/en/agents-and-tools/tool-use/troubleshooting-tool-use.md +++ b/content/en/agents-and-tools/tool-use/troubleshooting-tool-use.md @@ -11,7 +11,7 @@ Symptom-to-fix tables for the most common tool-use errors. Each fix cross-refere | Symptom | Likely cause | Fix | | ------------------------------------------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Claude calls tool A when you wanted tool B | Description ambiguity | Sharpen descriptions. Differentiate tools by WHEN to use them, not only WHAT they do. See [Define tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools). | -| Claude never calls your tool | Tool name collision or overly-generic schema | Check for duplicate names across your tool list. Add `input_examples` to make the intended use concrete. | +| Claude never calls your tool | Tool name collision or overly generic schema | Check for duplicate names across your tool list. Add `input_examples` to make the intended use concrete. | | Claude calls with wrong parameter types | Model guessing at ambiguous schema | Add `strict: true` (if your schema is in the supported subset) or add `input_examples`. | ## Claude invents tool parameters @@ -26,7 +26,7 @@ Symptom-to-fix tables for the most common tool-use errors. Each fix cross-refere | Symptom | Likely cause | Fix | | ------------------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Claude calls tools sequentially when parallel would be better | Message history formatting | Send multiple `tool_result` blocks in ONE user message, not one per turn. See [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use). | -| `disable_parallel_tool_use` seems ignored | Set too late in the conversation | Must be set on the request that returns `tool_use`. Setting it on a later request has no effect on earlier tool calls. | +| `disable_parallel_tool_use` seems ignored | Set too late in the conversation | Set it on the request that returns `tool_use`. Setting it on a later request has no effect on earlier tool calls. | ## Cache keeps invalidating @@ -39,8 +39,8 @@ Symptom-to-fix tables for the most common tool-use errors. Each fix cross-refere | Error | Cause | Fix | | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `tool_use ids were found without tool_result blocks immediately after` | Missing `tool_result` for some `tool_use` ids, or `tool_result` is not the first content block in the user message | Return one `tool_result` for every `tool_use` block in the assistant response. Put `tool_result` blocks before any text. See [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) and [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use). | -| `was found without a corresponding _tool_result block` | The previous assistant turn has a `server_tool_use` block with no result block (most often, Claude called it alongside a client tool), and either your next user message ended that turn (for example, with text after the `tool_result` blocks) or the resume request no longer defines that server tool (the message then ends with `but no tool was provided`) | Send a user message containing only the `tool_result` blocks for the client `tool_use` ids and keep the same `tools` array. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use). | +| `tool_use ids were found without tool_result blocks immediately after` | Missing `tool_result` for some `tool_use` IDs, or `tool_result` is not the first content block in the user message | Return one `tool_result` for every `tool_use` block in the assistant response. Put `tool_result` blocks before any text. See [Handle tool calls](https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls) and [Parallel tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use). | +| `was found without a corresponding _tool_result block` | The previous assistant turn has a `server_tool_use` block with no result block (most often, Claude called it alongside a client tool), and either your next user message ended that turn (for example, with text after the `tool_result` blocks) or the resume request no longer defines that server tool (the message then ends with `but no tool was provided`) | Send a user message containing only the `tool_result` blocks for the client `tool_use` IDs and keep the same `tools` array. See [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use). | | `Unsupported regex feature in pattern field: ...` | A `pattern` in a strict tool's `input_schema` uses a regex feature that strict mode can't compile, such as a backreference, a lookaround, a word boundary, or a large `{n,m}` range | Simplify the pattern. Anchored patterns with basic quantifiers, character classes, and groups are supported; see [JSON Schema limitations](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#json-schema-limitations). | | `All tools have defer_loading: true` | No tools visible to the model | At least one tool must be immediately loaded. The tool search tool itself must never have `defer_loading: true`. | @@ -70,7 +70,7 @@ See [Thinking blocks cannot be modified](https://platform.claude.com/docs/en/api - Execute tools and return results in the required message format. + Run tools and return results in the required message format. diff --git a/content/en/agents-and-tools/tool-use/web-fetch-tool.md b/content/en/agents-and-tools/tool-use/web-fetch-tool.md index 5b796e5a4e..30407eefae 100644 --- a/content/en/agents-and-tools/tool-use/web-fetch-tool.md +++ b/content/en/agents-and-tools/tool-use/web-fetch-tool.md @@ -8,7 +8,7 @@ description: Fetch and read content from specific URLs to augment Claude's conte To learn how zero data retention (ZDR) applies to this feature, see [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention). -The web fetch tool allows Claude to retrieve full content from specified web pages and PDF documents. +The web fetch tool allows Claude to retrieve full content from specified webpages and PDF documents. The latest web fetch tool version (`web_fetch_20260318`) supports **dynamic filtering**: Claude can write and execute code to filter fetched content before it reaches the context window, keeping only relevant information and discarding the rest. This reduces token consumption while maintaining response quality. Dynamic filtering is available with Claude 4.6 and later models and [Claude Mythos Preview](https://anthropic.com/glasswing). `web_fetch_20260318` also adds [response inclusion](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#response-inclusion) control for agentic workflows. The previous versions (`web_fetch_20260309` for dynamic filtering and [cache bypass](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#cache-bypass), `web_fetch_20260209` for dynamic filtering only, `web_fetch_20250910` for basic fetch) remain available. @@ -67,12 +67,12 @@ Claude does **not** fetch for general-knowledge or open-ended questions that don ### Dynamic filtering -Fetching full web pages and PDFs can quickly consume tokens, especially when only specific information is needed from large documents. With `web_fetch_20260209` or later, Claude can write and execute code to filter the fetched content before loading it into context. +Fetching full webpages and PDFs can quickly consume tokens, especially when only specific information is needed from large documents. With `web_fetch_20260209` or later, Claude can write and run code to filter the fetched content before loading it into context. This dynamic filtering is particularly useful for: * Extracting specific sections from long documents -* Processing structured data from web pages +* Processing structured data from webpages * Filtering relevant information from PDFs * Reducing token costs when working with large documents @@ -162,7 +162,7 @@ To enable dynamic filtering, use `web_fetch_20260209` or any later version. The { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Fetch the content at https://example.com/research-paper and extract the key findings." }], + Messages = [new UserMessageParam { Content = "Fetch the content at https://example.com/research-paper and extract the key findings." }], Tools = [new ToolUnion(new WebFetchTool20260318())] }; @@ -325,7 +325,7 @@ Provide the web fetch tool in your API request: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Please analyze the content at https://example.com/article" }], + Messages = [new UserMessageParam { Content = "Please analyze the content at https://example.com/article" }], Tools = [new ToolUnion(new WebFetchTool20250910() { MaxUses = 5 })] }; @@ -508,7 +508,7 @@ The `response_inclusion` parameter controls how fetch result blocks appear in th ### Citations -Unlike web search where citations are always enabled, citations are optional for web fetch and disabled by default. Set `"citations": {"enabled": true}` to enable Claude to cite specific passages from fetched documents. +Unlike web search, where citations are always enabled, citations are optional for web fetch and disabled by default. Set `"citations": {"enabled": true}` to allow Claude to cite specific passages from fetched documents. When displaying API outputs directly to end users, include citations to the original source. If you are making modifications to API outputs, including by reprocessing or combining them with your own material before displaying them to end users, display citations as appropriate based on consultation with your legal team. @@ -597,7 +597,7 @@ Fetch results include: * `retrieved_at`: Timestamp when the content was retrieved - The web fetch tool caches results to improve performance and reduce redundant requests. The content returned may not always reflect the latest version available at the URL. The cache behavior is managed automatically and may change over time to optimize for different content types and usage patterns. To fetch fresh content, set `"use_cache": false` (see [Cache bypass](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#cache-bypass)). + The web fetch tool caches results to improve performance and reduce redundant requests. The content returned might not always reflect the latest version available at the URL. The cache behavior is managed automatically and may change over time to optimize for different content types and usage patterns. To fetch fresh content, set `"use_cache": false` (see [Cache bypass](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#cache-bypass)). For PDF documents, content is returned as base64-encoded data: @@ -625,7 +625,7 @@ For PDF documents, content is returned as base64-encoded data: ### Errors -When the web fetch tool encounters an error, the Claude API returns a 200 (success) response with the error represented in the response body. Claude sees the error result and continues the turn. For example: +When the web fetch tool encounters an error, the Claude API returns a 200 (success) response with the error represented in the response body. Claude receives the error result and continues the turn. For example: ```json Output { @@ -668,7 +668,7 @@ The tool also refuses a URL that appears to contain a credential, such as an API Works with `web_fetch_20250910`, `web_fetch_20260209`, `web_fetch_20260309`, and `web_fetch_20260318`. -The optional `url_sources` parameter lets you turn off any of the three allowed sources, or limit tool results to certain tools. It has one key per source, and each key defaults to `{"type": "all"}`: +The optional `url_sources` parameter lets you turn off any of the three allowed sources, or limit tool results to certain tools. It has one key for each source, and every key defaults to `{"type": "all"}`: * `user_input`: URLs in user messages. Its `type` is `"all"` or `"none"`. * `client_tool_results`: URLs in client-side tool results. Its `type` is `"all"`, `"none"`, or an `"only"` or `"except"` filter that names tools, as in the following example. @@ -823,7 +823,7 @@ When both the web search and web fetch tools are enabled, and the user names a s { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Find recent articles about quantum computing and analyze the most relevant one in detail" }], + Messages = [new UserMessageParam { Content = "Find recent articles about quantum computing and analyze the most relevant one in detail" }], Tools = [ new ToolUnion(new WebSearchTool20250305() { MaxUses = 3 }), new ToolUnion(new WebFetchTool20250910() { MaxUses = 5, Citations = new() { Enabled = true } }) @@ -970,7 +970,7 @@ data: {"type": "content_block_start", "index": 1, "content_block": {"type": "ser event: content_block_delta data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"url\":\"https://example.com/article\"}"}} -// Pause while fetch executes +// Pause while fetch runs // Fetch results streamed event: content_block_start @@ -1007,7 +1007,7 @@ To protect against inadvertently fetching large content that would consume exces Example token usage for typical content: -* Average web page (10 kB): \~2,500 tokens +* Average webpage (10 kB): \~2,500 tokens * Large documentation page (100 kB): \~25,000 tokens * Research paper PDF (500 kB): \~125,000 tokens @@ -1015,11 +1015,11 @@ Example token usage for typical content: - Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. + Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. - Work with Anthropic-executed tools: server\_tool\_use blocks, pause\_turn continuation, and domain filtering. + Work with tools that Anthropic runs: `server_tool_use` blocks, `pause_turn` continuation, and domain filtering. diff --git a/content/en/agents-and-tools/tool-use/web-search-tool.md b/content/en/agents-and-tools/tool-use/web-search-tool.md index ddd68fe374..d7c63f8e28 100644 --- a/content/en/agents-and-tools/tool-use/web-search-tool.md +++ b/content/en/agents-and-tools/tool-use/web-search-tool.md @@ -150,7 +150,7 @@ The following examples use `web_search_20260318`: { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Search for the current prices of AAPL and GOOGL, then calculate which has a better P/E ratio." }], + Messages = [new UserMessageParam { Content = "Search for the current prices of AAPL and GOOGL, then calculate which has a better P/E ratio." }], Tools = [new ToolUnion(new WebSearchTool20260318())] }; @@ -219,7 +219,7 @@ The following examples use `web_search_20260318`: client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: [ { role: "user", content: "Search for the current prices of AAPL and GOOGL, then calculate which has a better P/E ratio." } @@ -317,7 +317,7 @@ Provide the web search tool in your API request: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "What's the weather in NYC?" }], + Messages = [new UserMessageParam { Content = "What's the weather in NYC?" }], Tools = [new ToolUnion(new WebSearchTool20250305() { MaxUses = 5 })] }; @@ -391,7 +391,7 @@ Provide the web search tool in your API request: client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { role: "user", content: "What's the weather in NYC?" } @@ -436,7 +436,7 @@ The web search tool supports the following parameters: } ``` -All web search tool versions accept `allowed_callers`, which controls whether Claude calls web search directly or from code execution through [dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering). On `web_search_20260209` and later it defaults to `["code_execution_20260120"]` instead of `["direct"]`. See [Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools#zdr-and-allowed-callers) for how to configure it. `web_search_20260318` and later also accept [`response_inclusion`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#response-inclusion). +All web search tool versions accept `allowed_callers`, which controls whether Claude calls web search directly or from code execution through [dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering). On `web_search_20260209` and later it defaults to `["code_execution_20260120"]` instead of `["direct"]`. See [ZDR and allowed\_callers](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools#zdr-and-allowed-callers) for how to configure it. `web_search_20260318` and later also accept [`response_inclusion`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#response-inclusion). ### Max uses @@ -460,7 +460,7 @@ The `user_location` parameter allows you to localize search results based on a u * `city`: The city name * `region`: The region or state * `country`: The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code. The API rejects unsupported country codes with a 400 error. -* `timezone`: The [IANA timezone ID](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +* `timezone`: The [IANA time zone ID](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). On Claude Managed Agents, the `web_search` entry of the agent toolset accepts a `user_location` object with the same fields. The API rejects an unsupported `country` code with a 400 error when you create or update the agent, or when you create or update a session that supplies the setting. See the [web tool settings](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#settings). @@ -551,7 +551,7 @@ Here's an example response structure: } ``` -This example shows a direct search. When a search runs through [dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering), the response also contains the [code execution tool's](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) result blocks, and each nested `server_tool_use` and `web_search_tool_result` pair carries a `caller` field identifying the code execution call that made it. +This example shows a direct search. When a search runs through [dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering), the response also contains the result blocks of the [code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool), and each nested `server_tool_use` and `web_search_tool_result` pair carries a `caller` field identifying the code execution call that made it. ### Search results @@ -619,7 +619,7 @@ To cache tool definitions across turns, see [Tool use with prompt caching](https ## Streaming -With streaming enabled, you'll receive search events as part of the stream. There will be a pause while the search runs: +With streaming enabled, you'll receive search events as part of the stream. There is a pause while the search runs: ```sse Output event: message_start @@ -637,7 +637,7 @@ data: {"type": "content_block_start", "index": 1, "content_block": {"type": "ser event: content_block_delta data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"query\":\"latest quantum computing breakthroughs 2025\"}"}} -// Pause while search executes +// Pause while search runs // Search results streamed event: content_block_start @@ -650,7 +650,7 @@ data: {"type": "content_block_start", "index": 2, "content_block": {"type": "web You can include the web search tool in the [Messages Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing). Web search tool calls through the Messages Batches API are priced the same as those in regular Messages API requests. -To protect shared capacity, the Batches API throttles web search requests per organization, so large batches with many searches might take longer to complete. You can see your organization's web search rate limit on the [Rate limits](https://platform.claude.com/usage/limits) page in the Claude Console. To request a higher limit, contact sales from that page. +To protect shared capacity, the Batches API throttles web search requests for each organization, so large batches with many searches might take longer to complete. You can see your organization's web search rate limit on the [Rate limits](https://platform.claude.com/usage/limits) page in the Claude Console. To request a higher limit, contact sales from that page. ## Usage and pricing @@ -670,7 +670,7 @@ Web search usage is charged in addition to token usage: } ``` -Web search is available on the Claude API for **$10 per 1,000 searches**, plus standard token costs for search-generated content. Web search results retrieved throughout a conversation are counted as input tokens, in search iterations executed during a single turn and in subsequent conversation turns. +Web search is available on the Claude API for **$10 USD per 1,000 searches**, plus standard token costs for search-generated content. Web search results retrieved throughout a conversation are counted as input tokens, in search iterations executed during a single turn and in subsequent conversation turns. Each web search counts as one use, regardless of the number of results returned. If an error occurs during web search, the web search will not be billed. @@ -682,7 +682,7 @@ Each web search counts as one use, regardless of the number of results returned. - Work with Anthropic-executed tools: server\_tool\_use blocks, pause\_turn continuation, and domain filtering. + Work with tools that Anthropic runs: `server_tool_use` blocks, `pause_turn` continuation, and domain filtering. diff --git a/content/en/api/beta-headers.md b/content/en/api/beta-headers.md index fcf1875859..d5372d3e09 100644 --- a/content/en/api/beta-headers.md +++ b/content/en/api/beta-headers.md @@ -22,9 +22,9 @@ anthropic-beta: BETA_FEATURE_NAME content-type: application/json ``` -Each feature's documentation states the exact beta name to send. The [API overview](https://platform.claude.com/docs/en/api/overview) lists the APIs currently in beta. +Each feature's documentation states the exact beta name to send. The [API overview](https://platform.claude.com/docs/en/api/overview) lists the APIs in beta. -The following examples show the same request with cURL, the `ant` CLI, and the SDK, using the [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) beta as the example. The SDK takes beta names through `betas` (csharp, go: `Betas`; java: `.addBeta()`) and sends the `anthropic-beta` header for you: +The following example sends a request with the [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) beta. The SDK takes beta names through `betas` (csharp, go: `Betas`; java: `.addBeta()`) and sends the `anthropic-beta` header for you: ```bash cURL @@ -84,7 +84,7 @@ The following examples show the same request with cURL, the `ant` CLI, and the S { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], Betas = ["context-management-2025-06-27"], } ); @@ -141,7 +141,7 @@ The following examples show the same request with cURL, the `ant` CLI, and the S client = Anthropic::Client.new message = client.beta.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], betas: ["context-management-2025-06-27"] @@ -185,7 +185,7 @@ Beta names are the same on every platform that accepts them, but not every platf On Amazon Bedrock, where beta names go depends on the API you call: * [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock) (`bedrock-mantle` endpoints) takes them in the `anthropic-beta` header. -* The [InvokeModel API](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy) reads them from the request body, not from a header. List them in the body's `anthropic_beta` array, one name per element, for example `"anthropic_beta": ["feature1", "feature2"]`. +* The [InvokeModel API](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy) reads them from the request body, not from a header. List them in the body's `anthropic_beta` array, one name for each element, for example `"anthropic_beta": ["feature1", "feature2"]`. ### Endpoint-specific headers @@ -232,6 +232,6 @@ For updates to beta features, see the [release notes](https://platform.claude.co - Explore the Claude API's features, including the APIs currently in beta. + Explore the Claude API's features, including the APIs in beta. diff --git a/content/en/api/claude-code/routines-fire.md b/content/en/api/claude-code/routines-fire.md index 1b9d93a7a2..489c8dabba 100644 --- a/content/en/api/claude-code/routines-fire.md +++ b/content/en/api/claude-code/routines-fire.md @@ -27,7 +27,7 @@ The routine fire endpoint belongs to the Claude Code product surface, which diff | Path namespace | `/v1/claude_code/...` | `/v1/...` | | Stability | Experimental | Stable or standard beta | -## Before you begin +## Before you start To call this endpoint, you need: @@ -47,7 +47,7 @@ The Claude Code web UI provides the full URL alongside the token when you add an ```bash cURL curl -X POST https://api.anthropic.com/v1/claude_code/routines/$ROUTINE_ID/fire \ -H "Authorization: Bearer $ROUTINE_TOKEN" \ - -H "anthropic-version: 2023-06-01" \ + -H "anthropic-version: 2026-10-21" \ -H "Content-Type: application/json" \ -d '{"text": "Sentry alert SEN-4521 fired in prod. Stack trace attached."}' ``` @@ -60,7 +60,7 @@ curl -X POST https://api.anthropic.com/v1/claude_code/routines/$ROUTINE_ID/fire run: | curl -X POST "$ROUTINE_FIRE_URL" \ -H "Authorization: Bearer $ROUTINE_FIRE_TOKEN" \ - -H "anthropic-version: 2023-06-01" \ + -H "anthropic-version: 2026-10-21" \ -H "Content-Type: application/json" \ -d "{\"text\": \"CI failed: $GITHUB_WORKFLOW run $GITHUB_RUN_ID on $GITHUB_REF\"}" ``` @@ -69,11 +69,11 @@ The request returns once the session is created. It does not stream session outp ### Headers -| Name | Required | Description | -| ------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------- | -| `Authorization` | Yes | `Bearer `. The per-routine token created in the Claude Code web UI, prefixed `sk-ant-oat01-`. | -| `anthropic-version` | Yes | The [API version](https://platform.claude.com/docs/en/api/versioning). `2023-06-01` is the only accepted value. | -| `Content-Type` | When body is present | `application/json`. | +| Name | Required | Description | +| ------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Authorization` | Yes | `Bearer `. The per-routine token created in the Claude Code web UI, prefixed `sk-ant-oat01-`. | +| `anthropic-version` | Yes | The [API version](https://platform.claude.com/docs/en/api/versioning), such as `2026-10-21`. The endpoint accepts every version from `2023-06-01` on and behaves the same in each. | +| `Content-Type` | When body is present | `application/json`. | Older integrations that send an `anthropic-beta: experimental-cc-routine-2026-04-01` header are unaffected: the endpoint accepts requests with and without it. @@ -156,4 +156,4 @@ This endpoint is not in the Anthropic SDKs. Its token model differs from API key ## See also * [Automate work with routines](https://code.claude.com/docs/en/routines) in the Claude Code documentation -* [Errors](https://platform.claude.com/docs/en/api/errors) +* [Claude API errors](https://platform.claude.com/docs/en/api/errors) diff --git a/content/en/api/errors.md b/content/en/api/errors.md index b7d057b3e1..f9c3f8b4f9 100644 --- a/content/en/api/errors.md +++ b/content/en/api/errors.md @@ -31,9 +31,9 @@ The API follows a predictable HTTP error code format: * 529 - `overloaded_error`: The API is temporarily overloaded. - 529 errors can occur when the API experiences high traffic across all users. + A 529 error can occur when the API experiences high traffic across all users. - In rare cases, if your organization has a sharp increase in usage, you might see 429 errors because of acceleration limits on the API. To avoid hitting acceleration limits, ramp up your traffic gradually and maintain consistent usage patterns. + In rare cases, if your organization has a sharp increase in usage, you might see 429 errors because of acceleration limits on the API. To avoid hitting acceleration limits, increase your traffic gradually and maintain consistent usage patterns. The official SDK automatically retries transient failures (such as connection errors, rate limits, and 5xx server errors) with exponential backoff, twice by default, honoring the `retry-after` header when present. The SDK client accepts `max_retries` (typescript, java, php: `maxRetries`; csharp: `MaxRetries`; go: `option.WithMaxRetries`) to configure or disable this behavior. @@ -135,7 +135,7 @@ The Python and TypeScript SDKs expose the request ID as a `_request_id` property { Model = Model.ClaudeSonnet5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }] + Messages = [new UserMessageParam { Content = "Hello, Claude" }] }); Console.WriteLine($"Request ID: {response.RequestID}"); ``` @@ -260,12 +260,12 @@ For Claude Platform on AWS request-ID examples in other languages, see [Request Avoid setting a large `max_tokens` value without using the [streaming Messages API](https://platform.claude.com/docs/en/build-with-claude/streaming) or [Message Batches API](https://platform.claude.com/docs/en/api/messages/batches/create): -* Some networks may drop idle connections after a variable period of time, which can cause the request to fail or time out without receiving a response from Anthropic. +* Some networks might drop idle connections after a variable period of time, which can cause the request to fail or time out without receiving a response from Anthropic. * Networks differ in reliability. The [Message Batches API](https://platform.claude.com/docs/en/api/messages/batches/create) can help you manage the risk of network issues by allowing you to poll for results rather than requiring an uninterrupted network connection. If you are building a direct API integration, setting a [TCP socket keep-alive](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/programming.html) can reduce the impact of idle connection timeouts on some networks. -The [SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) validate that your non-streaming Messages API requests are not expected to exceed a 10-minute timeout. They also set a socket option for TCP keep-alive. +The [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) validates that your non-streaming Messages API requests are not expected to exceed a 10-minute timeout. It also sets a socket option for TCP keep-alive. If you don't need to process events incrementally, the SDK can consume the stream for you and return the complete `Message` object, identical to what a non-streaming call returns: @@ -321,7 +321,7 @@ If you don't need to process events incrementally, the SDK can consume the strea { Model = Model.ClaudeSonnet5, MaxTokens = 128000, - Messages = [new() { Role = Role.User, Content = "Write a detailed analysis..." }] + Messages = [new UserMessageParam { Content = "Write a detailed analysis..." }] }; var message = await client.Messages.CreateStreaming(parameters).Aggregate(); @@ -422,7 +422,7 @@ If you don't need to process events incrementally, the SDK can consume the strea ``` -See [Streaming Messages](https://platform.claude.com/docs/en/build-with-claude/streaming#get-the-final-message-without-handling-events) for more details. +See [Streaming messages](https://platform.claude.com/docs/en/build-with-claude/streaming#get-the-final-message-without-handling-events) for more details. ## Common validation errors @@ -450,7 +450,7 @@ If the most recent assistant message contains `thinking` or `redacted_thinking` `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified. These blocks must remain as they were in the original response. ``` -With tool use, every `thinking` and `redacted_thinking` block from the assistant turn must be passed back exactly as received, including blocks whose `thinking` field is empty. Pass thinking blocks back unchanged, and if your application filters content blocks by type before resending, include both `thinking` and `redacted_thinking`. See [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-blocks-modified), [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks), and [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking). +With tool use, every `thinking` and `redacted_thinking` block from the assistant turn must be passed back exactly as received, including blocks whose `thinking` field is empty. Pass thinking blocks back unchanged, and if your application filters content blocks by type before resending, include both `thinking` and `redacted_thinking`. See the [fix for modified thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-blocks-modified) in Troubleshooting thinking, and also [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks) and [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking). ### Extended thinking not supported @@ -460,7 +460,7 @@ Claude 4.7 and later models have removed extended thinking. Sending `thinking: { "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior. ``` -Use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) instead. [Migrating to adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#migrating-to-adaptive-thinking) shows the parameter mapping, and [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-enabled) covers the symptom-first fix. +Use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) instead. [Migrating to adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#migrating-to-adaptive-thinking) shows the parameter mapping, and Troubleshooting thinking covers the [symptom-first fix for the extended thinking error](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-enabled). ### Adaptive thinking not supported @@ -470,7 +470,7 @@ Models that support only extended thinking (Claude 4.5 and earlier models) rejec adaptive thinking is not supported on this model ``` -Use `thinking: {"type": "enabled", "budget_tokens": N}` on these models; see [Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) for the configuration and [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-adaptive) for the symptom-first fix. +Use `thinking: {"type": "enabled", "budget_tokens": N}` on these models; see [Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) for the configuration and the [symptom-first fix for the adaptive thinking error](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-adaptive) in Troubleshooting thinking. ### Thinking cannot be disabled @@ -506,7 +506,7 @@ messages.N: output_config.effort 'low' differs from the 'high' in effect before Claude Haiku 5.5 accepts `thinking: {"type": "disabled"}` and holds it to the same two effort limits that apply to `between_tools`: at `xhigh` or `max` effort, or with a per-message `output_config.effort` that differs from the level in effect, the request returns a 400 `invalid_request_error` with the matching message shown earlier. -In both messages, "enable thinking" means adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. Claude Sonnet 5.5 and Claude Haiku 5.5 reject `"enabled"` with a 400 error. To vary effort per turn, use adaptive thinking. +In both messages, "enable thinking" means adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. Claude Sonnet 5.5 and Claude Haiku 5.5 reject `"enabled"` with a 400 error. To vary effort for each turn, use adaptive thinking. Sending `thinking: {"type": "between_tools"}` to any model other than Claude Sonnet 5.5 returns a 400 `invalid_request_error`: @@ -514,9 +514,9 @@ Sending `thinking: {"type": "between_tools"}` to any model other than Claude Son "thinking.type.between_tools" is not supported for this model. ``` -For the fixes, see [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-between-tools), which covers the `between_tools` and effort errors. +For the fixes, see the [`between_tools` and effort errors](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-between-tools) in Troubleshooting thinking. -Omit the `thinking` parameter and the request runs with adaptive thinking. To keep thinking content out of responses without turning thinking off, set `display: "omitted"` on the thinking configuration. See [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-disabled). +Omit the `thinking` parameter and the request runs with adaptive thinking. To keep thinking content out of responses without turning thinking off, set `display: "omitted"` on the thinking configuration. See the [fix for the disabled thinking error](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-type-disabled) in Troubleshooting thinking. ### Forced tool use not supported @@ -546,7 +546,7 @@ On Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, t messages.{i}.content.{j}: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". ``` -Without the `thinking-binding-controls-2026-08-01` beta header the message also names that header. Keep the conversation history append-only, or send the beta header with `prefix_mismatch_behavior: "drop_block"` to drop the block and continue. On Claude Sonnet 5.5 and Claude Haiku 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`. With `between_tools` on Claude Sonnet 5.5, or `thinking: {"type": "disabled"}` on Claude Haiku 5.5, keep the history append-only, or strip the thinking blocks from the edited turn on. A block from a model the target model can't read is dropped rather than rejected. See [Keeping the prefix unchanged](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check) and [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-block-signature). +Without the `thinking-binding-controls-2026-08-01` beta header, the message also names that header. Keep the conversation history append-only, or send the beta header with `prefix_mismatch_behavior: "drop_block"` to drop the block and continue. On Claude Sonnet 5.5 and Claude Haiku 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`. With `between_tools` on Claude Sonnet 5.5, or `thinking: {"type": "disabled"}` on Claude Haiku 5.5, keep the history append-only, or strip the thinking blocks from the edited turn on. A block from a model the target model can't read is dropped rather than rejected. See [Keeping the prefix unchanged](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check) and the [fix for an invalid thinking block signature](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#error-thinking-block-signature) in Troubleshooting thinking. Sending `thinking.block_binding` without the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers) returns a 400 `invalid_request_error` whose message ends in: @@ -558,7 +558,7 @@ Add the header, or remove the field. ### Outbound web identity federation disabled (Claude Platform on AWS) -If every request to [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws) returns `"Outbound web identity federation is disabled for your account"`, run `aws iam enable-outbound-web-identity-federation` once per AWS account. See [Enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) for details. +If every request to [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws) returns `"Outbound web identity federation is disabled for your account"`, run `aws iam enable-outbound-web-identity-federation` once for each AWS account. See [Enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) for details. ## Next steps diff --git a/content/en/api/ip-addresses.md b/content/en/api/ip-addresses.md index 9e399e73fc..45b37bb581 100644 --- a/content/en/api/ip-addresses.md +++ b/content/en/api/ip-addresses.md @@ -1,7 +1,7 @@ --- title: IP addresses url: https://platform.claude.com/docs/en/api/ip-addresses -description: Anthropic services use fixed IP addresses for both inbound and outbound connections. You can use these addresses to configure your firewall rules for secure access to the Claude API and Console. These addresses will not change without notice. +description: Anthropic services use fixed IP addresses for both inbound and outbound connections. You can use these addresses to configure your firewall rules for secure access to the Claude API and Claude Console. These addresses will not change without notice. --- @@ -30,7 +30,7 @@ These are the stable IP addresses that Anthropic uses for outbound requests (for ### Phased out IP addresses -The following IP addresses are no longer in use by Anthropic. If you have previously allowlisted these addresses, you should remove them from your firewall rules. +The following IP addresses are no longer in use by Anthropic. If you have previously allowlisted these addresses, remove them from your firewall rules. ```text wrap 34.162.46.92/32 diff --git a/content/en/api/migration-2026-10-21.md b/content/en/api/migration-2026-10-21.md new file mode 100644 index 0000000000..7f579bef73 --- /dev/null +++ b/content/en/api/migration-2026-10-21.md @@ -0,0 +1,1459 @@ +--- +title: Migrating to API version 2026-10-21 +url: https://platform.claude.com/docs/en/api/migration-2026-10-21 +description: "Upgrade a Claude API integration from API version 2023-06-01 to 2026-10-21: the SDK version to install and the code changes to make." +--- + +This guide lists the code changes for moving from API version `2023-06-01` to `2026-10-21`. The [upgrade steps](https://platform.claude.com/docs/en/api/migration-2026-10-21#migration-checklist) say what to do, in order. + +## Upgrade steps + + + + If you use an SDK, your requests use the API version that was current when your SDK's major version was released. The versions shown for your language are the first to use `2026-10-21`, so upgrade to them. If you call the API without an SDK, set the `anthropic-version` header to `2026-10-21`. + + + + Set the `anthropic-version` header to `2026-10-21`: + + ```bash + curl https://api.anthropic.com/v1/messages \ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2026-10-21" \ + -H "content-type: application/json" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 1024, + "messages": [{"role": "user", "content": "Hello, Claude"}] + }' + ``` + + + + Upgrade the `ant` CLI to version 2.0.0. The Homebrew command and the release downloads stay the same. + + Go requires the path of a module at major version 2 or later to end in that version, so the CLI's module path is now `github.com/anthropics/anthropic-cli/v2`. If you install with `go install`, add `/v2` to the path: + + ```bash + # Before + go install 'github.com/anthropics/anthropic-cli/cmd/ant@latest' + + # After + go install 'github.com/anthropics/anthropic-cli/v2/cmd/ant@latest' + ``` + + The old path keeps installing the latest v1 release, with no error or warning. + + + + Upgrade the `anthropic` package to version 2.0.0. + + + + Upgrade the `@anthropic-ai/sdk` package to version 1.0.0. + + v1 of `@anthropic-ai/bedrock-sdk`, `@anthropic-ai/vertex-sdk`, `@anthropic-ai/foundry-sdk`, `@anthropic-ai/aws-sdk`, and `@anthropic-ai/google-cloud-sdk` needs v1 of `@anthropic-ai/sdk`, and their earlier versions need a version below 1. If you use one of them, move it to v1 in the same upgrade. Otherwise your package manager installs a second, older copy of `@anthropic-ai/sdk` for it. + + + + Upgrade the `Anthropic` package to version 13.0.0. + + + + Upgrade to version 2.0.0 of the Go SDK, whose module path is `github.com/anthropics/anthropic-sdk-go/v2`. A new major version of a Go module has a new import path, so change each import of `github.com/anthropics/anthropic-sdk-go`, and of its packages such as `github.com/anthropics/anthropic-sdk-go/option`, to start with `github.com/anthropics/anthropic-sdk-go/v2`. Then run `go get github.com/anthropics/anthropic-sdk-go/v2`. + + + + Upgrade the `com.anthropic:anthropic-java` artifact to version 3.0.0. + + + + Run `composer require "anthropic-ai/sdk"` to upgrade the package to version 1.0.0. `composer update` alone stays within your current version constraint. + + + + Upgrade the `anthropic` gem to version 2.0.0. + + + + + On Amazon Bedrock, `2026-10-21` is available only for Claude 4.7 and later models. If you call an older model on Bedrock, listed in [Claude on Amazon Bedrock (Opus 4.6 and earlier)](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy), stay on the SDK version you use today, or, if you set the API version yourself, keep sending the version you send today. To move those calls to `2026-10-21`, first switch them to a Claude 4.7 or later model. + + + Release the upgrade together with your fixes from the next step. + + + + Go through the [breaking changes](https://platform.claude.com/docs/en/api/migration-2026-10-21#breaking-changes), and update your code for each one that affects you. Also make the [code changes that the new SDK or CLI version needs](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-changes). + + + + Test your integration against `2026-10-21` before you release. + + + +## Breaking changes + +### Messages API + +These changes apply to requests to the Messages API (`POST /v1/messages`), to [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting), and to each request in a [Message Batch](https://platform.claude.com/docs/en/build-with-claude/batch-processing) created with `2026-10-21`. + +#### Document blocks in assistant messages return an error + +Affects you if you send `document` blocks directly in `assistant` messages. + +In `2026-10-21`, a request that places a `document` block directly in an `assistant` message returns a 400 error. Send documents in `user` messages instead. A document nested inside another block, such as a web fetch tool result that Claude returned, is still accepted. + +#### Citations in user messages return an error + +Affects you if you send `citations` on `text` blocks in `user` messages, including inside `search_result` blocks. + +In `2026-10-21`, a request that sends a `text` block with a non-empty `citations` array in a `user` message returns a 400 error. Remove `citations` from those blocks. Citations on `text` blocks in `assistant` messages, such as Claude's earlier replies that you send back, are still accepted, and so is the `"citations": {"enabled": true}` setting on documents and search results. + +#### Sampling parameters are removed + +Affects you if you send `temperature`, `top_p`, or `top_k` in Messages requests or Message Batch requests. + +In `2026-10-21`, a request that sends `temperature`, `top_p`, or `top_k` returns a 400 error, even at the parameter's default value. + +Remove the three parameters from your requests. + +As of the latest major versions, the SDK and the CLI no longer have the three parameters. + +Without these parameters, a request samples with their defaults, including a `temperature` of 1.0, the same as a `2023-06-01` request that leaves them out. Models that already accept only the defaults, such as Claude 4.7 and later models, sample as before. On models that accept other values, such as Claude Sonnet 4.6, a request that lowered `temperature` for more consistent output loses that effect. No other setting replaces it. If a request relies on a non-default value, either stop sending the parameter, or keep that request on `2023-06-01`. + +### Admin API and Claude Enterprise Analytics API + +Affects you if your code reads the Admin API or Claude Enterprise Analytics API response fields in the following tables. + +In `2026-10-21`, responses from the Admin API and the [Claude Enterprise Analytics API](https://platform.claude.com/docs/en/manage-claude/analytics-api) no longer include the old names of renamed fields. Use the new names instead. + +Admin API: + +| Endpoints | Old name | New name | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| [RBAC groups](https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/list): create, list, retrieve, and update | `roles` | `role_ids` | +| [RBAC group members](https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/list): list and add, and the response to [removing a member](https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/remove) | `group_id` | `rbac_group_id` | +| [RBAC roles](https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/list): list and retrieve | `name` | `display_name` | +| [Organization](https://platform.claude.com/docs/en/api/organization/rate_limits/list) and [workspace](https://platform.claude.com/docs/en/api/organization/workspaces/rate_limits/list) rate limits: list, and the response to setting a workspace's rate limits | `group_type` | `group.type` | +| [API keys](https://platform.claude.com/docs/en/api/organization/api_keys/list): list, retrieve, and update | `workspace_id` | `scope` (different values; see [`workspace_id` on API keys](https://platform.claude.com/docs/en/api/migration-2026-10-21#api-key-workspace-id)) | + +Claude Enterprise Analytics API: + +| Endpoints | Old name | New name | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------- | +| Per-user [usage](https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list) and [cost](https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list) reports | `actor.email` | `actor.email_address` | +| [Activity summaries](https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list) | `summaries` | `data` | + +The `group_type` query parameter on the rate-limit list endpoints and the `workspace_id` filter on the API key list endpoint are unchanged. + +#### `workspace_id` on API keys + +Affects you if your code reads `workspace_id` on API keys. + +In `2023-06-01`, an API key's `workspace_id` is the ID of the workspace the key is bound to, or `null` for a key bound to the Default Workspace and for a key that isn't bound to one workspace (an all-workspaces key). + +In `2026-10-21`, `workspace_id` is removed. Read `scope` instead: for a key bound to a workspace, including the Default Workspace, `scope.workspace_id` is that workspace's real ID, and an all-workspaces key has a `scope` of `{"type": "organization"}`, with no `workspace_id`. + +If your code treated a `null` `workspace_id` as the Default Workspace, compare `scope.workspace_id` with your Default Workspace's ID instead. To find that ID, call [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) with `include_default=true` and take the workspace named `"Default"`. + +## SDK and CLI changes + +Earlier SDK and CLI versions sent `anthropic-version: 2023-06-01` with every request. The versions under [Switch to 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade) send `2026-10-21`, including their Amazon Bedrock and Google Cloud clients. The changes in [Breaking changes](https://platform.claude.com/docs/en/api/migration-2026-10-21#breaking-changes) apply to them too: the removed parameters and the old field names are also gone from the SDK's types and from the CLI's flags and output. + +### `MessageParam` is a union with one type per role + +In earlier versions, `MessageParam` was one type for every role. Each role now has a type of its own: `UserMessageParam`, `AssistantMessageParam`, and `SystemMessageParam`. `BetaMessageParam` is split the same way, into `BetaUserMessageParam`, `BetaAssistantMessageParam`, and `BetaSystemMessageParam`. The requests that the SDK sends have the same fields and values as before. + + + + A message written as a dict literal, such as `{"role": "user", "content": "Hello"}`, needs no change. + + In v1, `anthropic.types.MessageParam` was one `TypedDict`. In v2 it is a union of the three types, and `anthropic.types.beta.BetaMessageParam` is a union of its three. Both names still work in annotations, such as `list[MessageParam]`. + + Calling either name now raises a `TypeError`, and a type checker flags it. Write the message as a dict: + + ```python + # Before + message = MessageParam(role="user", content="Hello") + + # After + message: MessageParam = {"role": "user", "content": "Hello"} + ``` + + Subclassing either name also raises a `TypeError`. Subclass the type for the role, such as `UserMessageParam`. + + The remaining changes affect type checking only. A dict whose `role` is a variable that can hold more than one role matches no type in the union, so build the dict for one role at a time: + + ```python + # Before + def to_message(role: Literal["user", "assistant"], text: str) -> MessageParam: + return {"role": role, "content": text} + + + # After + def to_message(role: Literal["user", "assistant"], text: str) -> MessageParam: + if role == "user": + return {"role": "user", "content": text} + return {"role": "assistant", "content": text} + ``` + + Two more apply to `BetaMessageParam` only: + + * `clear_at` and `output_config` are keys of `BetaSystemMessageParam`, so a user or assistant message can't have them. + * `content` is optional in `BetaSystemMessageParam`, so pyright reports `message["content"]`. Read it with `message.get("content")`, or check first that `message["role"]` is not `"system"`. + + + + `MessageParam` was one interface. It is now `UserMessageParam | AssistantMessageParam | SystemMessageParam`, and `BetaMessageParam` is the same union of its three types. Only the types changed. A message literal that names its role, such as `{ role: "user", content: "Hello, Claude" }`, type-checks as it did, so most code needs no change. + + The system type differs from the other two. Its `content` is a string or text blocks, plus `tool_addition` and `tool_removal` blocks in `beta`, so an image block there no longer compiles. In `beta`, only it has `clear_at` and `output_config`, and its `content` is optional. + + Code that handles a message of any role has to check `role` before it replaces or adds content blocks, and before it reads `clear_at` or `output_config`: + + ```typescript + // Before + const copy: Anthropic.MessageParam = { ...message, content: blocks }; + + // After + const copy: Anthropic.MessageParam = + message.role === "system" ? message : { ...message, content: blocks }; + ``` + + The `content` of a `BetaMessageParam` can be `undefined`: + + ```typescript + // Before + const types = + typeof message.content === "string" ? [] : message.content.map((block) => block.type); + + // After + const types = Array.isArray(message.content) ? message.content.map((block) => block.type) : []; + ``` + + The type `BetaMessageParam["content"]` includes `undefined` too. For the content of a user or assistant message, use `BetaMessageContentParam`. + + An interface can't extend a union, and a class can't implement one. Use a type alias, or name the type of one role instead. + + ```typescript + // Before + interface StoredMessage extends Anthropic.MessageParam { + id: string; + } + + // After + type StoredMessage = Anthropic.MessageParam & { id: string }; + ``` + + + + In v12, `MessageParam` and `BetaMessageParam` were classes whose `Role` and `Content` you set. In v13 each is a union of the three classes for its roles, and the `Role` enums in `Anthropic.Models.Messages` and `Anthropic.Models.Beta.Messages` are gone. + + When you build a message, name the class for its role and delete `Role`. Each class converts to the union implicitly: + + ```csharp + // Before + Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + + // After + Messages = [new UserMessageParam { Content = "Hello, Claude" }], + ``` + + `new UserMessageParam("Hello, Claude")` works too. + + The classes that hold `Content` change as well: + + * `MessageParamContent` is now `MessageContentParam`, and `BetaMessageParamContent` is now `BetaMessageContentParam`. + * A system message has a content class of its own. A `SystemMessageParamContent` holds a string or a list of `TextBlockParam`, and a `BetaSystemMessageParamContent` holds a string or a list of `SystemMessageContentBlock`. A `List` or a `List` no longer converts to it. + * `ClearAt` and `OutputConfig` are on `BetaSystemMessageParam` only. + + When you read a message, the union still has `Role` and `Content`, but you can't set them, so a `with` expression goes on the class for the role. `Role` now holds a `MessageParamRole` or a `BetaMessageParamRole`. `BetaMessageParam.Content` can be `null`, because `Content` is optional on `BetaSystemMessageParam`. + + ```csharp + // Before + if (message.Role.Value() == Role.Assistant) { } + + // After + if (message.Role.Value() == MessageParamRole.Assistant) { } + ``` + + `TryPickUser`, `TryPickAssistant`, `TryPickSystem`, `Switch`, and `Match` give you the class for the role. + + + + In v1, `MessageParam` was one struct with a `Role` and a `Content` field. In v2 it is a union: `OfUser` holds a `*UserMessageParam`, `OfAssistant` an `*AssistantMessageParam`, and `OfSystem` a `*SystemMessageParam`. `BetaMessageParam` changes in the same way. The SDK sends the same JSON as before, apart from the order of the keys in a beta system message. + + `NewUserMessage`, `NewAssistantMessage`, `NewBetaUserMessage`, and the `ToParam` methods of `Message` and `BetaMessage` work as before, so code that builds its messages with them needs no change. + + A struct literal names the type for its role. Leave `Role` out, because each type marshals its own: + + ```go + // Before + anthropic.MessageParam{ + Role: anthropic.MessageParamRoleAssistant, + Content: blocks, + } + + // After + anthropic.MessageParam{OfAssistant: &anthropic.AssistantMessageParam{ + Content: blocks, + }} + ``` + + Code that reads a message checks which field is set: + + ```go + // Before + if message.Role == anthropic.MessageParamRoleUser { + blocks = message.Content + } + + // After + if message.OfUser != nil { + blocks = message.OfUser.Content + } + ``` + + * The `MessageParamRole` and `BetaMessageParamRole` types and their constants are gone. `message.GetRole()` returns a pointer to the role as a `string`, or `nil` when no field is set. + * `ClearAt` and `OutputConfig` moved from `BetaMessageParam` to `BetaSystemMessageParam`. The names of the `BetaMessageParamClearAt` type and its constants now start with `BetaSystemMessageParamClearAt`. + * `SystemMessageParam.Content` is a `[]TextBlockParam`. `BetaSystemMessageParam.Content` is a `[]BetaSystemMessageParamContentUnion`, which holds `text`, `tool_addition`, and `tool_removal` blocks. `NewBetaSystemMessage` takes blocks of that type, so `anthropic.NewBetaTextBlock("Be brief.")` becomes `anthropic.BetaSystemMessageParamContentUnion{OfText: &anthropic.BetaTextBlockParam{Text: "Be brief."}}`. + * A copy of a `MessageParam` points to the same message as the original. Setting `duplicate.OfUser.Content` changes both, where setting `duplicate.Content` in v1 changed only the copy. + * `mcp.ToMessage` returns an `*mcp.UnsupportedValueError` for a role other than `user` or `assistant`. v1 copied any role into the message. + + + + In v2, `MessageParam` was a single class with a `role` and a `content`. In v3 it is a union of the three classes, and `MessageParam.Content` is now the top-level `MessageContentParam`. `BetaMessageParam` changes the same way, and its classes have the same names with a `Beta` prefix. The JSON that the SDK sends is the same, except that a beta system message now has `role` before `content`. + + `addUserMessage`, `addAssistantMessage`, and `addSystemMessage` with a `String`, `addMessage` with a `Message` or a `MessageParam`, and `Message.toParam()` don't change. + + `MessageParam.builder()` and `toBuilder()` are gone. Call the factory method for the role, which is `ofUser`, `ofAssistant`, or `ofSystem`: + + ```java + // Before + MessageParam message = MessageParam.builder() + .role(MessageParam.Role.USER) + .content("Hello, Claude") + .build(); + + // After + MessageParam message = MessageParam.ofUser("Hello, Claude"); + ``` + + The methods that take a list of content blocks have new names on the builders of `MessageCreateParams`, `StructuredMessageCreateParams`, `MessageCountTokensParams`, and `BatchCreateParams.Request.Params`: + + | v2 | v2 beta | v3 | + | ---------------------------------- | --------------------------------------------- | ----------------------------------------- | + | `addUserMessageOfBlockParams` | `addUserMessageOfBetaContentBlockParams` | `addUserMessageOfContentBlockParams` | + | `addAssistantMessageOfBlockParams` | `addAssistantMessageOfBetaContentBlockParams` | `addAssistantMessageOfContentBlockParams` | + | `addSystemMessageOfBlockParams` | `addSystemMessageOfBetaContentBlockParams` | `addSystemMessageOfBlocks` | + + On the content class, `BlockParams` (`BetaContentBlockParams` in beta) becomes `ContentBlockParams` in `ofBlockParams`, `blockParams()`, `isBlockParams()`, `asBlockParams()`, and the visitor's `visitBlockParams`. + + A system message has its own content class, `SystemMessageParam.Content`, which `addSystemMessage` now takes. Its blocks are `TextBlockParam`, not `ContentBlockParam`. In beta they are `BetaSystemMessageParam.Content.SystemMessageContentBlock`, which has `ofText`, `ofToolAddition`, and `ofToolRemoval`. + + ```java + // Before + builder.addSystemMessageOfBlockParams(List.of(ContentBlockParam.ofText(textBlock))); + + // After + builder.addSystemMessageOfBlocks(List.of(textBlock)); + ``` + + When you read a message, `role()` doesn't change. `content()` returns a `MessageContentParam`, or an `Optional` in beta, where a system message can have no content. `_role()`, `_content()`, and `_additionalProperties()` are now on the class for the role, which `asUser()`, `asAssistant()`, or `asSystem()` returns. + + + + The classes are in `Anthropic\Messages`, and the beta classes in `Anthropic\Beta\Messages`. Messages you write as arrays don't change, and still need their `'role'`. + + `MessageParam::with()` and `BetaMessageParam::with()` remain, and return the class that goes with `role`. A call with named arguments needs no change. `role` is now the first parameter, so in a positional call swap `content` and `role`, or call `with()` on the role's class, which takes no `role`. For arguments in the old order PHP throws `UnhandledMatchError`, which PHPStan does not warn about, or a `TypeError` if `content` is a list or `role` is an enum case. + + ```php + // Before + MessageParam::with('Hello, Claude', 'user'); + + // After + UserMessageParam::with('Hello, Claude'); + ``` + + No object is a `MessageParam` any more: `instanceof MessageParam` is false, and PHP throws a `TypeError` where a parameter or return type names it. Name the three classes instead: + + ```php + // Before + function send(MessageParam $message): void {} + + // After + function send(UserMessageParam|AssistantMessageParam|SystemMessageParam $message): void {} + ``` + + * `MessageParam::fromArray()` and `(new MessageParam)->withContent()` throw "Call to undefined method". Call them on the role's class, which sets `role` itself. + * `withRole()` takes only the string now: PHP throws a `TypeError` for a `Role` case. To give a message another role, build that role's class. + * `clearAt` and `outputConfig` exist only on `BetaSystemMessageParam`, and `BetaMessageParam::with()` drops them for the other two roles. The `BetaMessageParam\ClearAt` enum is now `BetaSystemMessageParam\ClearAt`. + * `MessageParam\Content` is now `MessageContentParam`, and `BetaMessageParam\Content` is now `BetaMessageContentParam`. Their PHPStan types take the new name too: `ContentShape` is now `MessageContentParamShape`. + * An array whose `'role'` is a `Role` case still works, but PHPStan now reports it. Write the string. + + + + Messages you write as hashes don't change. + + In v2, `Anthropic::MessageParam` is a union of `Anthropic::UserMessageParam`, `Anthropic::AssistantMessageParam`, and `Anthropic::SystemMessageParam`. In the same way, `Anthropic::Beta::BetaMessageParam` is a union of its three classes. + + `Anthropic::MessageParam.new(role: :user, content: "Hello, Claude")` still works, and returns an instance of the class for that role. You can also build that class yourself, with no `role:`, as `Anthropic::UserMessageParam.new(content: "Hello, Claude")`. Four things change for code that builds or inspects these instances: + + * `MessageParam.new` takes keywords only, so pass a hash as `MessageParam.new(**hash)`. It raises an `ArgumentError` when `role:` is missing or isn't one of the three roles. + * `message.is_a?(Anthropic::MessageParam)` is `false`. A `when Anthropic::MessageParam` branch and `messages.grep(Anthropic::MessageParam)` still match. + * An instance built with `.new` has no `:role` in its `to_h`, and `message[:role]` is `nil`. `message.role` still returns the role. + * Only `BetaSystemMessageParam` has `clear_at` and `output_config`. On a user or assistant message they returned `nil`, and now raise a `NoMethodError`. + + ```ruby + # Before + typed = messages.select { _1.is_a?(Anthropic::MessageParam) } + roles = typed.map { _1[:role] } + + # After + typed = messages.grep(Anthropic::MessageParam) + roles = typed.map(&:role) + ``` + + The `Role` enum modules stay. These constants moved. The names that start with `Beta` are under `Anthropic::Beta`, and the others are under `Anthropic`: + + | Removed | Use instead | + | --------------------------- | ------------------------------------------------------------------------------------ | + | `MessageParam::Content` | `MessageContentParam`, or `SystemMessageParam::Content` for a system message | + | `BetaMessageParam::Content` | `BetaMessageContentParam`, or `BetaSystemMessageParam::Content` for a system message | + | `BetaMessageParam::ClearAt` | `BetaSystemMessageParam::ClearAt` | + + If you type-check with Sorbet, `MessageParam::OrHash` is gone, and `Anthropic::MessageParam` as a type no longer accepts an instance. Use `Anthropic::MessageParam::Variants` for the three classes, each of which has its own `OrHash`. In RBS, a value typed `Anthropic::MessageParam` has no `role` or `content`. Use the `Anthropic::Models::message_param` alias, which was the hash form of a message and is now the union of the three classes. The beta names are `BetaMessageParam::Variants` and `Anthropic::Models::Beta::beta_message_param`. + + + +### One-value enums are constants + +This affects the C#, Go, Java, PHP, and Ruby SDKs and one CLI flag. In earlier versions, a required field that can hold only one value had an enum type of its own with a single member. These fields are now constants, and the enum types are gone. The JSON that the SDK sends and reads is the same. + + + + `--type` is optional on `ant beta:sessions:resources add`. `file` is the only value `--type` can take there, so v2 sends it for you. Commands that still pass `--type file` keep working, so there is nothing to change. + + + + In v12, such a `required` property had an enum with a single member, such as `BetaManagedAgentsTextBlockType.Text`. Nearly all of them are the `Type` property of a class under `Anthropic.Models.Beta`: `Agents`, `DeploymentRuns`, `Deployments`, `Dreams`, `Environments`, `MemoryStores`, `Sessions`, `UserProfiles`, and `Vaults`. In v13 these properties are a `JsonElement` that the constructor fills in, as `TextBlockParam.Type` already was. + + An optional property, such as `BetaManagedAgentsGlobToolConfigParams.Type`, keeps its enum. Two of those enums have a new name: + + | v12 | v13 | + | ------------------------------------------- | ----------------------------------------- | + | `BetaManagedAgentsBashToolConfigParamsType` | `Anthropic.Models.Beta.Agents.Type` | + | `BetaPackagesType` | `Anthropic.Models.Beta.Environments.Type` | + + When you build an object, delete the property: + + ```csharp + // Before + new BetaManagedAgentsTextBlock + { + Type = BetaManagedAgentsTextBlockType.Text, + Text = "Hello Claude!", + }; + + // After + new BetaManagedAgentsTextBlock { Text = "Hello Claude!" }; + ``` + + A class that is left with one required property also gains a constructor that takes it, so `new BetaManagedAgentsTextBlock("Hello Claude!")` works too. A class that is left with none is built with `new BetaManagedAgentsAlwaysAllowPolicy()`. + + When you read one, compare the string: + + ```csharp + // Before + if (message.Type.Value() == BetaManagedAgentsAgentMessageEventType.AgentMessage) { } + + // After + if (message.Type.GetString() == "agent.message") { } + ``` + + To tell the variants of a union apart, keep using its `TryPick*`, `Switch`, and `Match` methods, which don't change. + + + + An example of such an enum type and its constant is `BetaManagedAgentsTextBlockType` and `BetaManagedAgentsTextBlockTypeText`. Nearly all of them are the `Type` field of a struct under `client.Beta`: Agents, Deployments, Deployment Runs, Dreams, Environments, Memory Stores, Sessions, User Profiles, and Vaults. In v2 these fields use a type from the `shared/constant` package, as `TextBlockParam.Type` already did. An optional field, such as `BetaManagedAgentsBashToolConfigParams.Type`, keeps its enum. + + In a request, delete the field. It marshals as its one value when you leave it out: + + ```go + // Before + anthropic.BetaManagedAgentsTextBlockParam{ + Type: anthropic.BetaManagedAgentsTextBlockTypeText, + Text: "Hello Claude!", + } + + // After + anthropic.BetaManagedAgentsTextBlockParam{ + Text: "Hello Claude!", + } + ``` + + A struct whose only field was that `Type` now has a constructor, such as `NewBetaManagedAgentsAlwaysAllowPolicyParam()`. As a union member, a pointer to the empty struct works too: `OfAlwaysAllow: &anthropic.BetaManagedAgentsAlwaysAllowPolicyParam{}`. + + In a response, compare with the string: + + ```go + // Before + switch event.Type { + case string(anthropic.BetaManagedAgentsAgentMessageEventTypeAgentMessage): + } + + // After + switch event.Type { + case "agent.message": + } + ``` + + A variable, field, or parameter of yours that was declared with one of the removed types takes the new type of the field, such as `constant.AgentMessage`. `constant.ValueOf[constant.AgentMessage]()` returns its value. + + The union constructors change with the fields. These five lose their `type_` argument: + + * `BetaManagedAgentsEventParamsOfUserToolConfirmation` + * `BetaManagedAgentsEventParamsOfUserDefineOutcome` + * `BetaManagedAgentsDeploymentInitialEventParamsOfUserDefineOutcome` + * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsAgents` + * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsAdvisors` + + These four took no other argument, so they are gone. Set the union's field to a pointer to the empty struct, such as `BetaManagedAgentsEventParamsUnion{OfUserInterrupt: &anthropic.BetaManagedAgentsUserInterruptEventParams{}}`: + + * `BetaManagedAgentsEventParamsOfUserInterrupt` + * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsMultiagentSelfs` + * `BetaManagedAgentsCredentialNetworkingParamsOfUnrestricted` + * `BetaOutputBehaviorParamOfCreateNew` + + + + An example of such an enum is the nested class `BetaManagedAgentsTextBlock.Type`, with its one member `TEXT`. Nearly all of them are the `type` of a class under `com.anthropic.models.beta`: `agents`, `deploymentruns`, `deployments`, `dreams`, `environments`, `memorystores`, `sessions`, `userprofiles`, and `vaults`. In v3 these fields are a `JsonValue` that the builder fills in, as `TextBlockParam`'s already was. An optional field, such as the `type` of `BetaManagedAgentsBashToolConfigParams`, keeps its enum. + + When you build an object, delete the call: + + ```java + // Before + BetaManagedAgentsTextBlock block = BetaManagedAgentsTextBlock.builder() + .type(BetaManagedAgentsTextBlock.Type.TEXT) + .text("Hello Claude!") + .build(); + + // After + BetaManagedAgentsTextBlock block = BetaManagedAgentsTextBlock.builder() + .text("Hello Claude!") + .build(); + ``` + + A class that is left with one required field also gains a factory method that takes it, so `BetaManagedAgentsTextBlock.of("Hello Claude!")` works too. A class that is left with none loses `of(type)`, and its unions lose the overload that took the enum, such as `ofAlwaysAllow(type)`. Build it with `BetaManagedAgentsAlwaysAllowPolicy.builder().build()`. + + When you read one, `type()` is gone and `_type()` returns the `com.anthropic.core.JsonValue`: + + ```java + // Before + if (message.type().equals(BetaManagedAgentsAgentMessageEvent.Type.AGENT_MESSAGE)) {} + + // After + if (message._type().equals(JsonValue.from("agent.message"))) {} + ``` + + To tell the variants of a union apart, keep using its `is*()` and `as*()` methods and its visitor, which don't change. + + + + An example of such an enum case is `Anthropic\Beta\Sessions\Events\ManagedAgentsTextBlock\Type::TEXT`. Nearly all of them are the `type` of a Managed Agents class under `Anthropic\Beta`. These properties are now a string with that one value as their default, as the `type` of `Anthropic\Messages\TextBlockParam` already was. An optional property, such as the `type` of `Anthropic\Beta\Environments\BetaPackages`, keeps its enum. + + `with()` no longer takes `type`. Remove it: PHP throws "Unknown named parameter" for a leftover `type:`, and in a positional call the arguments after it move up by one. + + ```php + // Before + ManagedAgentsTextBlock::with(text: 'Hello Claude!', type: Type::TEXT); + + // After + ManagedAgentsTextBlock::with(text: 'Hello Claude!'); + ``` + + Where you compared with an enum case, compare with the string: + + ```php + // Before + $event->type === Type::AGENT_MESSAGE->value; + + // After + $event->type === 'agent.message'; + ``` + + * `withType()` and the `type` argument of `$client->beta->sessions->resources->add()` take only the string now. In `add()` it defaults to `'file'`, so you can leave it out. + * Requests you write as arrays don't change, and still need their `'type'`. + + + + An example of such an enum constant is `Anthropic::Beta::Sessions::BetaManagedAgentsTextBlock::Type::TEXT`. Nearly all of them are the `type` of a Managed Agents class under `Anthropic::Beta`. In v2 these fields are declared as a constant, as the `type` of `Anthropic::TextBlockParam` already was. An optional field, such as the `type` of `Anthropic::Beta::BetaManagedAgentsGlobToolConfigParams`, keeps its enum. + + Replace a removed constant with its symbol: + + ```ruby + # Before + event.type == Anthropic::Beta::Sessions::BetaManagedAgentsAgentMessageEvent::Type::AGENT_MESSAGE + + # After + event.type == :"agent.message" + ``` + + Requests you write as hashes don't change, and still need their `type`: + + ```ruby + client.beta.sessions.events.send_( + session.id, + events: [{type: "user.message", content: [{type: "text", text: "Hello Claude!"}]}] + ) + ``` + + When you build a model instance, `type:` now has a default, so you can leave it out: `Anthropic::Beta::Sessions::BetaManagedAgentsTextBlock.new(text: "Hello Claude!")`. The same goes for the `type:` keyword of `client.beta.sessions.resources.add`. + + If you type-check with Sorbet, the `Type::OrSymbol` and `Type::TaggedSymbol` aliases of these modules are gone with them, and the fields are a `Symbol`. `OrSymbol` also allowed a `String`, so `.new(type: "text")` no longer type-checks. Drop the keyword or pass `:text`. In RBS, the `type_` alias of each class is gone, and the field is the literal, such as `:text`. + + + +### Client-side compaction is removed from the tool runner + +This affects the TypeScript and Ruby SDKs. Client-side compaction in the tool runner has been removed in favor of server-side compaction, which summarizes the conversation inside the API instead of with an extra request from the client. + + + + The `compactionControl` option and the `@anthropic-ai/sdk/lib/tools/CompactionControl` module are gone. The option stopped working in v0.129.0, where passing it threw an `AnthropicError`. It isn't in the params type, so TypeScript reports it as an unknown property. + + To keep compacting automatically at a token threshold: + + ```typescript + // Before + const runner = client.beta.messages.toolRunner({ + // ... + compactionControl: { enabled: true, contextTokenThreshold: 100_000 } + }); + + // After + const runner = client.beta.messages.toolRunner({ + // ... + betas: ["compact-2026-01-12"], + context_management: { + edits: [{ type: "compact_20260112", trigger: { type: "input_tokens", value: 100_000 } }] + } + }); + ``` + + To decide yourself when the conversation is compacted, call [`runner.compactBeforeNextTurn()`](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/helpers.md#compaction). + + + + The `compaction_control:` option is gone. It stopped working in v1.74.0, where passing it raised an `ArgumentError`. + + To keep compacting automatically at a token threshold: + + ```ruby + # Before + runner = client.beta.messages.tool_runner( + # ... + compaction_control: {enabled: true, context_token_threshold: 100_000} + ) + + # After + runner = client.beta.messages.tool_runner( + # ... + betas: ["compact-2026-01-12"], + context_management: { + edits: [{type: :compact_20260112, trigger: {type: :input_tokens, value: 100_000}}] + } + ) + ``` + + To decide yourself when the conversation is compacted, call [`#compact_before_next_turn`](https://github.com/anthropics/anthropic-sdk-ruby/blob/main/helpers.md#compact_before_next_turn---compact-the-conversation) on the runner. + + + +The trigger threshold must be at least 50,000 tokens. See [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) for the other options (`pause_after_compaction`, custom `instructions`). + +### Text Completions is removed + +The legacy Text Completions API is removed from the TypeScript, Go, Java, and Ruby SDKs and from the CLI. Newer models and features don't support it. Use the [Messages API](https://platform.claude.com/docs/en/api/messages) instead. + + + + The `ant completions create` command is gone. + + ```bash + # Before + ant completions create \ + --model "$MODEL" \ + --max-tokens-to-sample 1024 \ + --prompt $'\n\nHuman: Hello, Claude\n\nAssistant:' + + # After + ant messages create \ + --model "$MODEL" \ + --max-tokens 1024 \ + --message '{role: user, content: "Hello, Claude"}' + ``` + + The reply text moves from the `completion` field to `content.0.text`, so a script that passed `--transform completion` passes `--transform content.0.text` instead. + + `ant messages create` also takes `--stream`, but its events have another shape: the text arrives in `delta.text` of `content_block_delta` events, so `--transform content.0.text` does not apply to a stream. + + + + `client.completions` is gone, along with the `Completions` resource class and the `Completion`, `CompletionCreateParams`, `CompletionCreateParamsNonStreaming`, and `CompletionCreateParamsStreaming` types. `AnthropicBedrock` no longer has a `completions` property either. The `HUMAN_PROMPT` and `AI_PROMPT` constants, which only Text Completions prompts used, are gone too, both as exports and as static properties of the client. + + ```typescript + // Before + const completion = await client.completions.create({ + model, + max_tokens_to_sample: 1024, + prompt: "\n\nHuman: Hello, Claude\n\nAssistant:" + }); + console.log(completion.completion); + + // After + const message = await client.messages.create({ + model, + max_tokens: 1024, + messages: [{ role: "user", content: "Hello, Claude" }] + }); + console.log(message.content); + ``` + + `client.completions.create({ ..., stream: true })` becomes `client.messages.create({ ..., stream: true })` or `client.messages.stream({ ... })`. + + + + `client.Completions` is gone, along with `CompletionService`, `NewCompletionService`, `CompletionNewParams`, and `Completion`. `aws.Client` no longer has a `Completions` field either. `bedrock.DefaultEndpoints` no longer lists `/v1/complete`. + + ```go + // Before + completion, err := client.Completions.New(ctx, anthropic.CompletionNewParams{ + Model: model, + MaxTokensToSample: 1024, + Prompt: "\n\nHuman: Hello, Claude\n\nAssistant:", + }) + fmt.Println(completion.Completion) + + // After + message, err := client.Messages.New(ctx, anthropic.MessageNewParams{ + Model: model, + MaxTokens: 1024, + Messages: []anthropic.MessageParam{ + anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Claude")), + }, + }) + fmt.Println(message.Content[0].Text) + ``` + + `client.Completions.NewStreaming` becomes `client.Messages.NewStreaming`. + + + + `client.completions()` is gone from `AnthropicClient` and `AnthropicClientAsync`, along with `CompletionService`, `CompletionServiceAsync`, and the `com.anthropic.models.completions` package (`CompletionCreateParams` and `Completion`). + + ```java + // Before + CompletionCreateParams params = CompletionCreateParams.builder() + .model(model) + .maxTokensToSample(1024) + .prompt("\n\nHuman: Hello, Claude\n\nAssistant:") + .build(); + + System.out.println(client.completions().create(params).completion()); + + // After + MessageCreateParams params = MessageCreateParams.builder() + .model(model) + .maxTokens(1024) + .addUserMessage("Hello, Claude") + .build(); + + client.messages().create(params).content().stream() + .flatMap(contentBlock -> contentBlock.text().stream()) + .forEach(textBlock -> System.out.println(textBlock.text())); + ``` + + `client.completions().createStreaming` becomes `client.messages().createStreaming`. + + + + `client.completions` is gone, along with `Anthropic::Resources::Completions`, `Anthropic::CompletionCreateParams`, and `Anthropic::Completion`. `Anthropic::BedrockClient` no longer has a `completions` reader either. On `Anthropic::BedrockMantleClient` and `Anthropic::GoogleCloudClient`, where `completions` raised `NotImplementedError`, the method no longer exists. + + ```ruby + # Before + completion = client.completions.create( + model: model, + max_tokens_to_sample: 1024, + prompt: "\n\nHuman: Hello, Claude\n\nAssistant:" + ) + puts(completion.completion) + + # After + message = client.messages.create( + model: model, + max_tokens: 1024, + messages: [{role: "user", content: "Hello, Claude"}] + ) + puts(message.content) + ``` + + `client.completions.create_streaming` becomes `client.messages.stream`. + + + +### `betas` is removed from the non-beta Models methods + +The non-beta Models methods no longer take `betas` (csharp, go: `Betas`; java: `.addBeta()`), and the `ant models` commands no longer take `--beta`. To send beta headers, call the same methods on `client.beta.models` (csharp, go: `client.Beta.Models`; java: `client.beta().models()`; php: `$client->beta->models`), or `ant beta:models` in the CLI. In the SDK, those methods return `BetaModelInfo` (ruby: `Anthropic::Beta::BetaModelInfo`) where the non-beta ones return `ModelInfo` (ruby: `Anthropic::ModelInfo`). + + + + ```bash + # Before + ant models list --beta "$BETA" + + # After + ant beta:models list --beta "$BETA" + ``` + + + + `client.models.retrieve()` and `client.models.list()` no longer take `betas` (passing it is a `TypeError`, and a type checker flags it), and `anthropic.types.ModelListParams` no longer has a `betas` key. + + ```python + # Before + page = client.models.list(betas=[beta]) + + # After + page = client.beta.models.list(betas=[beta]) + ``` + + + + `Anthropic.ModelRetrieveParams` and `Anthropic.ModelListParams` no longer have a `betas` property. + + ```typescript + // Before + const page = await client.models.list({ betas: [beta] }); + + // After + const page = await client.beta.models.list({ betas: [beta] }); + ``` + + + + `ModelRetrieveParams` and `ModelListParams` in `Anthropic.Models.Models` no longer have a `Betas` property. The methods on `client.Beta.Models` take the classes of the same names in `Anthropic.Models.Beta.Models`. + + ```csharp + // Before + using Anthropic.Models.Models; + + var page = await client.Models.List(new ModelListParams { Betas = [beta] }); + + // After + using Anthropic.Models.Beta.Models; + + var page = await client.Beta.Models.List(new ModelListParams { Betas = [beta] }); + ``` + + + + `ModelGetParams` and `ModelListParams` no longer have a `Betas` field. + + ```go + // Before + page, err := client.Models.List(ctx, anthropic.ModelListParams{ + Betas: []anthropic.AnthropicBeta{beta}, + }) + + // After + page, err := client.Beta.Models.List(ctx, anthropic.BetaModelListParams{ + Betas: []anthropic.AnthropicBeta{beta}, + }) + ``` + + + + `ModelRetrieveParams` and `ModelListParams` in `com.anthropic.models.models` no longer have `betas()`, and their builders no longer have `betas` and `addBeta`. The methods on `client.beta().models()` take the classes of the same names in `com.anthropic.models.beta.models`. + + ```java + // Before + import com.anthropic.models.models.ModelListPage; + import com.anthropic.models.models.ModelListParams; + + ModelListPage page = client.models().list(ModelListParams.builder().addBeta(beta).build()); + + // After + import com.anthropic.models.beta.models.ModelListPage; + import com.anthropic.models.beta.models.ModelListParams; + + ModelListPage page = client.beta().models().list(ModelListParams.builder().addBeta(beta).build()); + ``` + + + + `$client->models->retrieve()` and `$client->models->list()` no longer take `betas` (passing it throws `Error: Unknown named parameter $betas`), and `Anthropic\Models\ModelRetrieveParams` and `Anthropic\Models\ModelListParams` no longer have a `betas` property. + + ```php + // Before + $page = $client->models->list(betas: [$beta]); + + // After + $page = $client->beta->models->list(betas: [$beta]); + ``` + + If you pass arguments by position, `workspaceID` and `requestOptions` each move up one place in both methods. + + + + `client.models.retrieve` and `client.models.list` no longer take `betas:`, and `Anthropic::ModelRetrieveParams` and `Anthropic::ModelListParams` no longer have a `betas` field. + + ```ruby + # Before + page = client.models.list(betas: [beta]) + + # After + page = client.beta.models.list(betas: [beta]) + ``` + + Passing `betas:` to `client.models` does not raise, but it no longer sets the `anthropic-beta` header. + + + +### API keys are sent as `Authorization: Bearer` + +The SDK and the CLI send your API key as `Authorization: Bearer ` instead of in the `X-Api-Key` header, so change any proxy or gateway that reads or sets `X-Api-Key` to use `Authorization`, or [send the key in `X-Api-Key` yourself](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-proxy-x-api-key). The Claude API accepts a key in either header, so a program that talks to the API directly needs no change. + +```text wrap +# Before +X-Api-Key: + +# After +Authorization: Bearer +``` + + + + This applies to a key in `ANTHROPIC_API_KEY` and to one piped to `--api-key-stdin`. + + With `--debug`, the request log now shows `Authorization: Bearer ` where it showed `X-Api-Key: `. + + + + `Authorization` is the header `auth_token` already uses. + + This applies to the `api_key` argument and the `ANTHROPIC_API_KEY` environment variable of `Anthropic` and `AsyncAnthropic`, and to `api_key` and `ANTHROPIC_AWS_API_KEY` of `AnthropicAWS`. `AnthropicFoundry` still sends its key as `x-api-key`, and `AnthropicBedrockMantle` already sent a bearer token. + + + + `Authorization` is the header the `authToken` option already uses. + + This applies to the `apiKey` option, the `ANTHROPIC_API_KEY` environment variable, and `apiKey` and `ANTHROPIC_AWS_API_KEY` in `@anthropic-ai/aws-sdk`. `apiKey` in `@anthropic-ai/foundry-sdk` still goes out as `X-Api-Key`, and `apiKey` in `@anthropic-ai/bedrock-sdk` was already a bearer token. + + Middleware or a custom `fetch` that reads the key from the `x-api-key` request header needs to read `authorization` instead, where the key follows `Bearer `. + + + + `Authorization` is the header `AuthToken` already uses. + + This applies to `ApiKey` on `AnthropicClient` and `ClientOptions` and to the `ANTHROPIC_API_KEY` environment variable. In the `Anthropic.Aws` release that depends on v13, it also applies to `ApiKey` in `AwsClientOptions` and to `ANTHROPIC_AWS_API_KEY`. `AnthropicFoundryApiKeyCredentials` still sends its key as `x-api-key`, and `ApiKey` in `MantleAwsClientOptions` was already a bearer token. + + + + This applies to `option.WithAPIKey`, the `ANTHROPIC_API_KEY` environment variable, and `APIKey` in `aws.ClientConfig` (or `ANTHROPIC_AWS_API_KEY`). `APIKey` in `foundry.ClientConfig` (or `ANTHROPIC_FOUNDRY_API_KEY`) still goes out as `X-Api-Key`, and `APIKey` in `bedrock.MantleClientConfig` was already a bearer token. + + + + `Authorization` is the header `authToken` already uses. + + This applies to `apiKey` on the `AnthropicOkHttpClient`, `AnthropicOkHttpClientAsync`, and `AnthropicBackend` builders, the `ANTHROPIC_API_KEY` environment variable, and the `anthropic.apiKey` system property. `apiKey` on the `FoundryBackend` builder still goes out as `x-api-key`. `apiKey` on the `AwsBackend`, `BedrockBackend`, and `BedrockMantleBackend` builders was already a bearer token. + + An interceptor now sees the key in `Authorization` instead of `X-Api-Key`. + + + + `Authorization` is the header `authToken` already uses. + + This applies to the `apiKey` argument and the `ANTHROPIC_API_KEY` environment variable of `Anthropic\Client`, and to `apiKey` and `ANTHROPIC_AWS_API_KEY` of `Anthropic\Aws\Client`. `Anthropic\Foundry\Client` still sends its key as `x-api-key`, and `Anthropic\Bedrock\MantleClient` already sent a bearer token. + + + + `Authorization` is the header `auth_token:` already uses. + + This applies to the `api_key:` argument and the `ANTHROPIC_API_KEY` environment variable of `Anthropic::Client`, and to `api_key:` and `ANTHROPIC_AWS_API_KEY` of `Anthropic::AWSClient`. `Anthropic::BedrockMantleClient` already sent a bearer token. + + The SDK drops `Authorization` when it follows a redirect to another origin, which includes a redirect from `http` to `https` on the same host. The key is now dropped there too. + + + +#### If a proxy or gateway reads `X-Api-Key` + + + + If `--base-url` or `ANTHROPIC_BASE_URL` points `ant` at a proxy or gateway that reads `X-Api-Key`, change it to read the key from `Authorization`. `ant` has no flag or environment variable for adding a header of your own, so it can't send `X-Api-Key`. + + + + Move the key back with an `auth` function on the HTTP client. It runs on every request the client sends, including retries: + + ```python + import httpx2 + from anthropic import Anthropic, DefaultHttpxClient + + + def send_x_api_key(request: httpx2.Request) -> httpx2.Request: + if request.headers.get("Authorization") == f"Bearer {api_key}": + del request.headers["Authorization"] + request.headers["X-Api-Key"] = api_key + return request + + + client = Anthropic(api_key=api_key, http_client=DefaultHttpxClient(auth=send_x_api_key)) + ``` + + `AsyncAnthropic` takes the same function, in `http_client=DefaultAsyncHttpxClient(auth=send_x_api_key)`. + + + + Set the header yourself. `Authorization: null` stops the key from going out there as well: + + ```typescript + const client = new Anthropic({ + apiKey, + defaultHeaders: { "X-Api-Key": apiKey, Authorization: null } + }); + ``` + + If the proxy adds the credential and your client has none, v0 let you say so with either `"X-Api-Key": null` or `Authorization: null` in `defaultHeaders`. v1 accepts only `Authorization: null`. + + The environment work poller and worker are given their own key, so they leave `X-Api-Key` and `Authorization` default headers out of their own requests. + + + + Set the header yourself with `ExtraHeaders`. Setting `ApiKey` and `AuthToken` to `null` stops a credential found in `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` from going out as well: + + ```csharp + AnthropicClient client = new( + new ClientOptions + { + ApiKey = null, + AuthToken = null, + ExtraHeaders = new Dictionary { ["X-Api-Key"] = apiKey }, + } + ); + ``` + + + + Set the header yourself. `option.WithHeaderDel` stops a key found in `ANTHROPIC_API_KEY` from going out as well: + + ```go + client := anthropic.NewClient( + option.WithHeader("X-Api-Key", apiKey), + option.WithHeaderDel("Authorization"), + ) + ``` + + `environments.WorkPoller` and `environments.EnvironmentWorker` are given their own key, so they leave a hand-set `X-Api-Key` out of their own requests. + + + + Set the header yourself instead of calling `apiKey`: + + ```java + AnthropicClient client = AnthropicOkHttpClient.builder() + .putHeader("X-Api-Key", apiKey) + .build(); + ``` + + + + Move the key back with a middleware: + + ```php + use Anthropic\Client; + use Psr\Http\Message\RequestInterface; + use Psr\Http\Message\ResponseInterface; + + $sendXApiKey = fn (RequestInterface $request, callable $next): ResponseInterface => $next( + $request->withoutHeader('Authorization')->withHeader('X-Api-Key', $apiKey) + ); + + $client = new Client(apiKey: $apiKey, requestOptions: ['middleware' => [$sendXApiKey]]); + ``` + + Do not use the client's `extraHeaders` for this. A request that has `extraHeaders` of its own replaces the client's, and every endpoint under `$client->beta` that needs a beta header has them. + + + + Move the key back with a middleware: + + ```ruby + send_x_api_key = lambda do |req, nxt| + next nxt.call(req) unless req.headers["authorization"] == "Bearer #{api_key}" + nxt.call(req.with(headers: {**req.headers.except("authorization"), "x-api-key" => api_key})) + end + + client = Anthropic::Client.new(api_key: api_key, middleware: send_x_api_key) + ``` + + The first line leaves a request alone when it doesn't carry the key, such as one that was redirected to another origin. + + `Anthropic::AWSClient` takes no `middleware:` argument. Pass the middleware with each request instead, as `request_options: {middleware: send_x_api_key}`. + + + +#### If you set or removed `X-Api-Key` on a request + +This affects the Python, TypeScript, Go, PHP, and Ruby SDKs. + +If you removed `X-Api-Key` so that a request sent only an auth token, delete that code instead of changing it, because removing `Authorization` would remove the token. [A client holds one credential](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-one-credential), so make sure that it's the token: with none passed in code and both `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` set, the client uses the key. + + + + Code that passes `extra_headers={"X-Api-Key": omit}` to keep the key off a request no longer does that. Pass `extra_headers={"Authorization": omit}` instead. + + `extra_headers={"X-Api-Key": other_key}` no longer replaces the client's key: both keys go out. To send another key with one request, pass `extra_headers={"Authorization": f"Bearer {other_key}"}`. + + + + `headers: { "X-Api-Key": otherKey }` in a request's options no longer replaces the client's key: both keys go out. To send another key with one request, pass ``headers: { Authorization: `Bearer $\{otherKey}` }``. + + + + `option.WithHeaderDel("X-Api-Key")` no longer keeps the key off a request. Delete `Authorization` instead: + + ```go + // Before + client.Messages.New(ctx, params, option.WithHeaderDel("X-Api-Key")) + + // After + client.Messages.New(ctx, params, option.WithHeaderDel("Authorization")) + ``` + + `option.WithHeader("X-Api-Key", otherKey)` no longer replaces the client's key: both keys go out. To send another key with one request, pass `option.WithAPIKey(otherKey)`. + + + + `'extraHeaders' => ['X-Api-Key' => null]` no longer keeps the key off a request. To send a request with no credential, set `Authorization` to `null` instead, or remove it in a middleware if you did this for the whole client. + + `'extraHeaders' => ['X-Api-Key' => $otherKey]` no longer replaces the client's key: both keys go out. To send another key with one request, set `Authorization` to `"Bearer {$otherKey}"`. + + + + `extra_headers: {"x-api-key" => nil}` no longer keeps the key off a request. Set `"authorization"` to `nil` instead. To send another key with one request, set `"authorization"` to `"Bearer #{other_key}"`, not `"x-api-key"`. + + + +### A client holds one credential + +An API key and an auth token now share a header, so an SDK client holds one credential. With none passed in code, it follows the [credential precedence](https://platform.claude.com/docs/en/manage-claude/wif-reference#credential-precedence) order. + + + + v1 sent both an API key and an auth token when the client had both, each in its own header. The credential is one of `api_key`, `auth_token`, `credentials`, `config`, or `profile`. + + * **Pass at most one.** Two or more in the constructor, or in one `copy()` or `with_options()` call, raise `ValueError`. `None` doesn't count. v1 raised `TypeError`, and only for two of `credentials`, `config`, and `profile`. + * **The one you pass is the only one.** As in v1, the client does not look for another in the environment or on disk. + * **With none passed, only the first of these that is set is used:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, the profile that `ANTHROPIC_PROFILE` names, the workload identity federation variables, the active profile on disk (the one the `active_config` file names, otherwise `default`). When both of the first two are set, the client logs a warning once. v1 used the active profile ahead of the federation variables when `ANTHROPIC_CONFIG_DIR` was set or an `active_config` file existed; set `ANTHROPIC_PROFILE` to keep using it. + * **`copy()` and `with_options()` replace.** A credential you pass replaces the client's own, whichever kind either one is. A base URL and headers that came from the old credential's config or profile go with it, and the new credential's are used. A base URL you passed stays. + + ```python + client = Anthropic(api_key=key, auth_token=token) + + # Before: sent `X-Api-Key: ` and `Authorization: Bearer ` + # After: raises `ValueError` + ``` + + The platform clients keep their own rules. `AnthropicAWS` takes `auth_token` next to `api_key` without an error, and sends the key. + + The docstrings of `Anthropic.__init__` and `Anthropic.copy` in [`_client.py`](https://github.com/anthropics/anthropic-sdk-python/blob/main/src/anthropic/_client.py) have the details. + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, pass the token as `auth_token` and set `X-Api-Key` in `default_headers`. Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + + + In v0 a client that had both an API key and an auth token sent both, each in its own header. The credential is one of `apiKey`, `authToken`, `credentials`, `config`, or `profile`. + + * **Pass at most one.** Two or more in `new Anthropic()`, or in one `withOptions()` call, throw a `TypeError`. `null` and `undefined` don't count. + * **The one you pass is the only one.** The client does not look for another in the environment or on disk. + * **With none passed, the first of these is used:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, the profile that `ANTHROPIC_PROFILE` names, the workload identity federation variables, the active profile on disk (the one the `active_config` file names, otherwise `default`). When both of the first two are set, the client logs a warning once. In v0 the active profile came before the federation variables. An `ANTHROPIC_PROFILE` that names a missing profile was skipped in v0, and now the first request throws an `AnthropicError`. `loadConfig()` with no argument follows the same order and throws the same error. + * **`withOptions` replaces.** A credential you pass replaces the one of the client you copy, so `client.withOptions({ authToken })` no longer needs `apiKey: null` next to it. + * **A platform client takes only its platform's credentials.** The AWS, Bedrock, and Foundry clients and `AnthropicVertex` throw an `AnthropicError` for a credential option they don't authenticate with, as `AnthropicGoogleCloud` already did. On the AWS and Bedrock clients `apiKey: null` now clears the key, so the client signs with AWS credentials. `AnthropicBedrock` keeps its key in `client.apiKey`, where v0 kept it in `client.authToken`. + + ```typescript + // Before: sent the API key and ignored `credentials` + const client = new Anthropic({ apiKey, credentials }); + + // After: the line above throws a TypeError + const client = new Anthropic({ credentials }); + ``` + + The doc comments on [`ClientOptions`](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/src/client.ts) say how each option behaves, and the doc comment on each of those platform clients' constructors lists the options it rejects. + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, set `X-Api-Key` in `defaultHeaders` and keep `authToken`. Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + + + In v12 a client that had both an API key and an auth token sent both, each in its own header. The credential is one of `ApiKey`, `AuthToken`, or `ClientOptions.Credentials`. + + * **Passing two is an error.** Setting a second one throws an `ArgumentException`. `null` doesn't count, so to swap the credential in `ClientOptions` that you built yourself, set the old one to `null` first. + * **Passing one uses it and ignores the environment.** No credential environment variable or profile on disk is read. In the same way, `AnthropicCredentials.Resolve(profile: "name")` now returns that profile's credentials when `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` is set. + * **Passing none uses the first match in the environment:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, the workload identity federation variables, then the active profile on disk. An empty `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` counts as unset. When both of the first two are set, a warning goes to stderr once. The client looks when it is first used, so an `ANTHROPIC_PROFILE` that doesn't exist now throws from the first request instead of the constructor. + * **`WithOptions` replaces.** A credential you pass in the modifier replaces the client's, whichever kind that was, so `AuthToken = token` no longer needs `ApiKey = null` next to it. With none passed, the copy keeps the client's credential, `BaseUrl`, and `ExtraHeaders`, even when the modifier returns new `ClientOptions`. + + ```csharp + // Before: sent both, each in its own header + AnthropicClient client = new() { ApiKey = apiKey, AuthToken = token }; + + // After: the line above throws an ArgumentException + AnthropicClient client = new() { AuthToken = token }; + ``` + + The XML docs on those three properties of [`ClientOptions`](https://github.com/anthropics/anthropic-sdk-csharp/blob/main/src/Anthropic/Core/ClientOptions.cs) have the details. + + Cloud platform clients keep the credentials they were built with. The Bedrock, Bedrock Mantle, Foundry, Google Cloud, and AWS clients and `AnthropicVertexClient` decide how to authenticate when you build them, and most of them use the `Authorization` header for it. The releases of these packages that depend on v13 ignore an `ApiKey` or `AuthToken` that you set through `WithOptions`. To use another key with `AnthropicAwsClient`, build a new client with `ApiKey` in `AwsClientOptions`. + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, set `X-Api-Key` with `ExtraHeaders` and keep `AuthToken`. Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + + + In v1 a client that had both an API key and an auth token sent both, each in its own header. The credential comes from `option.WithAPIKey`, `option.WithAuthToken`, `option.WithConfig`, `option.WithProfile`, or `option.WithFederationTokenProvider`. + + * **Two of them passed to `anthropic.NewClient` are an error.** `NewClient` returns no error, so every request the client makes fails with it. `NewClient` already applies `anthropic.DefaultClientOptions()`, so don't pass its result as well: the credential it finds in the environment then counts as one you passed. + * **One of them is used as it is.** No credential is read from the environment or from a profile on disk. In v1 `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` won over the last three. + * **With none of them, the first of these that is set is used,** in the same order as v1: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, the workload identity federation variables, the active profile on disk. When both of the first two are set, the SDK logs a warning once. + * **One of them on a request replaces the client's credential for that request,** so `option.WithAuthToken` no longer needs `option.WithHeaderDel("X-Api-Key")` next to it. + + ```go + // Before: the API key was sent and a warning was logged + client := anthropic.NewClient( + option.WithAPIKey(apiKey), + option.WithProfile("work"), + ) + + // After: every request of the client above fails, so pass the one you want + client := anthropic.NewClient(option.WithAPIKey(apiKey)) + ``` + + The warning that v1 logged is gone, so `option.WithConfigQuiet`, which suppressed it, now does what `option.WithConfig` does and is deprecated. + + The doc comments on `anthropic.NewClient` and `anthropic.DefaultClientOptions` in [`client.go`](https://github.com/anthropics/anthropic-sdk-go/blob/main/client.go) have the details. + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, set `X-Api-Key` with `option.WithHeader` and keep `option.WithAuthToken`. Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + `ANTHROPIC_CUSTOM_HEADERS` and `ANTHROPIC_WEBHOOK_SIGNING_KEY` now apply to every client that `anthropic.NewClient` builds. In v1 they were read only when neither the environment nor a profile on disk held a credential. + + + + In v2 a client that had both an API key and an auth token sent both, each in its own header. The credential is one of `apiKey`, `authToken`, or `configurationProvider` on the `AnthropicOkHttpClient`, `AnthropicOkHttpClientAsync`, and `AnthropicBackend` builders. + + * **Set at most one.** With two on one builder, `build()` throws an `IllegalStateException` that names them. `null` or an empty `Optional` does not count. + * **The one you set is the only one.** `fromEnv()`, called before or after, takes no credential from the environment or from a profile on disk. In v2, a key or token that `fromEnv()` found could be sent as well, or instead. + * **With none set, `fromEnv()` uses the first of these that it finds:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, the workload identity federation variables, the active profile on disk. When both of the first two are set, a warning goes to `System.err` once. The `anthropic.apiKey` and `anthropic.authToken` system properties count as the environment. An empty key or token, in a variable or a system property, counts as unset. In v2, `fromEnv()` used the empty value as the key or token. + + ```java + // Before: both were sent. In v3, build() throws an IllegalStateException + AnthropicClient client = AnthropicOkHttpClient.builder() + .apiKey(apiKey) + .authToken(authToken) + .build(); + + // After + AnthropicClient client = AnthropicOkHttpClient.builder() + .apiKey(apiKey) + .build(); + ``` + + The documentation of `fromEnv()` on those builders has the details. + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, set both headers yourself: + + ```java + AnthropicClient client = AnthropicOkHttpClient.builder() + .putHeader("Authorization", "Bearer " + gatewayToken) + .putHeader("X-Api-Key", apiKey) + .build(); + ``` + + Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + + + Earlier versions sent both an API key and an auth token when the client had both, each in its own header. `Anthropic\Client` takes one credential, from `apiKey`, `authToken`, or `credentials`: + + * Passing more than one of them throws `\InvalidArgumentException`. Only `null` counts as not passed. An empty string counts as passed, so `new Client(apiKey: '')` sends no credential. + * Passing one uses it, and no credential is read from the environment or from a profile on disk. With `ANTHROPIC_API_KEY` set, `new Client(authToken: $token)` sends the token. Earlier versions sent the environment's key with it. + * Passing none uses the first of these that is set: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, the profile named by `ANTHROPIC_PROFILE`, the workload identity federation variables, the active profile on disk (the one the `active_config` file names, otherwise `default`). Earlier versions used the active profile before the federation variables, and used no profile when there was no `active_config` file. They also skipped an `ANTHROPIC_PROFILE` that named a missing or invalid profile. For that, `new Client()` now throws `Anthropic\Core\Exceptions\AnthropicException`. With both `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` set, the client sends the key and its `authToken` property is empty. The first client built that way also writes a warning with `error_log()`, once per process, which on a web server means once per request: `Anthropic: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN are both set. Using ANTHROPIC_API_KEY.` To stop it, unset the variable you don't use. + + ```php + // Before: sent the key as X-Api-Key and the token as Authorization. + // After: throws "Pass at most one of `apiKey`, `authToken`, or `credentials`. Received `apiKey`, `authToken`." + $client = new Client(apiKey: $key, authToken: $token); + ``` + + If you relied on sending both, for example a token for a gateway and a key for the API behind it, pass the token as `authToken` and add `X-Api-Key` in a middleware like the one under [If a proxy or gateway reads `X-Api-Key`](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-proxy-x-api-key), without the `withoutHeader` call. Have the gateway remove its `Authorization` header before it forwards the request. The Claude API expects one credential per request. + + + + The credential arguments of `Anthropic::Client.new` are `api_key:`, `auth_token:`, `credentials:`, and `config:`. A `nil` argument counts as not passed. The platform clients keep their own rules. + + * **Two or more passed:** `Anthropic::Client.new` raises `ArgumentError`. Earlier versions raised only for `credentials:` with `config:`, and otherwise sent the key if there was one, then the token. + * **One passed:** The client uses it, and does not fall back to a credential from the environment or from a profile on disk. + * **None passed:** The client uses the first of these it finds: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, the workload identity federation variables, the active profile on disk. The order has not changed, but with both `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` set, `client.auth_token` is now `nil`. An empty `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` now counts as unset, where earlier versions let an empty `ANTHROPIC_API_KEY` hide the token and everything after it. + + When no credential is passed and both `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` are set, the SDK also warns once per process, on standard error through `Kernel#warn`: `Anthropic: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN are both set. Using ANTHROPIC_API_KEY.` Unset the variable you don't use to silence it. + + ```ruby + # Before: sent the key and ignored the token. + # After: ArgumentError, "Pass at most one of `api_key:`, `auth_token:`, `credentials:`, or `config:`. Received `api_key:`, `auth_token:`." + Anthropic::Client.new(api_key: api_key, auth_token: auth_token) + + # Pass the one you want sent. + Anthropic::Client.new(api_key: api_key) + ``` + + + +### Changes in one SDK or the CLI + +These changes each affect one SDK or the CLI. + + + + **`--api-key` and `--auth-token` are removed.** `ant` no longer takes an API key or auth token as a flag value, because a value on the command line is visible in shell history and process listings. Both flags have printed a deprecation warning since v1.27.0. A command that still passes one stops with `flag provided but not defined`. + + | Removed | Use instead | + | ---------------------- | ----------------------------------------------------------- | + | `--api-key ` | `ANTHROPIC_API_KEY`, `--api-key-stdin`, or `ant auth login` | + | `--auth-token ` | `ANTHROPIC_AUTH_TOKEN` or `--auth-token-stdin` | + + ```bash + # Before + ant --api-key "$KEY" models list + + # After, from the environment + export ANTHROPIC_API_KEY="$KEY" + ant models list + + # After, from a secret manager + op read op://vault/anthropic/api-key | ant --api-key-stdin models list + ``` + + `--api-key-stdin` and `--auth-token-stdin` read all of standard input, so a command that uses one takes its request body from flags. + + `ant auth status`, the first-run prompt of `ant apply`, and the note about multiple auth sources now call these credentials `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN`, where they printed `--api-key / ANTHROPIC_API_KEY` and `--auth-token / ANTHROPIC_AUTH_TOKEN`. + + + + **A union's `Type` is an enum.** In v12, the `Type` property of a union class, such as `ContentBlock.Type` or `RawMessageStreamEvent.Type`, was a `JsonElement`. In v13 it is an `ApiEnum`, where `T` is a new enum with one member for each variant, such as `ContentBlockType`. A few unions are told apart by `Name` or `Command` instead, such as `BetaMemoryTool20250818Command.Command`, and those properties change in the same way. The `Type` of a variant class, such as `TextBlock.Type`, is still a `JsonElement`. + + ```csharp + // Before + if (block.Type.GetString() == "tool_use") { } + + // After + if (block.Type.Value() == ContentBlockType.ToolUse) { } + ``` + + `block.Type.Raw()` returns the string, including one that this version of the SDK has no enum member for. + + **`IChatClient` ignores sampling options.** The `IChatClient` adapters (`AsIChatClient()`) now ignore `ChatOptions.Temperature`, `ChatOptions.TopK`, and `ChatOptions.TopP`. See [Sampling parameters are removed](https://platform.claude.com/docs/en/api/migration-2026-10-21#sampling-parameters). + + + + **`vertex.DefaultVersion` and `bedrock.DefaultVersion` are removed.** + + + + **Getters that now return an `Optional`.** `apiKey()` and `authToken()` on `AnthropicBackend` now return an `Optional`, as `apiKey()` on `AwsBackend` and `BedrockMantleBackend` already did. In v2 each returned a `String`, which was `null` when the backend had no credential of that kind. + + ```java + // Before + String apiKey = backend.apiKey(); + if (apiKey != null) {} + + // After + Optional apiKey = backend.apiKey(); + if (apiKey.isPresent()) {} + ``` + + These getters now return an `Optional` too. In v2 each returned the value itself, which was `null` when there was none: + + * `apiKey()` and `awsCredentialsProvider()` on `BedrockBackend` + * `filename()` and `mimeType()` on `McpResourceFile` + * `detail()` on `CredentialSource` + * `body()` on `HttpRequest` + * `resource()` on `FoundryBackend`, which was `getResource()` + * `responseValidation()`, `timeout()`, `followRedirects()`, `fallbackState()`, and `openTelemetry()` on `RequestOptions`, which were `getResponseValidation()`, `getTimeout()`, `getFollowRedirects()`, `getFallbackState()`, and `getOpenTelemetry()` + + ```java + // Before + String filename = file.filename(); + if (filename != null) {} + String resource = backend.getResource(); + + // After + Optional filename = file.filename(); + if (filename.isPresent()) {} + Optional resource = backend.resource(); + ``` + + `getBaseUrl()` on `FoundryBackend` is removed. Call `baseUrl()`, which returns the URL that requests go to. That is the base URL you set, or the one built from the resource, and it ends in `/anthropic`. + + `getBaseUrl()` on `AnthropicBackend` is removed too. Call `baseUrl()`, which returns the same value. + + **`HttpRequest` requires a base URL.** If you build an `HttpRequest` yourself, such as in a test of an interceptor, set its base URL. Without one, `build()` now throws an `IllegalStateException`. In v2 it returned a request whose `baseUrl()` was `null`. The requests that the SDK builds already had one. + + ```java + // Before + HttpRequest request = HttpRequest.builder() + .method(HttpMethod.GET) + .build(); + + // After + HttpRequest request = HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.anthropic.com") + .build(); + ``` + + `baseUrl()` still returns a `String`, which is now never `null`. On the builder, `baseUrl(Optional)` is removed and `baseUrl(String)` no longer accepts `null`. + + **Interceptors see `anthropic-version`.** The client now adds the default `anthropic-version` header before interceptors run. In v2, the backend added it after them. If your interceptor sets its own version, call `replaceHeaders`, because `putHeader` now adds a second value: + + ```java + // Before + request.toBuilder().putHeader("anthropic-version", version).build(); + + // After + request.toBuilder().replaceHeaders("anthropic-version", version).build(); + ``` + + + + **Enum cases you pass are read back as their values.** `with()` and setters such as `withAllowedCallers()` still take an enum case or its value. Earlier versions kept a case as you passed it. v1 keeps the case's value, which is what the property types already declare. Objects that the SDK builds from a response don't change, and the JSON that the SDK sends is the same. If you read a property back and compare it with a case, the comparison is now false and nothing throws, so compare it with the case's value: + + ```php + $tool = CodeExecutionTool20250825::with(allowedCallers: [AllowedCaller::DIRECT]); + + // Before + in_array(AllowedCaller::DIRECT, $tool->allowedCallers, true); + + // After + in_array(AllowedCaller::DIRECT->value, $tool->allowedCallers, true); + ``` + + + + **`Anthropic::VertexClient::DEFAULT_VERSION` and `Anthropic::BedrockClient::DEFAULT_VERSION` are removed.** + + + +### The license is Apache 2.0 + +Starting with these versions, the SDK and the CLI are licensed under the Apache License, Version 2.0. Earlier versions remain under the MIT License. No code changes are needed. If you track the licenses of your dependencies, update their entries. + +* **TypeScript:** The platform packages (`@anthropic-ai/bedrock-sdk`, `@anthropic-ai/vertex-sdk`, `@anthropic-ai/foundry-sdk`, `@anthropic-ai/aws-sdk`, and `@anthropic-ai/google-cloud-sdk`) change license in their own 1.0.0 releases. +* **C#:** The other packages (`Anthropic.Bedrock`, `Anthropic.Vertex`, `Anthropic.Foundry`, `Anthropic.Aws`, `Anthropic.GoogleCloud`, and `Anthropic.Mcp`) change license in their own 1.0.0 releases. +* **Java:** The change covers every `com.anthropic` artifact. diff --git a/content/en/api/opentelemetry/spans.md b/content/en/api/opentelemetry/spans.md index ac37738fb1..aa9307b268 100644 --- a/content/en/api/opentelemetry/spans.md +++ b/content/en/api/opentelemetry/spans.md @@ -71,7 +71,7 @@ In a Managed Agents session, spans have the following attributes. A session's sp ### Content attributes -Attributes tagged with Content are only on spans in content mode, from the SDK and the API alike. See [how the content modes differ in the guide](https://platform.claude.com/docs/en/manage-claude/opentelemetry#choose-a-content-mode). When this content is too large, the SDK and the API [shorten it](https://platform.claude.com/docs/en/manage-claude/opentelemetry#content-limits) and set `anthropic.content.truncated` to `true`. If Anthropic's safeguards withhold content from a response, the API's spans don't include that content either. +Attributes tagged with Content are only on spans in content mode, from the SDK and the API alike. See [how the content modes differ in the guide](https://platform.claude.com/docs/en/manage-claude/opentelemetry#choose-a-content-mode). When this content is too large, the SDK and the API shorten it to fit the [content limits](https://platform.claude.com/docs/en/manage-claude/opentelemetry#content-limits) and set `anthropic.content.truncated` to `true`. If Anthropic's safeguards withhold content from a response, the API's spans don't include that content either. The message attributes are JSON strings in the message format of the OpenTelemetry GenAI conventions. Each Anthropic content block becomes one GenAI conventions message part, on the Messages API and in Managed Agents message events such as `agent.message`: @@ -207,7 +207,7 @@ The same as [`anthropic.sessions.`](https://platform.claude.com/docs/en/ * The [`anthropic.sessions.create`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-sessions-create) span, for the first turn of a session that was created with non-empty [`initial_events`](https://platform.claude.com/docs/en/api/beta/sessions/create#create.initial_events). * The [`anthropic.sessions.events.send`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-sessions-events-send) span for the request in which the event was sent, for a turn that started because of an event, for example a [`user.message`](https://platform.claude.com/docs/en/api/beta/sessions/events#beta_managed_agents_user_message_event) event. - * The [`anthropic.sessions.update`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-sessions-update) span, for a turn that resumes because the session budget was raised or removed through the request. + * The [`anthropic.sessions.update`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-sessions-update) span, for a turn that resumes because the request raises or removes the session budget. * The `anthropic.session.turn` span for the turn of [the agent that the session runs](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) during which that agent started this turn, for a turn on another thread. * The `anthropic.session.turn` span for the turn that produced the reply, for a turn that starts because an agent on another thread replied, such as an agent that the primary agent called. * None, for any other turn, such as a turn that starts because a [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs) ended. @@ -439,15 +439,15 @@ A span covers its whole request, retries included, and has each attribute of the Every SDK span for a request, including [`anthropic.messages.create`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-messages-create), [`anthropic.messages.count_tokens`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-messages-count-tokens), and [`anthropic.messages.batches.`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-messages-batches-method), has the following attributes: -| Attribute | Type | Description | -| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `gen_ai.conversation.id` | `string` | The conversation ID passed with the [`conversation_id` (typescript, java, php: `conversationId`; csharp: `ConversationId`; go: `option.WithOpenTelemetryConversationID()`) option](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk#configure-the-sdk). Without one, the session thread ID on the Managed Agents requests that [Session attributes](https://platform.claude.com/docs/en/api/opentelemetry/spans#session-attributes) lists, and absent on other requests. | -| `anthropic..id` | `string` | One attribute for each ID in the request's path and one for the ID of an object that the method creates. The name comes from the path, in the singular, for example `anthropic.session.id` or `anthropic.session.thread.id`. | -| `gen_ai.agent.id` | `string` | The agent ID, on the agent methods. | -| `gen_ai.memory.store.id` | `string` | The memory store ID, on the memory store methods. | -| `gen_ai.memory.record.id` | `string` | The memory ID, on the memory methods. | -| `http.request.resend_count` | `int` | The number of times that the SDK resent the request, for any reason, such as a retry. Absent when the SDK didn't resend it. | -| `error.type` | `string` | A failed call's [error type](https://platform.claude.com/docs/en/api/errors#http-errors), for example `rate_limit_error`. The HTTP status code, for example `502`, when the error response doesn't have an error type. `connection_error`, `client_timeout_error`, or `client_error` when the call failed in the SDK. `api_error` when the server ended a stream early. | -| `server.address` | `string` | The host of the client's base URL, `api.anthropic.com` by default. On a cloud platform's client, that platform's host. | -| `url.query` | `string` | The URL's query string, with only the query parameters that the endpoint defines. Absent when there are none. In metadata-only mode, absent when the query has a sensitive parameter, such as `email`. | -| `url.full` | `string` | The URL, made of `url.scheme`, `server.address`, the port when the base URL has one, `url.path`, and `url.query`. In metadata-only mode, absent whenever that mode leaves out `url.query`. | +| Attribute | Type | Description | +| --------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `gen_ai.conversation.id` | `string` | The conversation ID passed with the [`conversation_id` (typescript, java, php: `conversationId`; csharp: `ConversationId`; go: `option.WithOpenTelemetryConversationID()`) option](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk#configure-the-sdk). Without one, the session thread ID on requests to one session thread, and on the request in which the session tool runner sends a tool's result. Absent on other requests. | +| `anthropic..id` | `string` | One attribute for each ID in the request's path and one for the ID of an object that the method creates. The name comes from the path, in the singular, for example `anthropic.session.id` or `anthropic.session.thread.id`. | +| `gen_ai.agent.id` | `string` | The agent ID, on the agent methods. | +| `gen_ai.memory.store.id` | `string` | The memory store ID, on the memory store methods. | +| `gen_ai.memory.record.id` | `string` | The memory ID, on the memory methods. | +| `http.request.resend_count` | `int` | The number of times that the SDK resent the request, for any reason, such as a retry. Absent when the SDK didn't resend it. | +| `error.type` | `string` | A failed call's [error type](https://platform.claude.com/docs/en/api/errors#http-errors), for example `rate_limit_error`. The HTTP status code, for example `502`, when the error response doesn't have an error type. `connection_error`, `client_timeout_error`, or `client_error` when the call failed in the SDK. `api_error` when the server ended a stream early. | +| `server.address` | `string` | The host of the client's base URL, `api.anthropic.com` by default. On a cloud platform's client, that platform's host. | +| `url.query` | `string` | The URL's query string, with only the query parameters that the endpoint defines. Absent when there are none. In metadata-only mode, absent when the query has a sensitive parameter, such as `email`. | +| `url.full` | `string` | The URL, made of `url.scheme`, `server.address`, the port when the base URL has one, `url.path`, and `url.query`. In metadata-only mode, absent whenever that mode leaves out `url.query`. | diff --git a/content/en/api/overview.md b/content/en/api/overview.md index 9dbd53aec0..7cf9b73446 100644 --- a/content/en/api/overview.md +++ b/content/en/api/overview.md @@ -23,18 +23,18 @@ For step-by-step setup instructions, see [Get started](https://platform.claude.c The Claude API includes the following APIs: -* **[Messages API](https://platform.claude.com/docs/en/api/messages/create)**: Send messages to Claude for conversational interactions (`POST /v1/messages`) -* **[Message Batches API](https://platform.claude.com/docs/en/api/messages/batches/create)**: Process large volumes of Messages requests asynchronously with 50% cost reduction (`POST /v1/messages/batches`) -* **[Token Counting API](https://platform.claude.com/docs/en/api/messages/count_tokens)**: Count tokens in a message before sending to manage costs and rate limits (`POST /v1/messages/count_tokens`) -* **[Models API](https://platform.claude.com/docs/en/api/models/list)**: List available Claude models and their details (`GET /v1/models`) -* **[Files API](https://platform.claude.com/docs/en/api/files/upload)**: Upload and manage files for use across multiple API calls (`POST /v1/files`, `GET /v1/files`) -* **[Skills API](https://platform.claude.com/docs/en/api/skills/create)**: Create and manage custom agent skills (`POST /v1/skills`, `GET /v1/skills`) +* **[Messages API](https://platform.claude.com/docs/en/api/messages/create):** Send messages to Claude for conversational interactions (`POST /v1/messages`) +* **[Message Batches API](https://platform.claude.com/docs/en/api/messages/batches/create):** Process large volumes of Messages requests asynchronously with a 50 percent cost reduction (`POST /v1/messages/batches`) +* **[Token Counting API](https://platform.claude.com/docs/en/api/messages/count_tokens):** Count tokens in a message before sending to manage costs and rate limits (`POST /v1/messages/count_tokens`) +* **[Models API](https://platform.claude.com/docs/en/api/models/list):** List available Claude models and their details (`GET /v1/models`) +* **[Files API](https://platform.claude.com/docs/en/api/files/upload):** Upload and manage files for use across multiple API calls (`POST /v1/files`, `GET /v1/files`) +* **[Skills API](https://platform.claude.com/docs/en/api/skills/create):** Create and manage custom agent skills (`POST /v1/skills`, `GET /v1/skills`) The following APIs are in beta: -* **[Agents API](https://platform.claude.com/docs/en/managed-agents/agent-setup)**: Define reusable, versioned agent configurations for Claude Managed Agents (`POST /v1/agents`, `GET /v1/agents`) -* **[Sessions API](https://platform.claude.com/docs/en/managed-agents/sessions)**: Run stateful agent sessions in managed cloud sandboxes (`POST /v1/sessions`, `GET /v1/sessions/{id}/events/stream`) -* **[Environments API](https://platform.claude.com/docs/en/managed-agents/environments)**: Configure sandbox templates for agent sessions (`POST /v1/environments`, `GET /v1/environments`) +* **[Agents API](https://platform.claude.com/docs/en/managed-agents/agent-setup):** Define reusable, versioned agent configurations for Claude Managed Agents (`POST /v1/agents`, `GET /v1/agents`) +* **[Sessions API](https://platform.claude.com/docs/en/managed-agents/sessions):** Run stateful agent sessions in managed cloud sandboxes (`POST /v1/sessions`, `GET /v1/sessions/{id}/events/stream`) +* **[Environments API](https://platform.claude.com/docs/en/managed-agents/environments):** Configure sandbox templates for agent sessions (`POST /v1/environments`, `GET /v1/environments`) For the complete API reference with all endpoints, parameters, and response schemas, explore the API reference pages listed in the navigation. To access beta features, see [Beta headers](https://platform.claude.com/docs/en/api/beta-headers). @@ -42,13 +42,13 @@ For the complete API reference with all endpoints, parameters, and response sche For details on each authentication method and when to use it, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). Requests to the Claude API include these headers: -| Header | Value | Required | -| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Authorization` | `Bearer `, where `` is your API key or a short-lived access token obtained from `POST /v1/oauth/token` through [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) | Yes, unless `x-api-key` is set | -| `x-api-key` | Your API key from Console. Legacy fallback for `Authorization`, still supported | No | -| `anthropic-workspace-id` | ID of the [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) the request runs in (for example, `wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ`). See [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). | Required with a multi-workspace API key. Optional for other API keys. A key created for a single workspace runs in that workspace when you omit the header. Not used with Workload Identity Federation tokens, which select a workspace at token exchange. | -| `anthropic-version` | API version (for example, `2023-06-01`) | Yes | -| `content-type` | `application/json` | Yes | +| Header | Value | Required | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Authorization` | `Bearer `, where `` is your API key or a short-lived access token obtained from `POST /v1/oauth/token` through [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) | Yes, unless `x-api-key` is set | +| `x-api-key` | Your API key from Console. Legacy fallback for `Authorization`, still supported | No | +| `anthropic-workspace-id` | ID of the [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) the request runs in (for example, `wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ`). See [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). | Required with an API key that isn't scoped to a workspace. Optional for other API keys. A key created for a single workspace runs in that workspace when you omit the header. Not used with Workload Identity Federation tokens, which select a workspace at token exchange. | +| `anthropic-version` | API version (for example, `2026-10-21`) | Yes | +| `content-type` | `application/json` | Yes | If you are using the [Client SDKs](https://platform.claude.com/docs/en/api/overview#client-sdks), the SDK sends the authentication, version, and content-type headers automatically; you pass `anthropic-workspace-id` yourself when your key needs it. For API versioning details, see [API versions](https://platform.claude.com/docs/en/api/versioning). @@ -70,9 +70,9 @@ Anthropic provides official SDKs that simplify API integration by handling authe * Streaming support * Request timeouts and connection management -For a list of client SDKs, see [Client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview). +For a list of client SDKs, see [SDKs, CLI, and libraries](https://platform.claude.com/docs/en/cli-sdks-libraries/overview). -## Claude API vs cloud platforms +## Claude API versus cloud platforms Claude is available through the direct Claude API and through cloud platforms. Choose based on your infrastructure, feature availability, compliance requirements, and pricing preferences. @@ -105,12 +105,12 @@ Access Claude through AWS, Google Cloud, or Microsoft Azure: ### Request size limits -| Endpoint | Maximum request size | -| --------------------------------------------------------------------------------------------- | -------------------- | -| Messages, Token Counting | 32 MB | -| [Message Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing) | 256 MB | -| [Files API](https://platform.claude.com/docs/en/build-with-claude/files) | 500 MB | -| Sessions, Agents, Environments | 32 MB | +| Endpoint | Maximum request size | +| -------------------------------------------------------------------------------------------------------------------- | -------------------- | +| Messages, Token Counting | 32 MB | +| Message Batches API (see [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing)) | 256 MB | +| [Files API](https://platform.claude.com/docs/en/build-with-claude/files) | 500 MB | +| Sessions, Agents, Environments | 32 MB | If you exceed these limits, you'll receive a 413 `request_too_large` error. @@ -148,10 +148,10 @@ List endpoints return results in pages. Most newer list endpoints use the `page` To go back a page, pass `prev_page` as the `page` parameter. `prev_page` is `null` when you're on the first page. Not all list endpoints support `prev_page`. Only `GET /v1/sessions` returns `prev_page`; on list endpoints that do not support backward pagination, the field is absent from the response rather than `null`. For a request walkthrough, see [Listing sessions](https://platform.claude.com/docs/en/managed-agents/session-operations#listing-sessions). -The SDK provides an auto-paginating iterator that follows `next_page` for you. For example, `for session in client.beta.sessions.list()` (typescript: `for await (const session of client.beta.sessions.list())`; go: `client.Beta.Sessions.ListAutoPaging()`; java: `client.beta().sessions().list().autoPager()`; csharp: `(await client.Beta.Sessions.List()).Paginate()`; php: `$client->beta->sessions->list()->pagingEachItem()`; ruby: `client.beta.sessions.list.auto_paging_each`) walks through every session. SDK auto-pagination is forward-only; to go back a page, read `prev_page` from the response and pass it back as the `page` parameter yourself. See [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) for details. +The SDK provides an auto-paginating iterator that follows `next_page` for you. For example, `for session in client.beta.sessions.list()` (typescript: `for await (const session of client.beta.sessions.list())`; go: `client.Beta.Sessions.ListAutoPaging()`; java: `client.beta().sessions().list().autoPager()`; csharp: `(await client.Beta.Sessions.List()).Paginate()`; php: `$client->beta->sessions->list()->pagingEachItem()`; ruby: `client.beta.sessions.list.auto_paging_each`) walks through every session. SDK auto-pagination is forward-only; to go back a page, read `prev_page` from the response and pass it back as the `page` parameter yourself. See [SDKs, CLI, and libraries](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) for details. - Some list endpoints use a different cursor scheme. The [Message Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Models API](https://platform.claude.com/docs/en/api/models/list), and several [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) endpoints take `after_id` and `before_id` query parameters instead of `page`. Their responses return `has_more`, `first_id`, and `last_id` instead of `next_page`. See the reference page for each endpoint for its exact pagination fields. + Some list endpoints use a different cursor scheme. The Message Batches API (see [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing)), the [Models API](https://platform.claude.com/docs/en/api/models/list), and several [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) endpoints take `after_id` and `before_id` query parameters instead of `page`. Their responses return `has_more`, `first_id`, and `last_id` instead of `next_page`. See the reference page for each endpoint for its exact pagination fields. ## Rate limits and availability @@ -160,10 +160,10 @@ The SDK provides an auto-paginating iterator that follows `next_page` for you. F The API enforces rate limits and spend limits to prevent misuse and manage capacity. Limits are organized into usage tiers; your organization is placed on a tier automatically and can move to a higher tier over time. Each tier has: -* **Spend limits**: Maximum monthly cost for API usage -* **Rate limits**: Maximum number of requests per minute (RPM) and tokens per minute (TPM) +* **Spend limits:** Maximum monthly cost for API usage +* **Rate limits:** Maximum number of requests per minute (RPM) and tokens per minute (TPM) -In the Console, you can view your rate limits on the [Rate limits](https://platform.claude.com/usage/limits) page and your spend limits on the [Billing](https://platform.claude.com/settings/billing) page. For higher rate limits or a higher monthly spend cap, use **Request tier increase** on the Rate limits page. +In the Console, you can view your rate limits on the [Rate limits](https://platform.claude.com/usage/limits) page and your spend limits on the [Billing](https://platform.claude.com/settings/billing) page. For higher rate limits or a higher monthly spend cap, use **Request tier increase** on the **Rate limits** page. For detailed information about limits, tiers, and the token bucket algorithm used for rate limiting, see [Rate limits](https://platform.claude.com/docs/en/api/rate-limits). diff --git a/content/en/api/rate-limits.md b/content/en/api/rate-limits.md index 4d9de8c124..15426d4a84 100644 --- a/content/en/api/rate-limits.md +++ b/content/en/api/rate-limits.md @@ -13,7 +13,7 @@ There are two types of limits: 1. **Spend limits** set a maximum monthly cost an organization can incur for API usage. 2. **Rate limits** set the maximum number of API requests an organization can make over a defined period of time. -The API enforces service-configured limits at the organization level, but you may also set user-configurable limits for your organization's workspaces. +The API enforces service-configured limits at the organization level, but you can also set user-configurable limits for your organization's workspaces. ## About rate limits @@ -80,21 +80,21 @@ You can also set your own spend limit below your tier's cap to control costs: -When usage reaches a spend limit you set, requests return HTTP 400 with error type `invalid_request_error`. The message begins `You have reached your specified API usage limits`, or `You have reached your specified workspace API usage limits` for a workspace limit, and states when access resumes. Raise or remove the limit to restore access sooner. +When usage reaches a spend limit you set, requests return HTTP 400 with error type `invalid_request_error`. The message starts with `You have reached your specified API usage limits`, or `You have reached your specified workspace API usage limits` for a workspace limit, and states when access resumes. Raise or remove the limit to restore access sooner. Limits on the [Claude Code workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#claude-code-workspace) are checked separately: Claude Code requests over that workspace's limit can instead receive a 429 that carries a `retry-after` header. ## Rate limits -The rate limits for the Messages API are measured in requests per minute (RPM), input tokens per minute (ITPM), and output tokens per minute (OTPM) for each model class. If you exceed any of the rate limits you will get a [429 error](https://platform.claude.com/docs/en/api/errors) describing which rate limit was exceeded. When the response has a `retry-after` header, wait that many seconds before retrying. +The rate limits for the Messages API are measured in requests per minute (RPM), input tokens per minute (ITPM), and output tokens per minute (OTPM) for each model class. If you exceed any of the rate limits, you will get a [429 error](https://platform.claude.com/docs/en/api/errors) describing which rate limit was exceeded. When the response has a `retry-after` header, wait that many seconds before retrying. - You might also encounter 429 errors because of acceleration limits on the API if your organization has a sharp increase in usage. To avoid hitting acceleration limits, ramp up your traffic gradually and maintain consistent usage patterns. + You might also encounter 429 errors because of acceleration limits on the API if your organization has a sharp increase in usage. To avoid hitting acceleration limits, increase your traffic gradually and maintain consistent usage patterns. ### Cache-aware ITPM -Many API providers use a combined "tokens per minute" (TPM) limit that may include all tokens, both cached and uncached, input and output. **For most Claude models, only uncached input tokens count toward your ITPM rate limits.** This is a key advantage that makes the rate limits effectively higher than they might initially appear. +Many API providers use a combined "tokens per minute" (TPM) limit that might include all tokens, both cached and uncached, input and output. **For most Claude models, only uncached input tokens count toward your ITPM rate limits.** This is a key advantage that makes the rate limits effectively higher than they might initially appear. ITPM rate limits are estimated at the beginning of each request, and the estimate is adjusted during the request to reflect the actual number of input tokens used. @@ -111,12 +111,12 @@ Here's what counts toward ITPM: total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens ``` - This means when you have cached content, `input_tokens` will typically be much smaller than your total input. For example, with a 200k token cached document and a 50 token user question, you'd see `input_tokens: 50` even though the total input is 200,050 tokens. + This means when you have cached content, `input_tokens` will typically be much smaller than your total input. For example, with a 200k-token cached document and a 50-token user question, you'd see `input_tokens: 50` even though the total input is 200,050 tokens. For rate limit purposes on most models, only `input_tokens` + `cache_creation_input_tokens` count toward your ITPM limit, making [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) an effective way to increase your effective throughput. -**Example:** With a 2,000,000 ITPM limit and an 80% cache hit rate, you could effectively process 10,000,000 total input tokens per minute (2M uncached + 8M cached), because cached tokens don't count toward your rate limit. +**Example:** With a 2,000,000 ITPM limit and an 80 percent cache hit rate, you could effectively process 10,000,000 total input tokens per minute (2M uncached + 8M cached), because cached tokens don't count toward your rate limit. Claude Haiku 3.5 (marked with footnote 4 in the following rate limit tables) also counts `cache_read_input_tokens` toward ITPM rate limits. @@ -124,7 +124,7 @@ Here's what counts toward ITPM: For all other models, cached input tokens do not count toward rate limits and are billed at the [cache read rate](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing), a fraction of the base input price. This means you can achieve significantly higher effective throughput by using [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching). -To make the most of your rate limits, cache repeated content such as system instructions and prompts, large context documents, tool definitions, and conversation history; see [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for guidance. With effective caching, you can substantially increase your actual throughput without raising your rate limits. Monitor your cache hit rate on the [Usage page](https://platform.claude.com/usage) in the Claude Console to tune your caching strategy. +To get the highest throughput within your rate limits, cache repeated content such as system instructions and prompts, large context documents, tool definitions, and conversation history; see [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for guidance. With effective caching, you can substantially increase your actual throughput without raising your rate limits. Monitor your cache hit rate on the [Usage](https://platform.claude.com/usage) page in the Claude Console to tune your caching strategy. OTPM rate limits are evaluated in real time as output tokens are produced, counting only the actual tokens generated. The `max_tokens` parameter does not factor into OTPM rate limit calculations, so there is no rate limit downside to setting a higher `max_tokens` value. @@ -195,7 +195,7 @@ Each row in the following tables has its own RPM, ITPM, and OTPM limits. Some ro ### Message Batches API -The Message Batches API has its own set of rate limits which are shared across all models. These include a requests per minute (RPM) limit to all API endpoints and a limit on the number of batch requests that can be in the processing queue at the same time. A "batch request" here refers to part of a Message Batch. You may create a Message Batch containing thousands of batch requests, each of which count toward this limit. A batch request is considered part of the processing queue when it has yet to be successfully processed by the model. +The Message Batches API has its own set of rate limits, which are shared across all models. These include a requests per minute (RPM) limit to all API endpoints and a limit on the number of batch requests that can be in the processing queue at the same time. A "batch request" here refers to part of a Message Batch. You can create a Message Batch containing thousands of batch requests, each of which counts toward this limit. A batch request is considered part of the processing queue when it has yet to be successfully processed by the model. @@ -223,7 +223,7 @@ The Message Batches API has its own set of rate limits which are shared across a ### Managed Agents -[Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) endpoints are rate-limited per organization. These limits are separate from the Messages API rate limits above. +[Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) endpoints are rate-limited for each organization. These limits are separate from the Messages API rate limits described earlier on this page. | Operation | Limit | | ------------------------------------------------------------------ | ------------------------- | @@ -244,7 +244,7 @@ The response includes `anthropic-fast-*` headers that indicate your fast mode ra You can monitor your rate limit usage on the [Usage](https://platform.claude.com/usage) page of the [Claude Console](https://platform.claude.com/). -In addition to providing token and request charts, the Usage page provides two separate rate limit charts. Use these charts to see what headroom you have to grow, identify when you may be hitting peak use, understand what rate limits to request, and learn how to improve your caching rates. The charts visualize a number of metrics for a given rate limit (for example, per model): +In addition to providing token and request charts, the Usage page provides two separate rate limit charts. Use these charts to see what headroom you have to grow, identify when you might be hitting peak use, understand what rate limits to request, and learn how to improve your caching rates. The charts visualize a number of metrics for a given rate limit (for example, for each model): * The **Rate Limit - Input Tokens** chart includes: @@ -265,11 +265,11 @@ To request higher rate limits or a higher monthly spend cap, use **Request tier **[Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws):** The **Request tier increase** flow is not available. Contact your Anthropic account representative or [Anthropic support](https://support.claude.com), and include the models you need raised, your peak input and output tokens per minute for each model, and roughly what share of your input is cached or repeated context. See [Rate limits and quotas on Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#rate-limits-and-quotas). -## Setting lower limits for Workspaces +## Setting lower limits for workspaces For more about workspaces, see [Workspaces](https://platform.claude.com/docs/en/manage-claude/workspaces). -To protect Workspaces in your Organization from potential overuse, you can set custom spend and rate limits per Workspace. +To protect Workspaces in your Organization from potential overuse, you can set custom spend and rate limits for each Workspace. Example: If your Organization's limit is 40,000 input tokens per minute and 8,000 output tokens per minute, you might limit one Workspace to 30,000 input tokens per minute. This protects other Workspaces from potential overuse and ensures a more equitable distribution of resources across your Organization. The remaining unused tokens per minute (or more, if that Workspace doesn't use the limit) are then available for other Workspaces to use. @@ -277,7 +277,7 @@ Note: * You can't set spend limits on the default Workspace. * If not set, Workspace limits match the Organization's limit. -* Workspace limits are set per limiter type (such as requests per minute, input tokens per minute, or output tokens per minute). +* Workspace limits are set for each limiter type (such as requests per minute, input tokens per minute, or output tokens per minute). * Organization-wide limits always apply, even if Workspace limits add up to more. To read your current organization and workspace rate limits programmatically, use the [Rate Limits API](https://platform.claude.com/docs/en/manage-claude/rate-limits-api). diff --git a/content/en/api/service-tiers.md b/content/en/api/service-tiers.md index d2d6e8c109..0192064c07 100644 --- a/content/en/api/service-tiers.md +++ b/content/en/api/service-tiers.md @@ -36,8 +36,8 @@ Anthropic counts usage against Priority Tier capacity as follows: **Input tokens** * Cache reads as 0.1 tokens per token read from the cache -* Cache writes as 1.25 tokens per token written to the cache with a 5 minute TTL -* Cache writes as 2.00 tokens per token written to the cache with a 1 hour TTL +* Cache writes as 1.25 tokens per token written to the cache with a 5-minute TTL +* Cache writes as 2.00 tokens per token written to the cache with a 1-hour TTL * For [US-only inference](https://platform.claude.com/docs/en/manage-claude/data-residency) (`inference_geo: "us"`) requests on Claude 4.6 and later models, input tokens are 1.1 tokens per token * All other input tokens are 1 token per token @@ -116,7 +116,7 @@ You can control which service tiers can be used for a request by setting the `se { Model = Model.ClaudeOpus4_8, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude!" }], + Messages = [new UserMessageParam { Content = "Hello, Claude!" }], ServiceTier = ServiceTier.Auto, // Automatically use Priority Tier when available, fallback to standard }); Console.WriteLine(message.Usage.ServiceTier); @@ -183,7 +183,7 @@ You can control which service tiers can be used for a request by setting the `se The `service_tier` parameter accepts the following values: * `"auto"` (default) - Uses the Priority Tier capacity if available, falling back to your other capacity if not -* `"standard_only"` - Only use standard tier capacity, useful if you don't want to use your Priority Tier capacity +* `"standard_only"` - Uses only standard tier capacity, useful if you don't want to use your Priority Tier capacity The response `usage` object also includes the service tier assigned to the request: @@ -223,7 +223,7 @@ A Priority Tier commitment consists of: * A commitment duration (1, 3, 6, or 12 months) * A specific model version -Priority Tier targets 99.5% uptime with prioritized computational resources. Requests beyond your committed capacity automatically fall back to standard tier. +Priority Tier targets 99.5 percent uptime with prioritized computational resources. Requests beyond your committed capacity automatically fall back to standard tier. ### Supported models diff --git a/content/en/api/supported-regions.md b/content/en/api/supported-regions.md index 9e135399c9..960b70929a 100644 --- a/content/en/api/supported-regions.md +++ b/content/en/api/supported-regions.md @@ -1,7 +1,7 @@ --- title: Supported regions url: https://platform.claude.com/docs/en/api/supported-regions -description: "Here are the countries, regions, and territories we can currently support access from:" +description: "Here are the countries, regions, and territories Anthropic can support access from:" --- * Albania diff --git a/content/en/api/versioning.md b/content/en/api/versioning.md index 8fccb07da3..616bab8bda 100644 --- a/content/en/api/versioning.md +++ b/content/en/api/versioning.md @@ -1,10 +1,10 @@ --- title: Versions url: https://platform.claude.com/docs/en/api/versioning -description: "When making API requests, you must send an `anthropic-version` request header. For example, `anthropic-version: 2023-06-01`. If you are using the [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview), this is handled for you automatically." +description: "When making API requests, you must send an `anthropic-version` request header. For example, `anthropic-version: 2026-10-21`. If you are using the [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview), this is handled for you automatically." --- -For any given version with the Messages API, Anthropic preserves: +For any given API version, Anthropic preserves: * Existing input parameters * Existing output parameters @@ -22,7 +22,32 @@ Generally, if you are using the API as documented in this reference, Anthropic w Anthropic recommends using the latest API version whenever possible. Previous versions are considered deprecated and may be unavailable for new users. -* `2023-06-01` +* `2026-10-21` + + * [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21) shows how to upgrade. + + * Available on the Claude API, [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), [Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry), and [Google Cloud](https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai). On [Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), it's available for Claude 4.7 and later models. For other models on Bedrock, see the [migration guide](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + + * Messages API: + + * A request that places a `document` block directly in an `assistant` message returns a 400 error. + * Sending a `text` block with a non-empty `citations` array in a `user` message, directly or inside a `search_result` block, returns a 400 error. + * The `temperature`, `top_p`, and `top_k` request parameters are removed. A request that sends any of them returns a 400 error on every model. + + * Admin API: + + * [RBAC groups](https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/list) no longer return `roles`. Use `role_ids` instead. + * [RBAC group members](https://platform.claude.com/docs/en/api/beta/organization/rbac_groups/members/list), and the response to removing one, no longer return `group_id`. Use `rbac_group_id` instead. + * [RBAC roles](https://platform.claude.com/docs/en/api/beta/organization/rbac_roles/list) no longer return `name`. Use `display_name` instead. + * [Organization](https://platform.claude.com/docs/en/api/organization/rate_limits/list) and [workspace](https://platform.claude.com/docs/en/api/organization/workspaces/rate_limits/list) rate-limit entries no longer return `group_type`. Use `group.type` instead. + * [API keys](https://platform.claude.com/docs/en/api/organization/api_keys/list) no longer return `workspace_id`. Use `scope.workspace_id` instead, which gives the workspace's real ID even for the Default Workspace (an all-workspaces key has no `workspace_id` in `scope`). + + * Claude Enterprise Analytics API: + + * The per-user [usage](https://platform.claude.com/docs/en/api/beta/organization/analytics/user_usage_report/list) and [cost](https://platform.claude.com/docs/en/api/beta/organization/analytics/user_cost_report/list) reports no longer have `actor.email`. Use `actor.email_address` instead. + * The [activity summaries](https://platform.claude.com/docs/en/api/beta/organization/analytics/summaries/list) response no longer has `summaries`. Use `data` instead. + +- `2023-06-01` * New format for [streaming](https://platform.claude.com/docs/en/build-with-claude/streaming) server-sent events (SSE): @@ -32,4 +57,4 @@ Anthropic recommends using the latest API version whenever possible. Previous ve * Removed legacy `exception` and `truncated` values in responses. -* `2023-01-01`: Initial release. +- `2023-01-01`: Initial release. diff --git a/content/en/build-with-claude/batch-processing.md b/content/en/build-with-claude/batch-processing.md index b6a735c0cd..40204c7900 100644 --- a/content/en/build-with-claude/batch-processing.md +++ b/content/en/build-with-claude/batch-processing.md @@ -1,7 +1,7 @@ --- title: Batch processing url: https://platform.claude.com/docs/en/build-with-claude/batch-processing -description: Process large volumes of Messages requests asynchronously with the Message Batches API, cutting costs by 50% and increasing throughput. +description: Process large volumes of Messages requests asynchronously with the Message Batches API, cutting costs by 50 percent and increasing throughput. --- Batch processing is a powerful approach for handling large volumes of requests efficiently. Instead of processing requests one at a time with immediate responses, batch processing allows you to submit multiple requests together for asynchronous processing. This pattern is particularly useful when: @@ -42,9 +42,9 @@ This is especially useful for bulk operations that don't require immediate resul * A Message Batch is limited to either 100,000 Message requests or 256 MB in size, whichever is reached first. * The system processes each batch as fast as possible, with most batches completing within 1 hour. You can access batch results when all messages have completed or after 24 hours, whichever comes first. Batches expire if processing does not complete within 24 hours. -* Batch results are available for 29 days after creation. After that, you may still view the Batch, but its results will no longer be available for download. +* Batch results are available for 29 days after creation. After that, you can still view the Batch, but its results will no longer be available for download. * Batches are scoped to a [Workspace](https://platform.claude.com/settings/workspaces) in the Claude Console. You may view all batches (and their results) that were created within the Workspace your request runs in. -* Rate limits apply to both Batches API HTTP requests and the number of requests within a batch waiting to be processed. See [Message Batches API rate limits](https://platform.claude.com/docs/en/api/rate-limits#message-batches-api). Additionally, processing may be slowed down based on current demand and your request volume. In that case, you may see more requests expiring after 24 hours. +* Rate limits apply to both Batches API HTTP requests and the number of requests within a batch waiting to be processed. See [Message Batches API rate limits](https://platform.claude.com/docs/en/api/rate-limits#message-batches-api). Additionally, processing might be slowed down based on current demand and your request volume. In that case, you might see more requests expiring after 24 hours. * Because of high throughput and concurrent processing, batches may go slightly over the [spend limit](https://platform.claude.com/settings/billing) configured in the Claude Console for your Workspace. * Each batched request must have `max_tokens` of at least `1`. `max_tokens: 0` ([cache pre-warming](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pre-warming-the-cache)) is not supported inside a batch, because an ephemeral cache entry written during batch processing would likely expire before the follow-up request runs. @@ -67,11 +67,12 @@ Because each request in the batch is processed independently, you can mix differ A small number of Messages API parameters are **not** supported in batch requests. Including any of these returns a validation error: -| Parameter | Why | -| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -| `stream: true` | Batch results come back as a single file, not a stream. | -| `speed` ([Fast mode](https://platform.claude.com/docs/en/build-with-claude/fast-mode)) | Fast mode tunes synchronous latency, which doesn't apply to asynchronous batch processing. | -| `max_tokens: 0` | See [Batch limitations](https://platform.claude.com/docs/en/build-with-claude/batch-processing#batch-limitations). | +| Parameter | Why | +| -------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `stream: true` | Batch results come back as a single file, not a stream. | +| `speed` ([Fast mode](https://platform.claude.com/docs/en/build-with-claude/fast-mode)) | Fast mode tunes synchronous latency, which doesn't apply to asynchronous batch processing. | +| `fallbacks` ([Server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback)) | Server-side fallback doesn't apply to batches. To retry refused requests, see [Refusals in Message Batches](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusals-in-message-batches). | +| `max_tokens: 0` | See [Batch limitations](https://platform.claude.com/docs/en/build-with-claude/batch-processing#batch-limitations). | Because batches can take longer than 5 minutes to process, consider using the [1-hour cache duration](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration) with prompt caching for better cache hit rates when processing batches with shared context. @@ -79,7 +80,7 @@ A small number of Messages API parameters are **not** supported in batch request ## Pricing -The Batches API offers significant cost savings. All usage is charged at 50% of the standard API prices. +The Batches API offers significant cost savings. All usage is charged at 50 percent of the standard API prices. | Model | Batch input | Batch output | | :----------------------------------------------------------------------------------------------------------------------------------- | :----------- | :------------ | @@ -123,34 +124,33 @@ You can [create a batch](https://platform.claude.com/docs/en/api/messages/batche ```bash cURL curl https://api.anthropic.com/v1/messages/batches \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --data \ - '{ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -d '{ "requests": [ - { - "custom_id": "my-first-request", - "params": { - "model": "claude-opus-5-5", - "max_tokens": 1024, - "messages": [ - {"role": "user", "content": "Hello, world"} - ] - } - }, - { - "custom_id": "my-second-request", - "params": { - "model": "claude-opus-5-5", - "max_tokens": 1024, - "messages": [ - {"role": "user", "content": "Hi again, friend"} - ] - } + { + "custom_id": "my-first-request", + "params": { + "model": "claude-opus-5-5", + "max_tokens": 1024, + "messages": [ + {"role": "user", "content": "Hello, world"} + ] + } + }, + { + "custom_id": "my-second-request", + "params": { + "model": "claude-opus-5-5", + "max_tokens": 1024, + "messages": [ + {"role": "user", "content": "Hi again, friend"} + ] } + } ] - }' + }' ``` ```bash CLI @@ -258,10 +258,7 @@ You can [create a batch](https://platform.claude.com/docs/en/api/messages/batche { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new() { Role = Role.User, Content = "Hello, world" } - ] + Messages = [new UserMessageParam { Content = "Hello, world" }] } }, new() @@ -271,10 +268,7 @@ You can [create a batch](https://platform.claude.com/docs/en/api/messages/batche { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = - [ - new() { Role = Role.User, Content = "Hi again, friend" } - ] + Messages = [new UserMessageParam { Content = "Hi again, friend" }] } } ] @@ -459,8 +453,8 @@ To poll a Message Batch, you'll need its `id`, which is provided in the response ```bash cURL # Check the status; repeat until processing_status is "ended" curl "https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID" \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```bash CLI @@ -609,8 +603,8 @@ You can list all Message Batches in your Workspace using the [list endpoint](htt # last_id as after_id to fetch the next page. (The SDKs and the CLI # perform automatic pagination.) curl -s "https://api.anthropic.com/v1/messages/batches?limit=20" \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```bash CLI @@ -723,12 +717,12 @@ Results of the batch are available for download at the `results_url` property on # Streams the batch's .jsonl results, one result per line. # For per-result handling (retries, validation errors), use the Claude SDK. curl "https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d/results" \ - --header "anthropic-version: 2023-06-01" \ - --header "x-api-key: $ANTHROPIC_API_KEY" + -H "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_API_KEY" ``` ```bash CLI - # Prints one result per line, e.g. `{"custom_id":"test-1","result":{"type":"succeeded",…}}`. + # Prints one result per line, for example `{"custom_id":"test-1","result":{"type":"succeeded",…}}`. # For per-result handling (retries, validation errors), use the SDK # examples in the other tabs. ant messages:batches results \ @@ -790,13 +784,14 @@ Results of the batch are available for download at the `results_url` property on await foreach (var result in client.Messages.Batches.ResultsStreaming("msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d")) { - switch (result.Result.Type) + switch (result.Result.Type.Raw()) { case "succeeded": Console.WriteLine($"Success! {result.CustomID}"); break; case "errored": - if (result.Result.Error?.Type == "invalid_request") + if (result.Result.TryPickErrored(out var errored) + && errored.Error.Error.Type.Raw() == "invalid_request_error") { Console.WriteLine($"Validation error: {result.CustomID}"); } @@ -929,6 +924,8 @@ The results are in `.jsonl` format, where each line is a valid JSON object repre If your result has an error, its `result.error` will be set to the standard [error shape](https://platform.claude.com/docs/en/api/errors#error-shapes). +Batch results use the API version of the request that created the batch. + **Batch results may not match input order** @@ -941,9 +938,9 @@ You can cancel a Message Batch that is currently processing using the [cancel en ```bash cURL - curl --request POST https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID/cancel \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" + curl -X POST https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID/cancel \ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```bash CLI @@ -1041,7 +1038,7 @@ The response shows the batch in a `canceling` state: ### Using prompt caching with Message Batches -The Message Batches API supports prompt caching, allowing you to potentially reduce costs and processing time for batch requests. The pricing discounts from prompt caching and Message Batches can stack, providing even greater cost savings when both features are used together. However, because batch requests are processed asynchronously and concurrently, cache hits are provided on a best-effort basis. Users typically experience cache hit rates ranging from 30% to 98%, depending on their traffic patterns. +The Message Batches API supports prompt caching, allowing you to potentially reduce costs and processing time for batch requests. The pricing discounts from prompt caching and Message Batches can stack, providing even greater cost savings when both features are used together. However, because batch requests are processed asynchronously and concurrently, cache hits are provided on a best-effort basis. Users typically experience cache hit rates ranging from 30 percent to 98 percent, depending on their traffic patterns. To maximize the likelihood of cache hits in your batch requests: @@ -1054,56 +1051,55 @@ Example of implementing prompt caching in a batch: ```bash cURL curl https://api.anthropic.com/v1/messages/batches \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --data \ - '{ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -d '{ "requests": [ - { - "custom_id": "my-first-request", - "params": { - "model": "claude-opus-5-5", - "max_tokens": 1024, - "system": [ - { - "type": "text", - "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n" - }, - { - "type": "text", - "text": "", - "cache_control": {"type": "ephemeral"} - } - ], - "messages": [ - {"role": "user", "content": "Analyze the major themes in Pride and Prejudice."} - ] + { + "custom_id": "my-first-request", + "params": { + "model": "claude-opus-5-5", + "max_tokens": 1024, + "system": [ + { + "type": "text", + "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n" + }, + { + "type": "text", + "text": "", + "cache_control": {"type": "ephemeral"} } - }, - { - "custom_id": "my-second-request", - "params": { - "model": "claude-opus-5-5", - "max_tokens": 1024, - "system": [ - { - "type": "text", - "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n" - }, - { - "type": "text", - "text": "", - "cache_control": {"type": "ephemeral"} - } - ], - "messages": [ - {"role": "user", "content": "Write a summary of Pride and Prejudice."} - ] + ], + "messages": [ + {"role": "user", "content": "Analyze the major themes in Pride and Prejudice."} + ] + } + }, + { + "custom_id": "my-second-request", + "params": { + "model": "claude-opus-5-5", + "max_tokens": 1024, + "system": [ + { + "type": "text", + "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n" + }, + { + "type": "text", + "text": "", + "cache_control": {"type": "ephemeral"} } + ], + "messages": [ + {"role": "user", "content": "Write a summary of Pride and Prejudice."} + ] } + } ] - }' + }' ``` ```bash CLI @@ -1290,7 +1286,7 @@ Example of implementing prompt caching in a batch: }, Messages = [ - new() { Role = Role.User, Content = "Analyze the major themes in Pride and Prejudice." } + new UserMessageParam { Content = "Analyze the major themes in Pride and Prejudice." } ] } }, @@ -1315,7 +1311,7 @@ Example of implementing prompt caching in a batch: }, Messages = [ - new() { Role = Role.User, Content = "Write a summary of Pride and Prejudice." } + new UserMessageParam { Content = "Write a summary of Pride and Prejudice." } ] } } @@ -1546,9 +1542,9 @@ In this example, both requests in the batch include identical system messages an All [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) (web search, web fetch, code execution, MCP connectors, advisor, and tool search) work in batch requests. The batch worker runs the same server-side agentic loop as the synchronous Messages API. -Because there is no open connection to maintain, the batch loop runs **more iterations per turn** than a synchronous request before it returns `stop_reason: "pause_turn"`. If a batch result comes back with `pause_turn`, the turn did not finish; you can continue it by submitting the paused assistant content in a follow-up request (batch or synchronous) exactly as shown in the [pause\_turn continuation pattern](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools#the-server-side-loop-and-pause-turn). +Because there is no open connection to maintain, the batch loop runs **more iterations per turn** than a synchronous request before it returns `stop_reason: "pause_turn"`. If a batch result comes back with `pause_turn`, the turn did not complete; you can continue it by submitting the paused assistant content in a follow-up request (batch or synchronous) exactly as shown in the [pause\_turn continuation pattern](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools#the-server-side-loop-and-pause-turn). -The batch worker additionally throttles `web_search` per organization so that highly concurrent batch processing does not exhaust your organization's web-search rate limit. The batch retries throttled requests automatically; you don't need to handle this yourself, but very large web-search batches might take longer to complete. +The batch worker additionally throttles `web_search` for each organization so that highly concurrent batch processing does not exhaust your organization's web-search rate limit. The batch retries throttled requests automatically; you don't need to handle this yourself, but very large web-search batches might take longer to complete. ### Extended output (beta) @@ -1560,30 +1556,29 @@ The `output-300k-2026-03-24` beta header raises the `max_tokens` cap to 300,000 Use extended output for long-form generation such as book-length drafts and technical documentation, exhaustive structured data extraction, large code-generation scaffolds, and long reasoning chains. -A single 300k-token generation can take over an hour to complete, so plan your batch submissions with the 24-hour processing window in mind. Standard batch pricing (50% of standard API prices) applies. +A single 300k-token generation can take over an hour to complete, so plan your batch submissions with the 24-hour processing window in mind. Standard batch pricing (50 percent of standard API prices) applies. ```bash cURL curl https://api.anthropic.com/v1/messages/batches \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "anthropic-beta: output-300k-2026-03-24" \ - --header "content-type: application/json" \ - --data \ - '{ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "anthropic-beta: output-300k-2026-03-24" \ + -H "content-type: application/json" \ + -d '{ "requests": [ - { - "custom_id": "long-form-request", - "params": { - "model": "claude-opus-5-5", - "max_tokens": 300000, - "messages": [ - {"role": "user", "content": "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices."} - ] - } + { + "custom_id": "long-form-request", + "params": { + "model": "claude-opus-5-5", + "max_tokens": 300000, + "messages": [ + {"role": "user", "content": "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices."} + ] } + } ] - }' + }' ``` ```bash CLI @@ -1678,7 +1673,7 @@ A single 300k-token generation can take over an hour to complete, so plan your b MaxTokens = 300_000, Messages = [ - new() { Role = Role.User, Content = "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices." } + new BetaUserMessageParam { Content = "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices." } ] } } @@ -1791,10 +1786,10 @@ A single 300k-token generation can take over an hour to complete, so plan your b ### Best practices for effective batching -To get the most out of the Batches API: +To use the Batches API effectively: * Monitor batch processing status regularly and implement appropriate retry logic for failed requests. -* Use meaningful `custom_id` values to easily match results with requests, since order is not guaranteed. +* Use meaningful `custom_id` values to easily match results with requests, because order is not guaranteed. * Consider breaking very large datasets into multiple batches for better manageability. * Dry run a single request shape with the Messages API to avoid validation errors. @@ -1802,7 +1797,7 @@ To get the most out of the Batches API: If experiencing unexpected behavior: -* Verify that the total batch request size doesn't exceed 256 MB. If the request size is too large, you may get a 413 `request_too_large` error. +* Verify that the total batch request size doesn't exceed 256 MB. If the request size is too large, you might get a 413 `request_too_large` error. * Check that you're using [supported models](https://platform.claude.com/docs/en/build-with-claude/batch-processing#supported-models) for all requests in the batch. * Ensure each request in the batch has a unique `custom_id`. * Ensure that it has been less than 29 days since batch `created_at` (not processing `ended_at`) time. If over 29 days have passed, results will no longer be viewable. @@ -1812,9 +1807,9 @@ Note that the failure of one request in a batch does not affect the processing o ## Batch storage and privacy -* **Workspace isolation**: Batches are isolated within the Workspace they are created in. They can only be accessed by API requests in that same Workspace, or users with permission to view Workspace batches in the Console. +* **Workspace isolation:** Batches are isolated within the Workspace they are created in. They can only be accessed by API requests in that same Workspace, or users with permission to view Workspace batches in the Console. -* **Result availability**: Batch results are available for 29 days after the batch is created, allowing ample time for retrieval and processing. +* **Result availability:** Batch results are available for 29 days after the batch is created, allowing ample time for retrieval and processing. ## Data retention @@ -1826,7 +1821,7 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - Batches may take up to 24 hours for processing, but many finish sooner. Actual processing time depends on the size of the batch, current demand, and your request volume. It is possible for a batch to expire and not complete within 24 hours. + Batches might take up to 24 hours for processing, but many complete sooner. Actual processing time depends on the size of the batch, current demand, and your request volume. It is possible for a batch to expire and not complete within 24 hours. @@ -1834,15 +1829,15 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - Yes, the Message Batches API supports nearly all features available in the Messages API, including most beta features. A small number of parameters (`stream`, `speed`, and `max_tokens: 0`) are not supported. See [What can be batched](https://platform.claude.com/docs/en/build-with-claude/batch-processing#what-can-be-batched) for the full list. + Yes, the Message Batches API supports nearly all features available in the Messages API, including most beta features. A small number of parameters (`stream`, `speed`, `fallbacks`, and `max_tokens: 0`) are not supported. See [What can be batched](https://platform.claude.com/docs/en/build-with-claude/batch-processing#what-can-be-batched) for the full list. - The Message Batches API offers a 50% discount on all usage compared to standard API prices. This applies to input tokens, output tokens, and any special tokens. For more on pricing, visit [Pricing](https://claude.com/pricing#anthropic-api). + The Message Batches API offers a 50 percent discount on all usage compared to standard API prices. This applies to input tokens, output tokens, and any special tokens. For more on pricing, visit [Pricing](https://claude.com/pricing#anthropic-api). - No, once a batch has been submitted, it cannot be modified. If you need to make changes, you should cancel the current batch and submit a new one. Note that cancellation may not take immediate effect. + No, once a batch has been submitted, it cannot be modified. If you need to make changes, you should cancel the current batch and submit a new one. Note that cancellation might not take immediate effect. @@ -1859,11 +1854,11 @@ For ZDR eligibility across all features, see [API and data retention](https://pl 1. Batches and their results are isolated within the Workspace in which they were created. This means they can only be accessed by API requests in that same Workspace. 2. Each request within a batch is processed independently, with no data leakage between requests. 3. Results are only available for a limited time (29 days), and follow Anthropic's [data retention policy](https://support.claude.com/en/articles/7996866-how-long-do-you-store-personal-data). - 4. Downloading batch results in the Console can be disabled on the organization-level or on a per-workspace basis. + 4. Downloading batch results in the Console can be disabled on the organization level or on a per-workspace basis. - Yes, it is possible to use prompt caching with Message Batches API. However, because asynchronous batch requests can be processed concurrently and in any order, cache hits are provided on a best-effort basis. + Yes, it is possible to use prompt caching with the Message Batches API. However, because asynchronous batch requests can be processed concurrently and in any order, cache hits are provided on a best-effort basis. @@ -1871,7 +1866,7 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - Enable natural citations for RAG applications by providing search results with source attribution. + Get natural citations for RAG applications by providing search results with source attribution. diff --git a/content/en/build-with-claude/cache-diagnostics.md b/content/en/build-with-claude/cache-diagnostics.md index 8e53e7709b..0839413bb6 100644 --- a/content/en/build-with-claude/cache-diagnostics.md +++ b/content/en/build-with-claude/cache-diagnostics.md @@ -185,10 +185,7 @@ Include the `diagnostics` object on every turn. The object is the opt-in: the AP MaxTokens = 1024, CacheControl = new(), System = system, - Messages = - [ - new() { Role = Role.User, Content = "Summarize section 1." }, - ], + Messages = [new BetaUserMessageParam { Content = "Summarize section 1." }], Diagnostics = new() { PreviousMessageID = null }, } ); @@ -202,13 +199,12 @@ Include the `diagnostics` object on every turn. The object is the opt-in: the AP System = system, Messages = [ - new() { Role = Role.User, Content = "Summarize section 1." }, - new() + new BetaUserMessageParam { Content = "Summarize section 1." }, + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = r1.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, - new() { Role = Role.User, Content = "Now summarize section 2." }, + new BetaUserMessageParam { Content = "Now summarize section 2." }, ], Diagnostics = new() { PreviousMessageID = r1.ID }, } @@ -218,7 +214,7 @@ Include the `diagnostics` object on every turn. The object is the opt-in: the AP { null => "No divergence detected.", { CacheMissReason: null } => "Comparison still pending.", - { CacheMissReason.Type: var type } => $"cache_miss_reason: {type.GetString()}", + { CacheMissReason.Type: var type } => $"cache_miss_reason: {type.Raw()}", }); ``` @@ -515,13 +511,12 @@ In streaming responses, `diagnostics` appears on the `message_start` event. System = system, Messages = [ - new() { Role = Role.User, Content = "Summarize section 1." }, - new() + new BetaUserMessageParam { Content = "Summarize section 1." }, + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = r1.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, - new() { Role = Role.User, Content = "Now summarize section 2." }, + new BetaUserMessageParam { Content = "Now summarize section 2." }, ], Diagnostics = new() { PreviousMessageID = r1.ID }, } @@ -545,7 +540,7 @@ In streaming responses, `diagnostics` appears on the `message_start` event. { null => "No divergence detected.", { CacheMissReason: null } => "Comparison still pending.", - { CacheMissReason.Type: var type } => $"cache_miss_reason: {type.GetString()}", + { CacheMissReason.Type: var type } => $"cache_miss_reason: {type.Raw()}", }); ``` @@ -707,13 +702,13 @@ In a multi-turn conversation, carry the latest response `id` forward as `previou - This workflow doesn't translate well to a one-off shell command. See the SDK tabs for the loop pattern; the per-turn HTTP request is identical to [Basic usage](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#basic-usage). + This workflow doesn't translate well to a one-off shell command. Use the Claude SDK to run the loop; the per-turn HTTP request is identical to [Basic usage](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#basic-usage). - This workflow doesn't translate well to a one-off shell command. See the SDK tabs for the loop pattern; the per-turn CLI invocation is identical to [Basic usage](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#basic-usage). + This workflow doesn't translate well to a one-off shell command. Use the Claude SDK to run the loop; the per-turn CLI command is identical to [Basic usage](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#basic-usage). @@ -793,7 +788,7 @@ In a multi-turn conversation, carry the latest response `id` forward as `previou for (int i = 0; i < prompts.Length; i++) { - messages.Add(new() { Role = Role.User, Content = prompts[i] }); + messages.Add(new BetaUserMessageParam { Content = prompts[i] }); var r = await client.Beta.Messages.Create( new() @@ -809,13 +804,12 @@ In a multi-turn conversation, carry the latest response `id` forward as `previou if (r.Diagnostics?.CacheMissReason is { Type: var type }) { - Console.WriteLine($"Turn {i + 1} cache_miss_reason: {type.GetString()}"); + Console.WriteLine($"Turn {i + 1} cache_miss_reason: {type.Raw()}"); } messages.Add( - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = r.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), } ); @@ -876,12 +870,7 @@ In a multi-turn conversation, carry the latest response `id` forward as `previou String prevId = null; for (var turn = 0; turn < prompts.size(); turn++) { - messages.add( - BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(prompts.get(turn)) - .build() - ); + messages.add(BetaMessageParam.ofUser(prompts.get(turn))); var r = client.beta().messages().create( MessageCreateParams.builder() @@ -979,7 +968,7 @@ The `diagnostics` field on the response `Message` has three possible values: | Value | Meaning | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `null` | The request did not include the `diagnostics` object, `previous_message_id` was `null` (first turn, nothing to compare), or a comparison ran and found no divergence. | -| `{"cache_miss_reason": null}` | The comparison was still running when the response was serialized. This can happen when the response starts very quickly. Treat it as inconclusive and check the next turn. | +| `{"cache_miss_reason": null}` | The comparison was still running when the response was serialized. This can occur when the response starts very quickly. Treat it as inconclusive and check the next turn. | | `{"cache_miss_reason": {...}}` | A `cache_miss_reason` is attached. For `*_changed` types this identifies the first divergence point; `previous_message_not_found` and `unavailable` are cases where no comparison was produced. | When `cache_miss_reason` is non-null, it looks like this: @@ -1007,7 +996,7 @@ When `cache_miss_reason` is non-null, it looks like this: ## Cache miss reason types -`cache_miss_reason` is a discriminated union on `type`. The response reports the earliest divergence only, so fix it first; later ones may be hidden behind it. +`cache_miss_reason` is a discriminated union on `type`. The response reports the earliest divergence only, so fix it first; later ones might be hidden behind it. | Type | What it means | What to change | | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1024,7 +1013,7 @@ When `cache_miss_reason` is non-null, it looks like this: ## Reading diagnostics alongside usage -`diagnostics` answers "did my request change?" while `usage.cache_read_input_tokens` answers "did the cache hit?". Combining them tells you where to look. +`diagnostics` answers "did my request change?" whereas `usage.cache_read_input_tokens` answers "did the cache hit?" Combining them tells you where to look. This matrix applies to turns where you passed a real `previous_message_id`. On the first turn (`previous_message_id: null`), `diagnostics` is always `null` and `cache_read_input_tokens` is normally zero because the cache is being written, not read; no troubleshooting is needed. The matrix also does not apply when `cache_miss_reason` is `null` (the comparison is still pending; check the next turn) or when its `type` is `previous_message_not_found` or `unavailable` (no comparison was produced). @@ -1032,7 +1021,7 @@ This matrix applies to turns where you passed a real `previous_message_id`. On t | ----------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `null` | high | Working as expected. Your prefix is stable and the cache hit. | | `null` | low or zero | Your requests match but the cache entry was no longer available. Consider shortening gaps between turns or using the [1-hour cache TTL](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration). | -| `cache_miss_reason` is a `*_changed` type | low or zero | Your bug. The request changed; fix the cause indicated by `type`. | +| `cache_miss_reason` is a `*_changed` type | low or zero | The request changed; fix the cause indicated by `type`. | | `cache_miss_reason` is a `*_changed` type | high | Rare. A change occurred late in the prompt but an earlier `cache_control` breakpoint still hit. Worth fixing, but low impact. | ## Limitations @@ -1040,7 +1029,7 @@ This matrix applies to turns where you passed a real `previous_message_id`. On t * **Claude API only:** Not available on Amazon Bedrock or Google Cloud. * **Limited retention:** Fingerprints for `previous_message_id` lookup expire after a short period. Run diagnostic comparisons between closely spaced requests. * **Same workspace:** The previous request must have run in the same organization and workspace. To check, compare the `anthropic-workspace-id` [response header](https://platform.claude.com/docs/en/api/overview#response-headers) on the two responses. -* **Comparison horizon:** For very long conversations where the only change is deep in the message list, the response may be `unavailable` rather than a precise location. +* **Comparison horizon:** For very long conversations where the only change is deep in the message list, the response might be `unavailable` rather than a precise location. * **Best-effort:** Diagnostics never blocks or fails your request. If diagnostic information is not available, the response returns `unavailable`, or `cache_miss_reason: null` when the comparison was still running. ## Data retention diff --git a/content/en/build-with-claude/citations.md b/content/en/build-with-claude/citations.md index db5c237306..c30fff08f9 100644 --- a/content/en/build-with-claude/citations.md +++ b/content/en/build-with-claude/citations.md @@ -151,10 +151,9 @@ The following example shows how to enable citations on a plain text document wit MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new PlainTextSource() @@ -168,7 +167,7 @@ The following example shows how to enable citations on a plain text document wit Citations = new CitationsConfigParam { Enabled = true }, }), new ContentBlockParam(new TextBlockParam("What color is the grass and sky?")), - }), + }, }, ], } @@ -228,7 +227,7 @@ The following example shows how to enable citations on a plain text document wit MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText(textBlockParam) @@ -312,7 +311,7 @@ The following example shows how to enable citations on a plain text document wit Compared to prompting Claude to cite sources, the citations feature offers the following advantages: - * **Cost savings:** If your prompt-based approach asks Claude to output direct quotes, you may see cost savings because `cited_text` does not count toward your output tokens. + * **Cost savings:** If your prompt-based approach asks Claude to output direct quotes, you might see cost savings because `cited_text` does not count toward your output tokens. * **Better citation reliability:** Because the API parses citations into the response formats described in the following sections and extracts `cited_text` directly, citations are guaranteed to contain valid pointers to the provided documents. * **Improved citation quality:** In Anthropic's evaluations, the citations feature is significantly more likely to cite the most relevant quotes from documents than purely prompt-based approaches. @@ -339,7 +338,7 @@ Integrate citations with Claude in these steps: - * Responses may now include multiple text blocks where each text block can contain a claim that Claude is making and a list of citations that support the claim. + * Responses might now include multiple text blocks where each text block can contain a claim that Claude is making and a list of citations that support the claim. * Citations reference specific locations in source documents. The format of these citations is dependent on the type of document being cited from. @@ -536,10 +535,9 @@ The citation blocks generated in responses cannot be cached directly, but the so MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new PlainTextSource() { Data = longDocument }) @@ -549,7 +547,7 @@ The citation blocks generated in responses cannot be cached directly, but the so CacheControl = new CacheControlEphemeral(), // Cache the document content }), new ContentBlockParam(new TextBlockParam("What does this document say about API features?")), - }), + }, }, ], } @@ -610,7 +608,7 @@ The citation blocks generated in responses cannot be cached directly, but the so MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText(textBlockParam) @@ -853,9 +851,8 @@ Plain text documents are automatically chunked into sentences. You can provide t MaxTokens = 1024, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -905,7 +902,7 @@ Plain text documents are automatically chunked into sentences. You can provide t MessageCreateParams citedParams = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofDocument(DocumentBlockParam.builder() .fileSource(fileId) .title("Document Title") @@ -991,7 +988,7 @@ Plain text documents are automatically chunked into sentences. You can provide t ### PDF documents -PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PDF text is extracted and chunked into sentences. As image citations are not yet supported, PDFs that are scans of documents and do not contain extractable text are not citable. +PDF documents can be provided as base64-encoded data, as a URL, or by `file_id`. PDF text is extracted and chunked into sentences. As image citations are not yet supported, PDFs that are scans of documents and do not contain extractable text are not citable. @@ -1131,10 +1128,9 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new Base64PdfSource() { Data = pdfBase64 }) @@ -1145,7 +1141,7 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD Citations = new CitationsConfigParam { Enabled = true }, }), new ContentBlockParam(new TextBlockParam("Summarize this document.")), - }), + }, }, ], } @@ -1206,7 +1202,7 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText(TextBlockParam.builder().text("Summarize this document.").build()) @@ -1413,10 +1409,9 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new UrlPdfSource() @@ -1430,7 +1425,7 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD Citations = new CitationsConfigParam { Enabled = true }, }), new ContentBlockParam(new TextBlockParam("Summarize this document.")), - }), + }, }, ], } @@ -1484,7 +1479,7 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText(TextBlockParam.builder().text("Summarize this document.").build()) @@ -1672,9 +1667,8 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MaxTokens = 1024, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -1724,7 +1718,7 @@ PDF documents can be provided as base64-encoded data, a URL, or by `file_id`. PD MessageCreateParams citedParams = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofDocument(DocumentBlockParam.builder() .fileSource(fileId) .title("Document Title") @@ -1947,10 +1941,9 @@ Custom content documents give you control over citation granularity. No addition MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new ContentBlockSource() @@ -1968,7 +1961,7 @@ Custom content documents give you control over citation granularity. No addition Citations = new CitationsConfigParam { Enabled = true }, }), new ContentBlockParam(new TextBlockParam("Summarize this document.")), - }), + }, }, ], } @@ -2032,7 +2025,7 @@ Custom content documents give you control over citation granularity. No addition MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText(TextBlockParam.builder().text("Summarize this document.").build()) diff --git a/content/en/build-with-claude/claude-in-amazon-bedrock.md b/content/en/build-with-claude/claude-in-amazon-bedrock.md index b73526da31..bddd2266fb 100644 --- a/content/en/build-with-claude/claude-in-amazon-bedrock.md +++ b/content/en/build-with-claude/claude-in-amazon-bedrock.md @@ -16,10 +16,10 @@ Amazon Bedrock sets access criteria for each Claude model individually. Claude F ## Prerequisites -Before you begin, ensure you have: +Before you start, ensure you have: -* An AWS account with [Amazon Bedrock model access](https://console.aws.amazon.com/bedrock/home#/modelaccess) enabled for the Claude models you intend to use. -* The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed and configured (optional, for credential management). +* An AWS account with [Amazon Bedrock model access](https://console.aws.amazon.com/bedrock/home#/modelaccess) enabled for the Claude models you intend to use +* The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed and configured (optional, for credential management) Claude Mythos Preview additionally requires a dedicated AWS account that has been allowlisted by the Bedrock Marketplace team. Your Anthropic account executive can submit your account ID for allowlisting (typically processed within 24 hours), and AWS sends a welcome email once it's complete. @@ -37,7 +37,7 @@ Use a Bedrock service role with AWS-managed keys for the most secure, long-lived - When calling the API, Bedrock assumes the service role on your behalf. See the [Amazon Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-mantle.html) for how to associate the role with your requests. + When you call the API, Bedrock assumes the service role on your behalf. See the [Amazon Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-mantle.html) for how to associate the role with your requests. @@ -102,8 +102,8 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries ```kotlin - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-bedrock:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-bedrock:3.0.0") ``` @@ -112,12 +112,12 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-bedrock - 2.75.0 + 3.0.0 ``` @@ -216,7 +216,7 @@ The SDK resolves credentials and region using the standard AWS precedence: const { Model = "anthropic.claude-opus-5-5", MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }); foreach (var item in message.Content) @@ -390,7 +390,7 @@ For the full feature list with Amazon Bedrock availability, see [Features overvi Claude in Amazon Bedrock is available in the following AWS regions. Amazon Bedrock offers two endpoint types: * **Global:** dynamic routing across all available regions for maximum availability. No pricing premium. -* **Regional:** the endpoint resolves to the single AWS region you specify, for data-residency requirements. Regional endpoints carry a 10% pricing premium over global endpoints. To route across multiple regions within a geography, use an [inference profile](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) (US, EU, JP, or AU). Regions marked **In-region only** in the table support direct single-region routing without an inference profile. +* **Regional:** the endpoint resolves to the single AWS region you specify, for data-residency requirements. Regional endpoints carry a 10 percent pricing premium over global endpoints. To route across multiple regions within a geography, use an [inference profile](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html) (US, EU, JP, or AU). Regions marked **In-region only** in the table support direct single-region routing without an inference profile. The global endpoint is available for Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Sonnet 5.5, Claude Sonnet 5, Claude Haiku 5.5, and Claude Haiku 4.5. For Claude Fable 5.1, regional endpoints are currently available in `us-east-1` only. Claude Mythos Preview is regional only and is available in `us-east-1`. diff --git a/content/en/build-with-claude/claude-in-microsoft-foundry.md b/content/en/build-with-claude/claude-in-microsoft-foundry.md index 973c91c36d..89152b3450 100644 --- a/content/en/build-with-claude/claude-in-microsoft-foundry.md +++ b/content/en/build-with-claude/claude-in-microsoft-foundry.md @@ -27,7 +27,7 @@ Claude Sonnet 5.5 supports only Global Standard deployments. ## Prerequisites -Before you begin, ensure you have: +Before you start, ensure you have: * An active Azure subscription * Access to the [Foundry portal](https://ai.azure.com/) @@ -36,7 +36,7 @@ Before you begin, ensure you have: ## Install an SDK -Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) support Foundry through a platform-specific package or client class. The examples on this page also show requests with cURL and the ant CLI. To set up the CLI, see [CLI quickstart](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart). +Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) support Foundry through a platform-specific package or client class. The examples on this page also show requests with cURL and the `ant` CLI. To set up the CLI, see [CLI quickstart](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart). Foundry is supported by the C#, Go, Java, PHP, Python, and TypeScript SDKs. Foundry is not currently available in the Ruby SDK. @@ -80,8 +80,8 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries ```kotlin - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-foundry:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-foundry:3.0.0") // For Entra ID authentication, also add the Azure Identity library implementation("com.azure:azure-identity:1.18.3") @@ -93,12 +93,12 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-foundry - 2.75.0 + 3.0.0 @@ -129,7 +129,7 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries ## Provisioning -Foundry uses a two-level hierarchy: **resources** contain your security and billing configuration, while **deployments** are the model instances you call through the API. You'll first create a Foundry resource, then create one or more Claude deployments within it. +Foundry uses a two-level hierarchy: **resources** contain your security and billing configuration, whereas **deployments** are the model instances you call through the API. You'll first create a Foundry resource, then create one or more Claude deployments within it. ### Provisioning Foundry resources @@ -151,14 +151,14 @@ After creating your resource, deploy a Claude model to make it available for API 2. Search for and select a Claude model (for example, claude-opus-5-5). Each model appears once in the catalog regardless of how many hosting options it supports. -3. On the model card, select **Deploy**, then **Custom settings** to open the deployment settings pane. If you choose **Default settings** instead, the deployment is automatically configured as Hosted on Azure for models available in both hosting options. +3. On the model card, select **Deploy**, then **Custom settings** to open the deployment settings pane. If you select **Default settings** instead, the deployment is automatically configured as Hosted on Azure for models available in both hosting options. 4. On your first Claude deployment, review the Azure Marketplace terms, select an industry, and select **Agree and Proceed** to accept the terms and subscribe to the Azure Marketplace offer. 5. Configure the deployment: * **Deployment name:** Defaults to the model ID, but you can customize it (for example, `my-claude-deployment`). The deployment name cannot be changed after creation. - * **Region scope:** Select Global, or for models hosted on Azure, Data Zone. Selecting Data Zone creates a US Data Zone Standard deployment, which keeps inference within the United States and is equivalent to setting [`inference_geo: "us"`](https://platform.claude.com/docs/en/manage-claude/data-residency#inference-geo) on the Claude API. For Claude Sonnet 5.5, select Global. + * **Region scope:** Select **Global**, or for models hosted on Azure, **Data Zone**. Selecting **Data Zone** creates a US Data Zone Standard deployment, which keeps inference within the United States and is equivalent to setting [`inference_geo: "us"`](https://platform.claude.com/docs/en/manage-claude/data-residency#inference-geo) on the Claude API. For Claude Sonnet 5.5, select **Global**. * **Model version:** Expand **Model version settings** and select a version from the **Model version** dropdown menu. Each [hosting option](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry#hosting-options) is listed as a separate model version, labeled with its hosting option (for example, version 1 for Hosted on Anthropic, version 2 for Hosted on Azure). 6. Select **Deploy** and wait for provisioning to complete. @@ -272,7 +272,7 @@ The SDK's Foundry client requires an API key and either a resource name or base { Model = "claude-opus-5-5", MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }], + Messages = [new UserMessageParam { Content = "Hello!" }], }); Console.WriteLine( @@ -489,7 +489,7 @@ Entra ID authentication lets you manage access with Azure RBAC, integrate with y { Model = "claude-opus-5-5", MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }], + Messages = [new UserMessageParam { Content = "Hello!" }], }); Console.WriteLine( @@ -757,7 +757,7 @@ Anthropic recommends logging your activity on at least a 30-day rolling basis to **Error:** `403 Forbidden` -* **Solution:** Your Azure account may lack the necessary permissions. Ensure you have the appropriate Azure RBAC role assigned (for example, **Foundry User** (formerly Azure AI User) or **Cognitive Services User**). +* **Solution:** Your Azure account might lack the necessary permissions. Ensure you have the appropriate Azure RBAC role assigned (for example, **Foundry User** (formerly Azure AI User) or **Cognitive Services User**). ### Rate limiting @@ -779,7 +779,7 @@ Foundry does not include Anthropic's standard rate limit headers (`anthropic-rat **Error:** `Invalid model parameter` -* **Solution:** The model parameter should contain your deployment name, which can be customized in the Foundry portal. Verify the deployment exists and is properly configured. +* **Solution:** The `model` parameter should contain your deployment name, which can be customized in the Foundry portal. Verify the deployment exists and is properly configured. ## Next steps diff --git a/content/en/build-with-claude/claude-on-amazon-bedrock-legacy.md b/content/en/build-with-claude/claude-on-amazon-bedrock-legacy.md index 4fb0f75eb8..5c3dff0432 100644 --- a/content/en/build-with-claude/claude-on-amazon-bedrock-legacy.md +++ b/content/en/build-with-claude/claude-on-amazon-bedrock-legacy.md @@ -8,6 +8,10 @@ description: The legacy Amazon Bedrock integration for Claude models, using Invo This page covers the legacy Amazon Bedrock integration: the `InvokeModel` and `Converse` APIs with ARN-versioned model identifiers and AWS event-stream encoding. For models available on the Messages-API Bedrock endpoint, see [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), which uses the Messages API at `/anthropic/v1/messages` with SSE streaming. For an Anthropic-operated alternative with AWS Marketplace billing and typically same-day feature access, see [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws). Existing Bedrock users can follow the [migration guide](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#migrating-from-amazon-bedrock). + + The latest version of the SDK sends API version `2026-10-21` by default, including through Amazon Bedrock. The ARN-versioned models in the model table on this page don't support `2026-10-21` on Bedrock, and requests to them that send it can return a 400 error. If you call them through the SDK, keep the SDK on the version you use today, and pin that version where you install it so a later install doesn't upgrade it. The Boto3 example sets `anthropic_version` in its request body and isn't affected. + + Calling Claude through Bedrock slightly differs from how you would call Claude on the Claude API directly. This guide walks you through completing an API call to Claude on Bedrock using one of Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview). Note that this guide assumes you have already signed up for an [AWS account](https://portal.aws.amazon.com/billing/signup) and configured programmatic access. @@ -15,7 +19,7 @@ Note that this guide assumes you have already signed up for an [AWS account](htt ## Install and configure the AWS CLI 1. [Install a version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) at or newer than version `2.13.23`. -2. Configure your AWS credentials using the AWS configure command (see [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)) or find your credentials by navigating to "Command line or programmatic access" within your AWS dashboard and following the directions in the modal window. +2. Configure your AWS credentials using the AWS configure command (see [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)) or find your credentials by navigating to **Command line or programmatic access** within your AWS dashboard and following the directions in the modal window. 3. Verify that your credentials are working: ```bash AWS CLI @@ -24,7 +28,7 @@ aws sts get-caller-identity ## Install an SDK for accessing Bedrock -Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) support Bedrock. You can also use an AWS SDK like `boto3` directly. +Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) support Bedrock. You can also use an AWS SDK such as `boto3` directly. @@ -52,22 +56,22 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries - + ```groovy Gradle - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-bedrock:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-bedrock:3.0.0") ``` ```xml Maven com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-bedrock - 2.75.0 + 3.0.0 ``` @@ -126,7 +130,7 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries ### Subscribe to Anthropic models -Go to the [AWS Console > Bedrock > Model Access](https://console.aws.amazon.com/bedrock/home?region=us-west-2#/modelaccess) and request access to Anthropic models. Note that Anthropic model availability varies by region. See [AWS documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) for latest information. +Go to the [AWS Console > Bedrock > Model Access](https://console.aws.amazon.com/bedrock/home?region=us-west-2#/modelaccess) and request access to Anthropic models. Note that Anthropic model availability varies by region. See the [AWS documentation on model availability by region](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) for the latest information. #### API model IDs @@ -142,7 +146,7 @@ AWS offers newer Claude models through [cross-region inference](https://docs.aws Invocation of model ID anthropic.claude-sonnet-4-5-20250929-v1:0 with on-demand throughput isn't supported. Retry your request with the ID or ARN of an inference profile that contains this model. ``` -To invoke these models, pass an inference profile instead of the base model ID. The inference profile ID is the base model ID with a prefix from a column marked "Yes" in the following table, for example us.anthropic.claude-sonnet-4-5-20250929-v1:0. You can also pass the full inference profile ARN, in the form `arn:aws:bedrock:{region}:{account-id}:inference-profile/{inference-profile-id}`. For AWS's authoritative list of available inference profiles, see [Supported Regions and models for inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html). To learn how the prefixes affect routing and pricing, see the [Global versus regional endpoints](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy#global-vs-regional-endpoints) section. +To call these models, pass an inference profile instead of the base model ID. The inference profile ID is the base model ID with a prefix from a column marked "Yes" in the following table, for example us.anthropic.claude-sonnet-4-5-20250929-v1:0. You can also pass the full inference profile ARN, in the form `arn:aws:bedrock:{region}:{account-id}:inference-profile/{inference-profile-id}`. For AWS's authoritative list of available inference profiles, see [Supported Regions and models for inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html). To learn how the prefixes affect routing and pricing, see the [Global versus regional endpoints](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy#global-vs-regional-endpoints) section. | Model | Base Bedrock model ID | `global` | `us` | `eu` | `jp` | `apac` | | :---------------------------------------------------------------------------------------------------- | :------------------------------------------ | :------- | :--- | :--- | :--- | :----- | @@ -158,7 +162,7 @@ To invoke these models, pass an inference profile instead of the base model ID. The following examples show how to print a list of all the Claude models available through Bedrock: - + ```bash AWS CLI aws bedrock list-foundation-models --region=us-west-2 --by-provider anthropic --query "modelSummaries[*].modelId" ``` @@ -307,7 +311,7 @@ The following examples show how to generate text from Claude on Bedrock: - Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDKs in the other tabs handle automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). + Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDK handles automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Making your first request with Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). @@ -765,7 +769,7 @@ A `role: "system"` message can also set `output_config.effort` to [change effort Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 5.5, Claude Sonnet 5, Claude Sonnet 4.6, and Claude Haiku 5.5 have a [1M-token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) on Amazon Bedrock. Other Claude models, including Sonnet 4.5 (deprecated) and Sonnet 4 (deprecated), have a 200k-token context window. -Bedrock limits request payloads to 20 MB. When sending large documents or many images, you may reach this limit before the token limit. +Bedrock limits request payloads to 20 MB. When sending large documents or many images, you might reach this limit before the token limit. ## Global versus regional endpoints @@ -774,7 +778,7 @@ Starting with **Claude Sonnet 4.5 and all future models**, Bedrock offers two en * **Global endpoints:** Dynamic routing for maximum availability * **Regional endpoints:** Guaranteed data routing through specific geographic regions -Regional endpoints include a 10% pricing premium over global endpoints. +Regional endpoints include a 10 percent pricing premium over global endpoints. This applies to Claude Sonnet 4.5 (deprecated) and future models only. Older models (Claude Sonnet 4 (deprecated) and earlier) maintain their existing pricing structures. @@ -786,15 +790,15 @@ Regional endpoints include a 10% pricing premium over global endpoints. * Provide maximum availability and uptime * Dynamically route requests to regions with available capacity -* No pricing premium -* Best for applications where data residency is flexible +* Carry no pricing premium +* Work best for applications where data residency is flexible **Regional endpoints (CRIS):** * Route traffic through specific geographic regions * Required for data residency and compliance requirements * Available for US, EU, Japan, and Asia-Pacific -* 10% pricing premium reflects infrastructure costs for dedicated regional capacity +* 10 percent pricing premium reflects infrastructure costs for dedicated regional capacity ### Implementation @@ -805,7 +809,7 @@ The model IDs for Claude Opus 4.6, Sonnet 4.6, and Sonnet 4.5 (deprecated) alrea - Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDKs in the other tabs handle automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). + Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDK handles automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Making your first request with Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). @@ -956,7 +960,7 @@ To use regional endpoints, replace the `global.` prefix with a regional prefix s - Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDKs in the other tabs handle automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). + Calling the `InvokeModel` API with AWS credentials requires SigV4 request signing, which the SDK handles automatically. For a Bedrock endpoint you can call with a self-contained cURL command, see [Making your first request with Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock#making-your-first-request). diff --git a/content/en/build-with-claude/claude-on-vertex-ai.md b/content/en/build-with-claude/claude-on-vertex-ai.md index 9c38581536..9e20fd700c 100644 --- a/content/en/build-with-claude/claude-on-vertex-ai.md +++ b/content/en/build-with-claude/claude-on-vertex-ai.md @@ -7,7 +7,7 @@ description: Anthropic's Claude models are available through [Google Cloud's Age The API for accessing Claude on Google Cloud's Agent Platform is nearly identical to the [Messages API](https://platform.claude.com/docs/en/api/messages/create), with two key differences in request format: * On Agent Platform, `model` is not passed in the request body. Instead, it is specified in the Google Cloud endpoint URL. -* On Agent Platform, `anthropic_version` is passed in the request body (rather than as a header), and must be set to the value `vertex-2023-10-16`. +* On Agent Platform, `anthropic_version` is passed in the request body (rather than as a header), and must be set to the value `vertex-2023-10-16`, or to [API version `2026-10-21`](https://platform.claude.com/docs/en/api/migration-2026-10-21). Agent Platform is also supported by Anthropic's official [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview). This guide walks you through making a request to Claude on Agent Platform using one of Anthropic's client SDKs. @@ -45,20 +45,20 @@ First, install Anthropic's [client SDK](https://platform.claude.com/docs/en/cli- ```groovy Gradle - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-vertex:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-vertex:3.0.0") ``` ```xml Maven com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-vertex - 2.75.0 + 3.0.0 ``` @@ -238,7 +238,7 @@ The following examples show how to generate text from Claude on Agent Platform: { Model = Model.ClaudeOpus5_5, MaxTokens = 100, - Messages = [new() { Role = Role.User, Content = "Hey Claude!" }] + Messages = [new UserMessageParam { Content = "Hey Claude!" }] }; var message = await client.Messages.Create(parameters); @@ -390,7 +390,7 @@ For the full feature list with Google Cloud availability, see [Features overview Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 5.5, Claude Sonnet 5, Claude Sonnet 4.6, and Claude Haiku 5.5 have a [1M-token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) on Agent Platform. Other Claude models, including Sonnet 4.5 (deprecated) and Sonnet 4 (deprecated), have a 200k-token context window. -Agent Platform limits request payloads to 30 MB. When sending large documents or many images, you might reach this limit before the token limit. +Agent Platform limits request payloads to 30 MB. When sending large documents or many images, you might reach this limit before the token limit. ## Global, multi-region, and regional endpoints @@ -400,7 +400,7 @@ Agent Platform offers three endpoint types: * **Multi-region endpoints:** Dynamic routing within a geographic area (for example, the United States or the European Union) for data residency with high availability * **Regional endpoints:** Guaranteed data routing through specific geographic regions -Regional and multi-region endpoints include a 10% pricing premium over global endpoints. +Regional and multi-region endpoints include a 10 percent pricing premium over global endpoints. This applies to Claude Sonnet 4.5 (deprecated) and future models only. Older models (Claude Sonnet 4 (deprecated), Opus 4 (deprecated), and earlier) maintain their existing pricing structures. @@ -412,15 +412,15 @@ Regional and multi-region endpoints include a 10% pricing premium over global en * Provide maximum availability and uptime * Dynamically route requests to regions with available capacity -* No pricing premium -* Best for applications where data residency is flexible -* Only supports pay-as-you-go traffic (provisioned throughput requires regional endpoints) +* Carry no pricing premium +* Work best for applications where data residency is flexible +* Only support pay-as-you-go traffic (provisioned throughput requires regional endpoints) **Multi-region endpoints:** * Dynamically route requests across regions within a geographic area (currently `us` and `eu`) * Useful when you need data residency within a broad geography but want higher availability than a single region -* 10% pricing premium over global endpoints +* 10 percent pricing premium over global endpoints * Only supports pay-as-you-go traffic (provisioned throughput requires regional endpoints) **Regional endpoints:** @@ -428,7 +428,7 @@ Regional and multi-region endpoints include a 10% pricing premium over global en * Route traffic through specific geographic regions * Required for single-region data residency, strict compliance mandates, or provisioned throughput * Support both pay-as-you-go and provisioned throughput -* 10% pricing premium reflects infrastructure costs for dedicated regional capacity +* 10 percent pricing premium reflects infrastructure costs for dedicated regional capacity ### Implementation @@ -510,7 +510,7 @@ Set the `region` parameter to `"global"` when initializing the client: { Model = Model.ClaudeOpus5_5, MaxTokens = 100, - Messages = [new() { Role = Role.User, Content = "Hey Claude!" }] + Messages = [new UserMessageParam { Content = "Hey Claude!" }] }; var message = await client.Messages.Create(parameters); @@ -696,7 +696,7 @@ Set the `region` parameter to a multi-region identifier: `"us"` for the United S { Model = Model.ClaudeOpus5_5, MaxTokens = 100, - Messages = [new() { Role = Role.User, Content = "Hey Claude!" }] + Messages = [new UserMessageParam { Content = "Hey Claude!" }] }; var message = await client.Messages.Create(parameters); @@ -886,7 +886,7 @@ Specify a specific region such as `"us-east5"` or `"europe-west1"`: // Specific regional endpoints support Claude Sonnet 4.6 and earlier; newer models use the global or multi-region endpoints Model = Model.ClaudeSonnet4_6, MaxTokens = 100, - Messages = [new() { Role = Role.User, Content = "Hey Claude!" }] + Messages = [new UserMessageParam { Content = "Hey Claude!" }] }; var message = await client.Messages.Create(parameters); diff --git a/content/en/build-with-claude/claude-platform-on-aws.md b/content/en/build-with-claude/claude-platform-on-aws.md index cdd2e58e9e..74e13deee4 100644 --- a/content/en/build-with-claude/claude-platform-on-aws.md +++ b/content/en/build-with-claude/claude-platform-on-aws.md @@ -14,7 +14,7 @@ Claude Platform on AWS gives you the full Anthropic platform experience, includi Claude models run on Anthropic-managed infrastructure. This is a commercial integration for billing and access through AWS. Anthropic is the data processor for inference inputs and outputs. AWS processes billing and identity metadata under the marketplace model. Customers using Claude through Claude Platform on AWS are subject to Anthropic's [data use terms](https://www.anthropic.com/legal). -Anthropic uses AWS infrastructure to process your API requests, run model inference, and store your workspace content (such as prompts, outputs, files, Skills, and batches). For workspaces created before September 18, 2026, 00:00 UTC, Anthropic might process requests, store data, and run inference outside AWS. In either case, subservices might change without notice. Set the [`inference_geo`](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#data-residency) parameter per request to pin inference to a specific geography. +Anthropic uses AWS infrastructure to process your API requests, run model inference, and store your workspace content (such as prompts, outputs, files, Skills, and batches). For workspaces created before September 18, 2026, 00:00 UTC, Anthropic might process requests, store data, and run inference outside AWS. In either case, subservices might change without notice. Set the [`inference_geo`](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#data-residency) parameter for each request to pin inference to a specific geography. Claude Platform on AWS follows the same data retention policy as the first-party Claude API. Zero Data Retention (ZDR) is available on request. Contact your Anthropic account representative to enable it for your organization. @@ -45,14 +45,14 @@ If you need AWS-operated Claude, see [Claude in Amazon Bedrock](https://platform **Which offering are you using?** Claude is available through several distinct products: -* **Claude Platform on AWS** (this page): The Claude API platform billed through AWS Marketplace. Managed in the [Claude Console](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#using-the-claude-console) and the AWS Console. +* **Claude Platform on AWS (this page):** The Claude API platform billed through AWS Marketplace. Managed in the [Claude Console](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#using-the-claude-console) and the AWS Console. * **[Claude in Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock):** An AWS-native service. Managed in the Amazon Bedrock console and billed as AWS service usage. * **Claude Enterprise procured through AWS Marketplace:** A [claude.ai](https://claude.ai) plan (the Claude chat product), not an API platform. Managed at claude.ai, and its account and migration behavior differ from what this page describes. See the [Claude Help Center](https://support.claude.com). * **Direct Anthropic accounts:** The first-party Claude API and claude.ai plans billed by Anthropic. Managed in the Claude Console and at claude.ai. ## Set up your account -Setting up Claude Platform on AWS happens in four phases: sign up on the AWS Console service page, complete your Anthropic organization setup, note your workspace ID, and sign in to the Claude Console. +Setting up Claude Platform on AWS takes four phases: sign up on the AWS Console service page, complete your Anthropic organization setup, note your workspace ID, and sign in to the Claude Console. Signing up through the AWS Console provisions a new Anthropic organization tied to your AWS account. This organization is separate from any existing organizations your company has with Anthropic, including Claude Enterprise organizations procured through AWS Marketplace. API keys, workspaces, and Claude Console settings from a first-party Anthropic organization don't carry over. @@ -63,9 +63,9 @@ Setting up Claude Platform on AWS happens in four phases: sign up on the AWS Con 1. Open the [AWS Console](https://console.aws.amazon.com/) and navigate to the **Claude Platform on AWS** service page. - 2. Choose **Sign up**. + 2. Click **Sign up**. 3. On the Sign-up page, review the terms (Anthropic's End User License Agreement, the AWS Privacy Notice, and the AWS Customer Agreement) and select the agreement checkbox. - 4. Choose **Continue**. + 4. Click **Continue**. The page shows a **Sign-up in progress** banner. Stay on the page. Sign-up takes a few minutes while AWS handles the AWS Marketplace subscription for you, then redirects you automatically. @@ -79,15 +79,15 @@ Setting up Claude Platform on AWS happens in four phases: sign up on the AWS Con After sign-up completes, you're redirected to `platform.claude.com/partner-signup`. - 1. Enter the email address of your organization's owner and choose **Get started**. - 2. Check that email inbox for a setup link and follow it. If your browser shows a **Signed in as a different account** page, choose **Log out and continue**. - 3. Complete the organization details form (organization name, entity type, country, intended use) and choose **Complete setup**. + 1. Enter the email address of your organization's owner and click **Get started**. + 2. Check that email inbox for a setup link and follow it. If your browser shows a **Signed in as a different account** page, click **Log out and continue**. + 3. Complete the organization details form (organization name, entity type, country, intended use) and click **Complete setup**. - Completing setup creates your Anthropic organization and accepts Anthropic's Commercial Terms of Service and Usage Policy. The AWS Console service page now shows a left navigation with **Home**, **API keys**, **Quickstart**, and **Workspaces**. + Completing setup creates your Anthropic organization and accepts Anthropic's Commercial Terms of Service and Usage Policy. The AWS Console service page now shows a sidebar with **Home**, **API keys**, **Quickstart**, and **Workspaces**. - After you complete setup, the AWS Console prompts you to create a workspace. See [Workspaces](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#workspaces) for details on region binding, IAM resource scoping, and creating additional workspaces. + After you complete setup, the AWS Console prompts you to create a workspace. See [Workspace scoping](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#workspace-scoping) for details on region binding and IAM resource scoping, and [Managing workspaces](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#managing-workspaces) for creating additional workspaces. Find the workspace ID under **Workspaces** on the AWS Console **Claude Platform on AWS** service page or in the [Claude Console](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#using-the-claude-console). Workspace IDs use the format `wrkspc_` followed by an alphanumeric identifier. @@ -95,7 +95,7 @@ Setting up Claude Platform on AWS happens in four phases: sign up on the AWS Con Access to the Claude Console is federated through AWS IAM: - 1. Assume an IAM role with the `aws-external-anthropic:AssumeConsole` permission. See [IAM actions for Claude Platform on AWS](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#console-access). + 1. Assume an IAM role with the `aws-external-anthropic:AssumeConsole` permission. See [Console access](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#console-access). 2. From the **Claude Platform on AWS** service page, choose **Open Claude Console**. The AWS Console issues a JWT and redirects you to `platform.claude.com`. 3. On first sign-in, you're prompted for an email address. Enter your work email. The platform provisions your Claude Console user just-in-time. @@ -116,17 +116,17 @@ Plan a move from an existing organization as a cutover to a new one: Once the new organization is running, the differences are concentrated in billing and authentication, which are handled through AWS: -* **Billing** moves to AWS Marketplace: usage is billed in Claude Consumption Units rather than prepaid credits (see [Billing](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#billing)), and you set spend limits on the Billing page (see [Spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits)). During the transition, billing stays separate: the existing organization continues to be billed as it is today. -* **Authentication and access** move to AWS: requests authenticate with AWS credentials or with API keys generated in the AWS Console, not the Claude Console (see [Authentication](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#authentication)). Organization membership is managed through AWS IAM rather than the Claude Console (see [Available pages](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#available-pages)), and Anthropic's client SDKs provide platform-specific client classes (see [Install an SDK](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#install-an-sdk)). +* **Billing** moves to AWS Marketplace: usage is billed in Claude Consumption Units rather than prepaid credits (see [Billing](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#billing)), and you set spend limits on the **Billing** page (see [Spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits)). During the transition, billing stays separate: the existing organization continues to be billed as it is today. +* **Authentication and access** move to AWS: requests authenticate with AWS credentials or with API keys generated in the AWS Console, not the Claude Console (see [Authentication](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#authentication)). Organization membership is managed through AWS IAM rather than the Claude Console (see [Available pages](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#available-pages)), and the SDK provides a platform-specific client class (see [Install an SDK](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#install-an-sdk)). * **Day-to-day API usage** works the way it does on the first-party Claude API, except where noted in the [feature limitations](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#features-not-supported). Before shifting production traffic, check your rate limits: new organizations are placed on the Start tier, and limit increases go through your Anthropic account representative (see [Rate limits and quotas](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#rate-limits-and-quotas)). For Claude Enterprise (claude.ai) organizations, which behave differently, see the [offering comparison](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#claude-platform-on-aws-vs-amazon-bedrock). ### Troubleshooting account setup -* **"Sign-up failed: Failed to enable OutboundWebIdentityFederation":** If you see this banner on first submit, choose **Continue** again. The IAM enablement can take a moment to take effect. +* **"Sign-up failed: Failed to enable OutboundWebIdentityFederation":** If you see this banner on first submit, click **Continue** again. The IAM enablement can take a moment to take effect. * **No progress indicator during sign-up:** Sign-up takes a few minutes. The page shows a static **Sign-up in progress** banner without a progress bar while AWS provisions your account. -* **"Signed in as a different account" after following the setup link:** Choose **Log out and continue**. The page reauthenticates you with the email address you entered. +* **"Signed in as a different account" after following the setup link:** Click **Log out and continue**. The page reauthenticates you with the email address you entered. * **"Not found" message during sign-in:** This message might appear briefly during redirect. You can dismiss it. * **Usage page shows no data after your first API call:** Usage data can take a few minutes to appear in the Claude Console. * **"Outbound web identity federation is disabled" on your first API call:** Enable federation once per account. See [Enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation). @@ -143,7 +143,7 @@ Ensure you have: ### Enable outbound web identity federation -The Claude Platform on AWS gateway calls `sts:GetWebIdentityToken` server-side to mint a JWT it forwards to Anthropic. This STS capability is **disabled by default** on every AWS account. Enable it once per account: +The Claude Platform on AWS gateway calls `sts:GetWebIdentityToken` server-side to mint a JWT it forwards to Anthropic. This STS capability is **disabled by default** on every AWS account. Enable it once for each account: ```bash CLI aws iam enable-outbound-web-identity-federation @@ -197,10 +197,10 @@ aws sts get-caller-identity For simpler integration paths (local development and scripts), you can authenticate with an API key instead of SigV4. Set the `ANTHROPIC_AWS_API_KEY` environment variable or pass `api_key` (typescript, php: `apiKey`; go: `APIKey`; java: `.apiKey()`; csharp: `AwsClientOptions.ApiKey`) when you create the client. -Generate API keys in the **AWS Console** under **Claude Platform on AWS → API keys**. Choose **Generate a key**, then copy the key value. Grant the `aws-external-anthropic:CallWithBearerToken` IAM action to the principals that should be allowed to use API key authentication. +Generate API keys in the **AWS Console** under **Claude Platform on AWS → API keys**. Click **Generate a key**, then copy the key value. Grant the `aws-external-anthropic:CallWithBearerToken` IAM action to the principals that should be allowed to use API key authentication. - API keys for Claude Platform on AWS are managed in the AWS Console, not the Claude Console. Keys created in the standard [Claude Console](https://platform.claude.com/) (for first-party API access) don't work with the Claude Platform on AWS endpoint. + API keys for Claude Platform on AWS are managed in the AWS Console, not the Claude Console. Keys created in the standard Claude Console at [platform.claude.com](https://platform.claude.com) (for first-party API access) don't work with the Claude Platform on AWS endpoint. #### Short-term API keys @@ -260,10 +260,10 @@ The SDK does not refresh short-term keys automatically. When a token expires, ge The platform-specific client resolves authentication in the following order, starting with what you pass when you create it: -1. `api_key` (typescript, php: `apiKey`; go: `APIKey`; java: `.apiKey()`; csharp: `AwsClientOptions.ApiKey`) → `x-api-key` header +1. `api_key` (typescript, php: `apiKey`; go: `APIKey`; java: `.apiKey()`; csharp: `AwsClientOptions.ApiKey`) → `Authorization: Bearer` header 2. `aws_access_key` (typescript, php: `awsAccessKey`; go: `AWSAccessKey`; java: `.awsAccessKey()`; csharp: `AwsClientOptions.AwsAccessKey`) + `aws_secret_key` (ruby: `aws_secret_access_key`; typescript, php: `awsSecretAccessKey`; go: `AWSSecretAccessKey`; java: `.awsSecretAccessKey()`; csharp: `AwsClientOptions.AwsSecretAccessKey`) → AWS SigV4 3. `aws_profile` (typescript, php: `awsProfile`; go: `AWSProfile`; java: `.awsProfile()`; csharp: `AwsClientOptions.AwsProfile`) → AWS SigV4 with named profile -4. `ANTHROPIC_AWS_API_KEY` environment variable → `x-api-key` header +4. `ANTHROPIC_AWS_API_KEY` environment variable → `Authorization: Bearer` header 5. Default AWS credential provider chain → AWS SigV4 ### Region resolution @@ -305,20 +305,20 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries ```kotlin Gradle - implementation("com.anthropic:anthropic-java:2.75.0") - implementation("com.anthropic:anthropic-java-aws:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") + implementation("com.anthropic:anthropic-java-aws:3.0.0") ``` ```xml Maven com.anthropic anthropic-java - 2.75.0 + 3.0.0 com.anthropic anthropic-java-aws - 2.75.0 + 3.0.0 ``` @@ -337,7 +337,7 @@ Anthropic's [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries - SDK clients for Claude Platform on AWS are in beta. + The SDK client for Claude Platform on AWS is in beta. ## Available models @@ -453,7 +453,7 @@ Before running these examples, complete the steps in [Before making API calls](h { Model = Model.ClaudeSonnet5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }); Console.WriteLine(message); @@ -600,7 +600,7 @@ Claude Platform on AWS supports the following inference geographies: The AWS region your workspace is bound to controls which gateway endpoint you call and where AWS-side resources (IAM, CloudTrail, billing) are scoped. It does not pin where model inference runs. To pin inference to a specific geography, set `inference_geo` on each request or configure a workspace default. -Set the inference geography per request with the `inference_geo` parameter: +Set the inference geography for each request with the `inference_geo` parameter: The `inference_geo` parameter is supported on Claude 4.6 and later models. Requests with `inference_geo` on Claude Opus 4.5, Claude Sonnet 4.5 (deprecated), or Claude Haiku 4.5 return a 400 error. See [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) for model availability details. @@ -678,7 +678,7 @@ Set the inference geography per request with the `inference_geo` parameter: Model = Model.ClaudeSonnet5_5, MaxTokens = 1024, InferenceGeo = "us", - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }); Console.WriteLine(message); @@ -772,7 +772,7 @@ Inference and resource requests on Claude Platform on AWS target a workspace. Yo ### Workspace scoping -Workspaces are bound to a single AWS region. A workspace created in `us-west-2` can only be accessed through the `us-west-2` endpoint. Usage, quotas, cost, files, batches, and Skills all roll up per workspace, giving you per-region breakdowns in the Claude Console. +Workspaces are bound to a single AWS region. A workspace created in `us-west-2` can only be accessed through the `us-west-2` endpoint. Usage, quotas, cost, files, batches, and Skills all roll up by workspace, giving you per-region breakdowns in the Claude Console. Workspaces also serve as the primary IAM resource for Claude Platform on AWS. You grant or deny access to specific workspaces through AWS IAM policies using the workspace ARN. The ARN's resource segment is the same `wrkspc_`-prefixed ID you pass in the `anthropic-workspace-id` header: @@ -800,37 +800,37 @@ Claude Platform on AWS uses the standard Claude Console at [platform.claude.com] Access to the Claude Console is federated through AWS IAM. See [Set up your account](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#set-up-your-account) for the full first-time sign-in flow. In short: -1. Assume an IAM role with the `aws-external-anthropic:AssumeConsole` permission. See [IAM actions for Claude Platform on AWS](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#console-access). +1. Assume an IAM role with the `aws-external-anthropic:AssumeConsole` permission. See [Console access](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#console-access). 2. Navigate to the Claude Platform on AWS page in the [AWS Console](https://console.aws.amazon.com/). -3. Choose **Open Claude Console**. The AWS Console issues a JWT and redirects you to `platform.claude.com`. +3. Click **Open Claude Console**. The AWS Console issues a JWT and redirects you to `platform.claude.com`. 4. On first sign-in, you're prompted for an email address. Enter your work email. The platform provisions your Claude Console user just-in-time. Two Claude Console roles are available: **Admin** and **Developer**. The Admin role grants access to all Claude Console pages and settings available for Claude Platform on AWS. The Developer role grants read access to usage, cost, rate limit, and workspace information. Contact your Anthropic account representative to assign the Admin or Developer role to a principal. ### Available pages -The **Through AWS gateway** column indicates whether the page reads and writes data through the AWS gateway (and is therefore governed by [IAM actions](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions)). Pages marked **No** read organization-level metadata directly from Anthropic and bypass IAM action checks. - -| Page | Available | Through AWS gateway | Notes | -| --------------------- | ------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Usage** | Yes | No | View token usage by model, workspace, and dimension. Data can take a few minutes to appear after a request. | -| **Cost** | Yes | No | View cost breakdowns by model and workspace. AWS Cost Explorer shows the aggregated [Claude Consumption Unit (CCU)](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#billing) line item. | -| **Rate limits** | Yes | No | View rate limits (read-only). Tier increases go through your Anthropic account representative; see [Rate limits and quotas](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#rate-limits-and-quotas). | -| **Workspaces** | Yes | Yes (except spend limits) | View per-region workspaces. With the Admin role, you can also create, rename, and archive workspaces, and set per-workspace [spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits). | -| **Encryption keys** | Yes | Yes | A section of the [Data retention](https://platform.claude.com/settings/privacy#encryption-keys) page (`platform.claude.com/settings/privacy`) in the Claude Console, shown while **Organization** is selected in the dropdown menu at the top of the page. Register AWS KMS keys for [CMEK](https://platform.claude.com/docs/en/manage-claude/cmek-claude-platform-on-aws) there (Admin role). To attach a registered key to a workspace, select the workspace from that dropdown menu, then select the key under **Encryption key**. | -| **Files** | Yes | Yes | View and manage uploaded files. | -| **Skills** | Yes | Yes | View and manage Agent Skills. | -| **Batches** | Yes | Yes | View and manage batch processing jobs. | -| **Agents** | Yes | Yes | View and manage agent definitions. | -| **Sessions** | Yes | Yes | View agent sessions and event history. | -| **Environments** | Yes | Yes | View and manage cloud sandbox configurations for sessions. | -| **Credential vaults** | Yes | Yes | View and manage credential vaults for session authentication. | -| **Memory stores** | Yes | Yes | View and manage persistent agent memory. | -| **Webhooks** | Yes | Yes | View and manage webhook endpoints. | -| **API keys** | No | N/A | Manage API keys in the AWS Console (**Claude Platform on AWS → API keys**). See [API key authentication](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#api-key-authentication). | -| **Members** | No | N/A | Not applicable. AWS IAM manages access. | -| **Billing** | Yes (limited) | No | Set an organization monthly spend limit; see [Spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits). AWS Marketplace manages invoicing. View cost breakdowns on the Cost page. | -| **Claude Code** | No | N/A | View Claude Code usage on the Usage page. | +The **Through AWS gateway** column indicates whether the page reads and writes data through the AWS gateway (and is therefore governed by [IAM actions for Claude Platform on AWS](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions)). Pages marked **No** read organization-level metadata directly from Anthropic and bypass IAM action checks. + +| Page | Available | Through AWS gateway | Notes | +| --------------------- | ------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Usage** | Yes | No | View token usage by model, workspace, and dimension. Data can take a few minutes to appear after a request. | +| **Cost** | Yes | No | View cost breakdowns by model and workspace. AWS Cost Explorer shows the aggregated [Claude Consumption Unit (CCU)](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#billing) line item. | +| **Rate limits** | Yes | No | View rate limits (read-only). Tier increases go through your Anthropic account representative; see [Rate limits and quotas](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#rate-limits-and-quotas). | +| **Workspaces** | Yes | Yes (except spend limits) | View per-region workspaces. With the Admin role, you can also create, rename, and archive workspaces, and set per-workspace [spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits). | +| **Encryption keys** | Yes | Yes | A section of the [Data retention](https://platform.claude.com/settings/privacy#encryption-keys) page (`platform.claude.com/settings/privacy`) in the Claude Console, shown while **Organization** is selected in the dropdown menu at the top of the page. Register AWS KMS keys there (Admin role), as described in [Set up CMEK on Claude Platform on AWS](https://platform.claude.com/docs/en/manage-claude/cmek-claude-platform-on-aws). To attach a registered key to a workspace, select the workspace from that dropdown menu, then select the key under **Encryption key**. | +| **Files** | Yes | Yes | View and manage uploaded files. | +| **Skills** | Yes | Yes | View and manage Agent Skills. | +| **Batches** | Yes | Yes | View and manage batch processing jobs. | +| **Agents** | Yes | Yes | View and manage agent definitions. | +| **Sessions** | Yes | Yes | View agent sessions and event history. | +| **Environments** | Yes | Yes | View and manage cloud sandbox configurations for sessions. | +| **Credential vaults** | Yes | Yes | View and manage credential vaults for session authentication. | +| **Memory stores** | Yes | Yes | View and manage persistent agent memory. | +| **Webhooks** | Yes | Yes | View and manage webhook endpoints. | +| **API keys** | No | N/A | Manage API keys in the AWS Console (**Claude Platform on AWS → API keys**). See [API key authentication](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#api-key-authentication). | +| **Members** | No | N/A | Not applicable. AWS IAM manages access. | +| **Billing** | Yes (limited) | No | Set an organization monthly spend limit; see [Spend limits](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#spend-limits). AWS Marketplace manages invoicing. View cost breakdowns on the **Cost** page. | +| **Claude Code** | No | N/A | View Claude Code usage on the **Usage** page. | ### Switching organizations @@ -840,7 +840,7 @@ The Claude Console does not support organization switching for Claude Platform o Organizations on Claude Platform on AWS are placed on the Start tier. Anthropic manages rate limits directly, not through AWS quota systems. -Organizations on Claude Platform on AWS can move to a higher usage tier automatically as they build a history of paid AWS Marketplace invoices. The self-service **Request tier increase** flow in the Claude Console is not available: the Rate limits page directs you to your Anthropic account representative instead. +Organizations on Claude Platform on AWS can move to a higher usage tier automatically as they build a history of paid AWS Marketplace invoices. The self-service **Request tier increase** flow in the Claude Console is not available: the **Rate limits** page directs you to your Anthropic account representative instead. To request higher limits, contact your Anthropic account representative or [Anthropic support](https://support.claude.com). Include the following in your request: @@ -860,14 +860,14 @@ For the CCU price, conversion mechanics, discount application, and per-model tok The Start, Build, and Scale usage tiers each carry a monthly spend cap; see the [per-tier spend caps](https://platform.claude.com/docs/en/api/rate-limits#spend-limits) for current values. When your organization's usage for the calendar month reaches its tier's cap, API requests fail with the [spend-cap error](https://platform.claude.com/docs/en/api/rate-limits#reaching-your-spend-cap) until 00:00 UTC on the first day of the next month, and retrying sooner doesn't succeed. The spend cap and rate limits belong to the same tier. To raise the cap, or to restore access after reaching it, request a tier increase through your Anthropic account representative or [Anthropic support](https://support.claude.com) (see [Rate limits and quotas](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#rate-limits-and-quotas)). -You can also set your own monthly spend limits below the cap, after adding at least one recipient under **Email recipients** on the Billing page: +You can also set your own monthly spend limits below the cap, after adding at least one recipient under **Email recipients** on the **Billing** page: * **Organization spend limit:** Go to [Settings > Billing](https://platform.claude.com/settings/billing) in the [Claude Console](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#using-the-claude-console) to set a monthly spend limit. * **Workspace spend limits:** On the [Workspaces](https://platform.claude.com/settings/workspaces) page (`platform.claude.com/settings/workspaces`) in the Claude Console, select a workspace. In the panel that opens, click **Spend limits**. When usage reaches a limit you set, requests fail with HTTP 400 (see the [spend limit error](https://platform.claude.com/docs/en/api/rate-limits#setting-your-own-spend-limit)) until 00:00 UTC on the first day of the next month, or until you raise or remove the limit. -Spend is calculated at list prices and can take about 2 hours to reflect recent usage, so usage can exceed the cap or a limit before requests start failing. The overshoot is billed. When the tier cap or an organization spend limit stops your requests, an email notice goes to the recipients listed under **Email recipients** on the Billing page. Role-based recipients, such as all admins, aren't available on Claude Platform on AWS. The tier-cap notice also goes to the email address used at AWS Marketplace sign-up. +Spend is calculated at list prices and can take about 2 hours to reflect recent usage, so usage can exceed the cap or a limit before requests start failing. The overshoot is billed. When the tier cap or an organization spend limit stops your requests, an email notice goes to the recipients listed under **Email recipients** on the **Billing** page. Role-based recipients, such as all admins, aren't available on Claude Platform on AWS. The tier-cap notice also goes to the email address used at AWS Marketplace sign-up. ## Monitoring and logging @@ -963,7 +963,7 @@ Each response includes two request IDs in the response headers: { Model = Model.ClaudeSonnet5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }); Console.WriteLine(response.Headers.GetValues("x-amzn-requestid").First()); // AWS request ID @@ -1099,7 +1099,7 @@ The migration delta depends on which Bedrock integration you're coming from. The | **Region availability** | See [Amazon Bedrock regions](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) | See [Amazon Bedrock regions](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) | All AWS commercial regions | | **Anthropic organization** | None required | None required | New organization created at sign-up. Existing organizations can't be converted (see [Moving from an existing Anthropic organization](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#moving-from-an-existing-anthropic-organization)) | -If you're on the current Bedrock integration, the request body format is already the Messages API. The changes are the base URL, SigV4 service name, model IDs, and adding the `anthropic-workspace-id` header. If you're on the legacy InvokeModel or Converse API, you'll also rewrite the request and response shapes to the Messages API format. See [Claude on Amazon Bedrock (Opus 4.6 and earlier)](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy) for the request-shape mapping. +If you're on the current Bedrock integration, the request body format is already the Messages API. The changes are the base URL, SigV4 service name, model IDs, and the added `anthropic-workspace-id` header. If you're on the legacy InvokeModel or Converse API, you'll also rewrite the request and response shapes to the Messages API format. See [Claude on Amazon Bedrock (Opus 4.6 and earlier)](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy) for the request-shape mapping. ### What you gain @@ -1120,7 +1120,7 @@ If you're on the current Bedrock integration, the request body format is already ### Migration pitfalls - **Enable outbound web identity federation first.** If your AWS account has not previously used Claude Platform on AWS, you must [enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) once per account before making requests. Without this step, all requests fail with a federation error (see [Enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) for the exact error and remediation). This step is not required for Bedrock. + **Enable outbound web identity federation first.** If your AWS account has not previously used Claude Platform on AWS, you must [enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) once for each account before making requests. Without this step, all requests fail with a federation error (see [Enable outbound web identity federation](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#enable-outbound-web-identity-federation) for the exact error and remediation). This step is not required for Bedrock. @@ -1185,7 +1185,7 @@ The `GetBatchInference` action authorizes both the batch metadata route and the ### Managed policies -AWS provides five managed policies (`AnthropicFullAccess`, `AnthropicReadOnlyAccess`, `AnthropicInferenceAccess`, `AnthropicLimitedAccess`, and `AnthropicSelfHostedEnvironmentAccess`) for common access patterns. For the actions each policy grants, the complete list of IAM actions, the route-to-action mapping, and additional policy examples, see [IAM actions for Claude Platform on AWS](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#managed-policies). +AWS provides five managed policies (`AnthropicFullAccess`, `AnthropicReadOnlyAccess`, `AnthropicInferenceAccess`, `AnthropicLimitedAccess`, and `AnthropicSelfHostedEnvironmentAccess`) for common access patterns. For the actions each policy grants, see [Managed policies](https://platform.claude.com/docs/en/api/claude-platform-on-aws-iam-actions#managed-policies) in IAM actions for Claude Platform on AWS. The same page has the complete list of IAM actions, the route-to-action mapping, and additional policy examples. ## Next steps diff --git a/content/en/build-with-claude/compaction-background.md b/content/en/build-with-claude/compaction-background.md index f466066924..4b24b6103a 100644 --- a/content/en/build-with-claude/compaction-background.md +++ b/content/en/build-with-claude/compaction-background.md @@ -41,7 +41,7 @@ The compaction request and the block it returns are the same as in the loop. You For example, if the compaction request held messages 1 to 5 and the conversation gained messages 6 to 8 while it ran, after the swap your history is the block followed by messages 6 to 8. - ![Background compaction timeline: the compaction request is sent with messages 1 to 5 while the conversation continues on its full history and gains messages 6 to 8; when the block arrives, it replaces messages 1 to 5 at the front of the history, and the history becomes the block followed by messages 6 to 8](https://platform.claude.com/docs/images/compaction-background-timeline.svg) + ![Background compaction: while a compaction request for messages 1 to 5 runs, 6 to 8 arrive; then the block replaces 1 to 5](https://platform.claude.com/docs/images/compaction-background-timeline.svg) If the response has any other `stop_reason`, no summary was produced, which counts as a failure in step 2. Keep the full history; [Handle a missing summary or an error](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#when-no-summary-comes-back) lists the causes and what to do for each. @@ -241,9 +241,8 @@ The following program is the loop from [Compact in a loop](https://platform.clau // Replace exactly the messages the compaction request held. Later turns stay after the block. return [ - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = summary.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, .. history[sent..], @@ -262,7 +261,7 @@ The following program is the loop from [Compact in a loop](https://platform.clau pending = null; } - history.Add(new() { Role = Role.User, Content = question }); + history.Add(new BetaUserMessageParam { Content = question }); var response = await client.Beta.Messages.Create(new MessageCreateParams { Model = Model.ClaudeOpus5_5, @@ -271,9 +270,8 @@ The following program is the loop from [Compact in a loop](https://platform.clau Betas = [AnthropicBeta.Compact2026_09_04], Messages = history, }); - history.Add(new() + history.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); @@ -430,10 +428,7 @@ The following program is the loop from [Compact in a loop](https://platform.clau pending = null; } - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(questions.get(turn - 1)) - .build()); + history.add(BetaMessageParam.ofUser(questions.get(turn - 1))); var params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(8192) @@ -540,8 +535,8 @@ The following program is the loop from [Compact in a loop](https://platform.clau * **Deciding when to compact:** The size check also requires that no compaction request is pending. -* **Starting the request:** Where the loop waits for the compaction response, this version records how many messages the history holds, starts the request on a copy of the history with each language's own concurrency tool, and goes on to the next turn without waiting. -* **Checking for the result:** At the top of each turn, the program checks whether the pending request has finished. If it has, the program makes the swap before it sends that turn's request. +* **Starting the request:** Where the loop waits for the compaction response, this version records how many messages the history holds, starts the request on a copy of the history with the language's own concurrency tool, and goes on to the next turn without waiting. +* **Checking for the result:** At the top of each turn, the program checks whether the pending request has completed. If it has, the program makes the swap before it sends that turn's request. * **Making the swap:** Where the loop replaces the whole history with the returned message, this version's swap function replaces only the messages the request held, counted from the front, and keeps everything appended since. * **Ending the loop:** If the compaction request is still pending when the loop ends, the program waits for it and makes the swap, so a summary that is still on its way isn't lost before you save or continue the conversation. diff --git a/content/en/build-with-claude/compaction-keep-recent-turns.md b/content/en/build-with-claude/compaction-keep-recent-turns.md index d2c835063a..2becdc47aa 100644 --- a/content/en/build-with-claude/compaction-keep-recent-turns.md +++ b/content/en/build-with-claude/compaction-keep-recent-turns.md @@ -203,7 +203,7 @@ The following program is the loop from [Compact in a loop](https://platform.clau foreach (var (index, question) in questions.Index()) { var turn = index + 1; - history.Add(new() { Role = Role.User, Content = question }); + history.Add(new BetaUserMessageParam { Content = question }); var response = await client.Beta.Messages.Create(new MessageCreateParams { Model = Model.ClaudeOpus5_5, @@ -212,9 +212,8 @@ The following program is the loop from [Compact in a loop](https://platform.clau Betas = [AnthropicBeta.Compact2026_09_04], Messages = history, }); - history.Add(new() + history.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); @@ -238,9 +237,8 @@ The following program is the loop from [Compact in a loop](https://platform.clau { history = [ - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = summary.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, .. recent, @@ -342,10 +340,7 @@ The following program is the loop from [Compact in a loop](https://platform.clau var history = new ArrayList(); for (int turn = 1; turn <= questions.size(); turn++) { - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(questions.get(turn - 1)) - .build()); + history.add(BetaMessageParam.ofUser(questions.get(turn - 1))); var params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(8192) diff --git a/content/en/build-with-claude/compaction-on-demand.md b/content/en/build-with-claude/compaction-on-demand.md index 7742f9d211..e570172463 100644 --- a/content/en/build-with-claude/compaction-on-demand.md +++ b/content/en/build-with-claude/compaction-on-demand.md @@ -27,16 +27,16 @@ featureMetadata: Microsoft Foundry: beta --- -With on-demand compaction, your application decides when a conversation is summarized: you send one request with the `compaction` parameter, and Claude returns a summary in place of a reply. +With on-demand compaction, your application determines when a conversation is summarized: you send one request with the `compaction` parameter, and Claude returns a summary in place of a reply. ## How on-demand compaction works A compaction request is separate from your conversation turns. You send the conversation as it stands with the `compaction` parameter, and the response contains a single `compaction` block. The block holds the summary as text you can read, and a signature. Send it in future requests exactly as it came. -From then on the block takes the place of the messages it summarizes. It goes first in `messages`, the summarized messages are removed, and your next turn follows it. Claude sees the summary where those messages were. +From then on the block takes the place of the messages it summarizes. It goes first in `messages`, the summarized messages are removed, and your next turn follows it. Claude receives the summary where those messages were. - ![On-demand compaction: a request that carries four messages and the compaction parameter returns one compaction block and no reply; on the next request the block comes first in messages in place of those four messages, followed by the next user turn](https://platform.claude.com/docs/images/compaction-on-demand-swap.svg) + ![On-demand compaction: a request with four messages returns one compaction block, which replaces them in the next request](https://platform.claude.com/docs/images/compaction-on-demand-swap.svg) ## Request a summary @@ -146,17 +146,15 @@ Send the conversation as it stands with `"compaction": {"type": "summarize"}`. T List history = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "I am building a recipe app. Help me name the main entities in the data model.", }, - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = "Start with Recipe, Ingredient, and Step. Add a RecipeIngredient entry that holds the quantity and unit for each ingredient in a recipe.", }, - new() { Role = Role.User, Content = "Good. Now suggest field names for Recipe." }, + new BetaUserMessageParam { Content = "Good. Now suggest field names for Recipe." }, ]; var response = await client.Beta.Messages.Create(new MessageCreateParams @@ -345,7 +343,7 @@ The API puts the summary where the block stands and passes every later message t * Put the block first in `messages`, either as an `assistant` message of its own or as the first content block of the first message, whether that is a `user` or `assistant` message. * Remove the summarized messages. If any remain in front of the block, the request returns a 400 error (`compaction_block_misplaced`). -* Send exactly one `compaction` block per request, on every later request. +* Send exactly one `compaction` block in each request, on every later request. Two mistakes in the swap raise no error. If summarized messages remain after the block, the API sends them to Claude again. If a later request leaves the block out, Claude gets no summary. @@ -491,7 +489,7 @@ After each turn, the loop adds the last response's input and output tokens, beca foreach (var (index, question) in questions.Index()) { var turn = index + 1; - history.Add(new() { Role = Role.User, Content = question }); + history.Add(new BetaUserMessageParam { Content = question }); var response = await client.Beta.Messages.Create(new MessageCreateParams { Model = Model.ClaudeOpus5_5, @@ -500,9 +498,8 @@ After each turn, the loop adds the last response's input and output tokens, beca Betas = [AnthropicBeta.Compact2026_09_04], Messages = history, }); - history.Add(new() + history.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); @@ -523,9 +520,8 @@ After each turn, the loop adds the last response's input and output tokens, beca { history = [ - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = summary.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, ]; @@ -621,10 +617,7 @@ After each turn, the loop adds the last response's input and output tokens, beca var history = new ArrayList(); for (int turn = 1; turn <= questions.size(); turn++) { - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(questions.get(turn - 1)) - .build()); + history.add(BetaMessageParam.ofUser(questions.get(turn - 1))); var params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(8192) @@ -765,13 +758,13 @@ After each turn, the loop adds the last response's input and output tokens, beca The check on `stop_reason` comes before the code looks for the block; [Handle a missing summary or an error](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#when-no-summary-comes-back) says why. The history is replaced, not appended to: the returned message replaces every message the request carried, under the rules in [Continue from the summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#continue-from-the-summary). When no summary comes back, the loop keeps its history and asks again after the next turn. -The SDK [tool runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner) in Python, TypeScript, C#, Go, Java, PHP, and Ruby can send the compaction request for you. When you decide to compact, call `compact_before_next_turn()` (typescript, java, php: `compactBeforeNextTurn()`; csharp, go: `CompactBeforeNextTurn()`) on the runner. Once the current turn and its tool calls finish, the runner sends the compaction request and replaces its history with the returned message. Create the runner with the `compact-2026-09-04` beta, because the runner doesn't add it. +The SDK [tool runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner) in Python, TypeScript, C#, Go, Java, PHP, and Ruby can send the compaction request for you. When you decide to compact, call `compact_before_next_turn()` (typescript, java, php: `compactBeforeNextTurn()`; csharp, go: `CompactBeforeNextTurn()`) on the runner. Once the current turn and its tool calls complete, the runner sends the compaction request and replaces its history with the returned message. Create the runner with the `compact-2026-09-04` beta, because the runner doesn't add it. The runner builds the compaction request from its own parameters and leaves `context_management` out. It also leaves out `stop_sequences`, a `tool_choice` of type `any` or `tool`, and a structured-output `output_config.format`, which the API rejects on a compaction request. [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary) explains why. The runner sends them again on its later requests. SDK versions before Python 1.8.0, TypeScript 0.128.0, C# 12.50.0, Go 1.75.0, and Java 2.65.0 send them on the compaction request too. On those versions, a runner that sets any of these parameters gets a 400 error. The runner sends a [task budget](https://platform.claude.com/docs/en/build-with-claude/task-budgets) unchanged. If `output_config.task_budget` sets `remaining`, the compaction request returns a 400 error, so leave `remaining` unset, as [Limits and interactions with other features](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#how-it-fits-with-the-rest-of-the-api) says. The runner refuses to compact while its `context_management` has a compaction edit, so use one kind of compaction on a runner. ### When to compact -You can send a compaction request after any completed turn, so your code decides when. +You can send a compaction request after any completed turn, so your code determines when. To estimate how large the next request will be, add `input_tokens` and `output_tokens` from the last response's `usage`, as the loop does. With [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#tracking-cache-performance), `input_tokens` counts only the tokens after the last cache breakpoint, so add `cache_read_input_tokens` and `cache_creation_input_tokens` as well. You can also send the same messages to the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint. @@ -810,17 +803,17 @@ The summarization call is subject to the same safeguards as your other requests. A compaction request, or a request that carries a block, can also fail outright. Most 400 errors have a message that says what to remove or resend. Some also carry an `error.details.error_code` that starts with `compaction_`. Parameter errors, such as a field that can't be combined with `compaction`, carry the message only. -| Error | Cause | What to do | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 529 `overloaded_error`, `error.details.error_code` `compaction_unavailable` | A transient server problem while producing a block, or while reading one you sent back. | Retry the request. | -| 400 `compaction_block_misplaced` | Summarized messages remain in front of the block. | Remove them, so the block comes first in `messages`. | -| 400 `compaction_signature_invalid` or `compaction_content_mismatch` | The block's `signature` or `content` was changed after the API returned it. | Send the block exactly as returned, including its `signature`. | -| 400 | The request carries more than one `compaction` block. | Send exactly one, the newest. | -| 400 | The last `assistant` turn ends in a tool call with no result yet. | Send that turn's tool results, then compact. | -| 400 `compaction_nothing_to_summarize` | `messages` has no `user` or `assistant` content, for example an empty list. | Send at least one `user` or `assistant` message. | -| 400 on the compaction request, with a message that says the `compaction` parameter `requires anthropic-beta: compact-2026-09-04` | The compaction request left out the beta header. | Add the beta header; see [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). | -| 400 on a later request that carries the block: a validation error that says `compaction` is not one of the expected content block types. The message doesn't mention the header | That request left out the beta header. | Add the beta header to every request that carries the block; see [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). | -| 400 validation error, such as `messages.0.content.0.compaction.citations: Extra inputs are not permitted` | A block was sent back with fields the API didn't return, such as `citations: null`. | Send the block exactly as returned; see [Continue from the summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#continue-from-the-summary). | +| Error | Cause | What to do | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 529 `overloaded_error`, `error.details.error_code` `compaction_unavailable` | A transient server problem while producing a block, or while reading one you sent back. | Retry the request. | +| 400 `compaction_block_misplaced` | Summarized messages remain in front of the block. | Remove them, so the block comes first in `messages`. | +| 400 `compaction_signature_invalid` or `compaction_content_mismatch` | The block's `signature` or `content` was changed after the API returned it. | Send the block exactly as returned, including its `signature`. | +| 400 | The request carries more than one `compaction` block. | Send exactly one, the newest. | +| 400 | The last `assistant` turn ends in a tool call with no result yet. | Send that turn's tool results, then compact. | +| 400 `compaction_nothing_to_summarize` | `messages` has no `user` or `assistant` content, for example an empty list. | Send at least one `user` or `assistant` message. | +| 400 on the compaction request, with a message that says the `compaction` parameter `requires anthropic-beta: compact-2026-09-04` | The compaction request left out the beta header. | Add the beta header; see [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). | +| 400 on a later request that carries the block: a validation error that says `compaction` is not one of the expected content block types. The message doesn't mention the header. | That request left out the beta header. | Add the beta header to every request that carries the block; see [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). | +| 400 validation error, such as `messages.0.content.0.compaction.citations: Extra inputs are not permitted` | A block was sent back with fields the API didn't return, such as `citations: null`. | Send the block exactly as returned; see [Continue from the summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#continue-from-the-summary). | ## Count compaction usage diff --git a/content/en/build-with-claude/compaction-thinking-blocks.md b/content/en/build-with-claude/compaction-thinking-blocks.md index 1bea824b5d..a08b16b875 100644 --- a/content/en/build-with-claude/compaction-thinking-blocks.md +++ b/content/en/build-with-claude/compaction-thinking-blocks.md @@ -51,7 +51,7 @@ Compactions from before a thinking block was produced don't count against it. Th ## Change the system prompt or tools -A later request can use a different `system`, different `tools`, or a different model than the compaction request, and the API still accepts the block. Such a change can invalidate the thinking in the kept turns, but it has no other effect. +A later request can use a different `system`, different `tools`, or a different model from the compaction request, and the API still accepts the block. Such a change can invalidate the thinking in the kept turns, but it has no other effect. To change `system` or `tools` without invalidating any kept thinking, compact the whole conversation first, so no turns are kept. Then change them on the next request. @@ -68,7 +68,7 @@ The compaction response doesn't say whether the kept thinking holds. The first r 3. Send the next request, with the block first, then the kept turn, then a new `user` message, and with `thinking.block_binding.prefix_mismatch_behavior` set to `"error"`. 4. Read the result. A 200 response whose `input_transformations` array is empty means no thinking block failed the check or was dropped. A 400 error that says the block is bound to a different conversation means one did. The message starts with the path of the first block that failed, and [What the API does with an invalid block](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#mismatch-behavior) shows it in full. -The `prefix_mismatch_behavior` field needs the `thinking-binding-controls-2026-08-01` beta header in addition to [the `compact-2026-09-04` beta header](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). Setting the field also opts the request into the check on accounts where the check isn't on by default. +The `prefix_mismatch_behavior` field needs the `thinking-binding-controls-2026-08-01` beta header in addition to the [`compact-2026-09-04` beta header](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary). Setting the field also opts the request into the check on accounts where the check isn't on by default. The following program runs the four steps. It prints how many thinking blocks the kept turn holds and how many entries `input_transformations` has; no entries means the kept thinking held: @@ -252,7 +252,7 @@ The following program runs the four steps. It prints how many thinking blocks th // 1. Have a short conversation with thinking on. List history = [ - new() { Role = Role.User, Content = "What are the main entities in the app's data model?" }, + new BetaUserMessageParam { Content = "What are the main entities in the app's data model?" }, ]; var first = await client.Beta.Messages.Create(new MessageCreateParams { @@ -265,14 +265,12 @@ The following program runs the four steps. It prints how many thinking blocks th }); history.AddRange( [ - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = first.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, - new() + new BetaUserMessageParam { - Role = Role.User, Content = "Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?", }, ]); @@ -285,9 +283,8 @@ The following program runs the four steps. It prints how many thinking blocks th Thinking = thinking, Messages = history, }); - history.Add(new() + history.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = second.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); var thinkingBlocks = second.Content.Count(block => block.TryPickThinking(out _)); @@ -312,13 +309,12 @@ The following program runs the four steps. It prints how many thinking blocks th // 3. Put the block in front of the kept turn and ask the next question. history = [ - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = summary.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }, .. history[2..], - new() { Role = Role.User, Content = "Which day should the release go out?" }, + new BetaUserMessageParam { Content = "Which day should the release go out?" }, ]; var third = await client.Beta.Messages.Create(new MessageCreateParams { @@ -464,10 +460,7 @@ The following program runs the four steps. It prints how many thinking blocks th // 1. Have a short conversation with thinking on. var history = new ArrayList(); - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("What are the main entities in the app's data model?") - .build()); + history.add(BetaMessageParam.ofUser("What are the main entities in the app's data model?")); var firstParams = MessageCreateParams.builder() .model(MODEL) .maxTokens(8192) @@ -478,10 +471,8 @@ The following program runs the four steps. It prints how many thinking blocks th .build(); var first = client.beta().messages().create(firstParams); history.add(first.toParam()); - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?") - .build()); + history.add(BetaMessageParam.ofUser( + "Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?")); var secondParams = MessageCreateParams.builder() .model(MODEL) .maxTokens(8192) @@ -514,10 +505,7 @@ The following program runs the four steps. It prints how many thinking blocks th // 3. Put the block in front of the kept turn and ask the next question. firstTurn.clear(); history.addFirst(summary.toParam()); - history.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Which day should the release go out?") - .build()); + history.add(BetaMessageParam.ofUser("Which day should the release go out?")); var thirdParams = MessageCreateParams.builder() .model(MODEL) .maxTokens(8192) diff --git a/content/en/build-with-claude/compaction-threshold.md b/content/en/build-with-claude/compaction-threshold.md index 922216ecdc..1c98b90536 100644 --- a/content/en/build-with-claude/compaction-threshold.md +++ b/content/en/build-with-claude/compaction-threshold.md @@ -152,7 +152,7 @@ Enable compaction by adding the `compact_20260112` strategy to `context_manageme var messages = new List { - new() { Role = Role.User, Content = "Help me build a website" } + new BetaUserMessageParam { Content = "Help me build a website" } }; var parameters = new MessageCreateParams @@ -170,9 +170,8 @@ Enable compaction by adding the `compact_20260112` strategy to `context_manageme var response = await client.Beta.Messages.Create(parameters); // Append the response (including any compaction block) to continue the conversation - messages.Add(new BetaMessageParam + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); @@ -264,7 +263,7 @@ Enable compaction by adding the `compact_20260112` strategy to `context_manageme response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -384,7 +383,7 @@ Configure when compaction triggers using the `trigger` parameter: ```csharp C# AnthropicClient client = new(); - List messages = [new() { Role = Role.User, Content = "Hello" }]; + List messages = [new BetaUserMessageParam { Content = "Hello" }]; var parameters = new MessageCreateParams { @@ -484,7 +483,7 @@ Configure when compaction triggers using the `trigger` parameter: response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -608,9 +607,9 @@ You can provide custom instructions through the `instructions` parameter. Custom MaxTokens = 4096, Messages = [ - new BetaMessageParam { Role = Role.User, Content = "Help me build a Python web scraper" }, - new BetaMessageParam { Role = Role.Assistant, Content = "I'll help you build a web scraper..." }, - new BetaMessageParam { Role = Role.User, Content = "Add support for JavaScript-rendered pages" } + new BetaUserMessageParam { Content = "Help me build a Python web scraper" }, + new BetaAssistantMessageParam { Content = "I'll help you build a web scraper..." }, + new BetaUserMessageParam { Content = "Add support for JavaScript-rendered pages" } ], ContextManagement = new BetaContextManagementConfig { @@ -705,7 +704,7 @@ You can provide custom instructions through the `instructions` parameter. Custom response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: [ { role: "user", content: "Help me build a Python web scraper" }, @@ -858,7 +857,7 @@ When enabled, the API returns a message with the `compaction` stop reason after var client = new AnthropicClient(); var messages = new List { - new() { Role = Role.User, Content = "Hello, Claude" } + new BetaUserMessageParam { Content = "Hello, Claude" } }; var parameters = new MessageCreateParams @@ -880,9 +879,8 @@ When enabled, the API returns a message with the `compaction` stop reason after if (response.StopReason == BetaStopReason.Compaction) { - messages.Add(new BetaMessageParam + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); @@ -1039,7 +1037,7 @@ When enabled, the API returns a message with the `compaction` stop reason after response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -1057,7 +1055,7 @@ When enabled, the API returns a message with the `compaction` stop reason after response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -1072,7 +1070,7 @@ When enabled, the API returns a message with the `compaction` stop reason after #### Enforcing a total token budget -When a model works on long tasks with many tool-use iterations, total token consumption can grow significantly. You can combine `pause_after_compaction` with a compaction counter to estimate cumulative usage and gracefully wrap up the task once a budget is reached. +When a model works on long tasks with many tool-use iterations, total token consumption can grow significantly. You can combine `pause_after_compaction` with a compaction counter to estimate cumulative usage and gracefully end the task once a budget is reached. This example appears in the SDK languages only: its value is the budget-tracking logic around the request. The raw request combines the `trigger` from [Trigger configuration](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#trigger-configuration) with `pause_after_compaction` from [Pausing after compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#pausing-after-compaction). @@ -1155,7 +1153,7 @@ This example appears in the SDK languages only: its value is the budget-tracking ```csharp C# AnthropicClient client = new(); - List messages = [new() { Role = Role.User, Content = "Hello, Claude" }]; + List messages = [new BetaUserMessageParam { Content = "Hello, Claude" }]; const int TriggerThreshold = 100_000; const int TotalTokenBudget = 3_000_000; @@ -1180,18 +1178,16 @@ This example appears in the SDK languages only: its value is the budget-tracking if (response.StopReason == BetaStopReason.Compaction) { compactionCount += 1; - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(b => new BetaContentBlockParam(b.Json)).ToList() }); // Estimate total tokens consumed; prompt wrap-up if over budget if (compactionCount * TriggerThreshold >= TotalTokenBudget) { - messages.Add(new() + messages.Add(new BetaUserMessageParam { - Role = Role.User, Content = "Please wrap up your current work and summarize the final state." }); } @@ -1252,10 +1248,7 @@ This example appears in the SDK languages only: its value is the budget-tracking int compactionCount = 0; List messages = new ArrayList<>(); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Hello, Claude") - .build()); + messages.add(BetaMessageParam.ofUser("Hello, Claude")); MessageCreateParams params = MessageCreateParams.builder() .addBeta("compact-2026-01-12") @@ -1281,10 +1274,8 @@ This example appears in the SDK languages only: its value is the budget-tracking // Estimate total tokens consumed; prompt wrap-up if over budget if (compactionCount * triggerThreshold >= totalTokenBudget) { - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Please wrap up your current work and summarize the final state.") - .build()); + messages.add(BetaMessageParam.ofUser( + "Please wrap up your current work and summarize the final state.")); } } @@ -1339,7 +1330,7 @@ This example appears in the SDK languages only: its value is the budget-tracking response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -1468,7 +1459,7 @@ You must pass the `compaction` block back to the API on subsequent requests to c var messages = new List { - new() { Role = Role.User, Content = "Help me build a web scraper" } + new BetaUserMessageParam { Content = "Help me build a web scraper" } }; var response = await client.Beta.Messages.Create(new() @@ -1483,13 +1474,12 @@ You must pass the `compaction` block back to the API on subsequent requests to c } }); - messages.Add(new BetaMessageParam + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); - messages.Add(new BetaMessageParam { Role = Role.User, Content = "Now add error handling" }); + messages.Add(new BetaUserMessageParam { Content = "Now add error handling" }); var nextResponse = await client.Beta.Messages.Create(new() { @@ -1627,7 +1617,7 @@ You must pass the `compaction` block back to the API on subsequent requests to c response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -1641,7 +1631,7 @@ You must pass the `compaction` block back to the API on subsequent requests to c next_response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -1658,7 +1648,7 @@ In Python, use `client.beta.messages`, as the samples on this page do. If you ca When the API receives a `compaction` block, all content blocks before it are ignored. You can either: * Keep the original messages in your list and let the API handle removing the compacted content -* Manually drop the compacted messages and only include the compaction block onwards +* Manually drop the compacted messages and only include the compaction block onward On Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, thinking blocks from before a `compaction` block aren't carried forward, so the summary is all the model has of that earlier work. If you write your own `instructions`, tell the model what the summary must retain; see [Tell the model what to preserve in compaction summaries](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#tell-the-model-what-to-preserve-in-compaction-summaries). @@ -1794,7 +1784,7 @@ The compaction block streams differently from text blocks. You receive a `conten ```csharp C# var client = new AnthropicClient(); - List messages = [new() { Role = Role.User, Content = "Hello" }]; + List messages = [new BetaUserMessageParam { Content = "Hello" }]; var parameters = new MessageCreateParams { @@ -1969,7 +1959,7 @@ The compaction block streams differently from text blocks. You receive a `conten stream = client.beta.messages.stream( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -2143,7 +2133,7 @@ To maximize cache hit rates, add a `cache_control` breakpoint at the end of your CacheControl = new BetaCacheControlEphemeral() } }, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], ContextManagement = new BetaContextManagementConfig { Edits = [new BetaCompact20260112Edit()] @@ -2239,7 +2229,7 @@ To maximize cache hit rates, add a `cache_control` breakpoint at the end of your response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, system: [ { @@ -2377,7 +2367,7 @@ The token counting endpoint (`/v1/messages/count_tokens`) applies existing `comp ```csharp C# AnthropicClient client = new(); - List messages = [new() { Role = Role.User, Content = "Hello" }]; + List messages = [new BetaUserMessageParam { Content = "Hello" }]; var countParams = new MessageCountTokensParams { @@ -2464,7 +2454,7 @@ The token counting endpoint (`/v1/messages/count_tokens`) applies existing `comp count_response = client.beta.messages.count_tokens( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, messages: messages, context_management: { edits: [{ type: "compact_20260112" }] @@ -2575,7 +2565,7 @@ Here's a complete example of a long-running conversation with compaction: static async Task Chat(AnthropicClient client, List messages, string userMessage) { - messages.Add(new() { Role = Role.User, Content = userMessage }); + messages.Add(new BetaUserMessageParam { Content = userMessage }); var parameters = new MessageCreateParams { @@ -2594,9 +2584,8 @@ Here's a complete example of a long-running conversation with compaction: var response = await client.Beta.Messages.Create(parameters); - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); @@ -2676,10 +2665,7 @@ Here's a complete example of a long-running conversation with compaction: } private static String chat(String userMessage) { - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(userMessage) - .build()); + messages.add(BetaMessageParam.ofUser(userMessage)); MessageCreateParams params = MessageCreateParams.builder() .addBeta("compact-2026-01-12") @@ -2754,7 +2740,7 @@ Here's a complete example of a long-running conversation with compaction: response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -2966,7 +2952,7 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha async Task Chat(string userMessage) { - messages.Add(new() { Role = Role.User, Content = userMessage }); + messages.Add(new BetaUserMessageParam { Content = userMessage }); var response = await client.Beta.Messages.Create(new() { @@ -2991,25 +2977,29 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha // Preserve the prior exchange + current user message (3 messages), // without thinking blocks; an assistant turn left empty is dropped - var preserved = messages - .Skip(Math.Max(0, messages.Count - 3)) - .Select(message => message.Content.TryPickBetaContentBlockParams(out var blocks) - ? new BetaMessageParam - { - Role = message.Role, - Content = blocks - .Where(block => block.Type.GetString() is not ("thinking" or "redacted_thinking")) - .ToList() - } - : message) - .Where(message => !message.Content.TryPickBetaContentBlockParams(out var blocks) || blocks.Count > 0) - .ToList(); + var preserved = new List(); + foreach (var message in messages.Skip(Math.Max(0, messages.Count - 3))) + { + if (!message.TryPickAssistant(out var assistant) + || !assistant.Content.TryPickBetaContentBlockParams(out var blocks)) + { + preserved.Add(message); + continue; + } + + var kept = blocks + .Where(block => block.Type.Raw() is not ("thinking" or "redacted_thinking")) + .ToList(); + if (kept.Count > 0) + { + preserved.Add(assistant with { Content = kept }); + } + } var messagesAfterCompaction = new List { - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, Content = new List { new BetaContentBlockParam(response.Content[0].Json) } } }; @@ -3030,9 +3020,8 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha messages = messagesAfterCompaction; } - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList() }); @@ -3153,10 +3142,7 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha private static final List messages = new ArrayList<>(); public static String chat(String userMessage) { - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content(userMessage) - .build()); + messages.add(BetaMessageParam.ofUser(userMessage)); MessageCreateParams params = MessageCreateParams.builder() .addBeta("compact-2026-01-12") @@ -3182,15 +3168,14 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha // without thinking blocks; an assistant turn left empty is dropped List preservedMessages = new ArrayList<>(); for (BetaMessageParam message : messages.subList(Math.max(0, messages.size() - 3), messages.size())) { - if (message.content().isBetaContentBlockParams()) { - message = message.toBuilder() - .contentOfBetaContentBlockParams(message.content().asBetaContentBlockParams().stream() - .filter(block -> !block.isThinking() && !block.isRedactedThinking()) - .toList()) - .build(); - if (message.content().asBetaContentBlockParams().isEmpty()) { + if (message.isAssistant() && message.asAssistant().content().isContentBlockParams()) { + var keptBlocks = message.asAssistant().content().asContentBlockParams().stream() + .filter(block -> !block.isThinking() && !block.isRedactedThinking()) + .toList(); + if (keptBlocks.isEmpty()) { continue; } + message = BetaMessageParam.ofAssistantOfContentBlockParams(keptBlocks); } preservedMessages.add(message); } @@ -3315,7 +3300,7 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages, context_management: { @@ -3346,7 +3331,7 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha response = client.beta.messages.create( betas: ["compact-2026-01-12"], - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: messages_after_compaction, context_management: { @@ -3390,7 +3375,7 @@ Here's an example that uses `pause_after_compaction` to preserve the prior excha Learn about context window sizes and management strategies. - + Explore a practical implementation that manages long-running conversations with instant session memory compaction using background threading and prompt caching. diff --git a/content/en/build-with-claude/compaction.md b/content/en/build-with-claude/compaction.md index 1a5f392703..750d31bf18 100644 --- a/content/en/build-with-claude/compaction.md +++ b/content/en/build-with-claude/compaction.md @@ -6,7 +6,7 @@ description: Learn what compaction does, how compaction on demand and compaction Compaction replaces the older turns of a conversation with a summary that Claude writes on the server, so you need no summarization code of your own. It keeps a long conversation or agent task inside the context window, and it keeps the active context small, because response quality degrades as a conversation grows. -If you want to skip this overview, start with [Compaction on demand](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand) to add compaction to your application. While both it and [Compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) are in beta, Compaction on demand covers more common use cases. To clear old tool results or old thinking blocks by rule instead of summarizing them, see [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing). +If you want to skip this overview, start with [Compaction on demand](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand) to add compaction to your application. Although both it and [Compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) are in beta, Compaction on demand covers more common use cases. To clear old tool results or old thinking blocks by rule instead of summarizing them, see [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing). ## Choose how to compact @@ -21,7 +21,7 @@ Use on-demand compaction wherever it is available. | **Runs in the background** | Yes: [Compaction in the background](https://platform.claude.com/docs/en/build-with-claude/compaction-background) | No: it runs inside the request that reaches the threshold | Yes, in your own code | | **Kept turns keep their thinking**, on models with [preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) | Yes, under the conditions in [Compaction and preserved thinking](https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks) | No: on Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, remove or drop the thinking in turns you re-insert (see the [threshold compaction examples](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#examples)) | No: that thinking [fails the check](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#keep-tail-compaction) | | **Beta header, parameter, and platforms** | `compact-2026-09-04` and the top-level `compaction` parameter. Platforms: see the [on-demand Compatibility list](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#compatibility) | See the [threshold Compatibility list](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#compatibility) and [Basic usage](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#basic-usage) | None. It runs in your code | -| **Choose it when** | Your application needs to control when compaction happens, can't pause while a summary is written, or must keep recent turns and their thinking | You want the API to manage context inside ordinary requests | You already run your own summarizer and it replaces the whole history with the summary | +| **Choose it when** | Your application needs to control when compaction occurs, can't pause while a summary is written, or must keep recent turns and their thinking | You want the API to manage context inside ordinary requests | You already run your own summarizer and it replaces the whole history with the summary | ## On-demand compaction options diff --git a/content/en/build-with-claude/context-editing.md b/content/en/build-with-claude/context-editing.md index a90ef87263..7da069057c 100644 --- a/content/en/build-with-claude/context-editing.md +++ b/content/en/build-with-claude/context-editing.md @@ -14,11 +14,11 @@ description: Automatically manage conversation context as it grows with context For most use cases, [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) is the primary strategy for managing context in long-running conversations. The strategies on this page are useful for specific scenarios where you need more fine-grained control over what content is cleared. -Context editing allows you to selectively clear specific content from conversation history as it grows. Beyond optimizing costs and staying within limits, this is about actively curating what Claude sees: context is a finite resource with diminishing returns, and irrelevant content degrades model focus. Context editing gives you fine-grained runtime control over that curation. For the broader principles behind context management, see [Effective context engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents). This page covers: +Context editing allows you to selectively clear specific content from conversation history as it grows. Beyond optimizing costs and staying within limits, this is about actively curating what Claude receives: context is a finite resource with diminishing returns, and irrelevant content degrades model focus. Context editing gives you fine-grained runtime control over that curation. For the broader principles behind context management, see [Effective context engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents). This page covers: -* **Tool result clearing** - Best for agentic workflows with heavy tool use where old tool results are no longer needed -* **Thinking block clearing** - For managing thinking blocks from earlier turns, with options to preserve recent thinking for context continuity -* **Client-side SDK compaction** - An SDK-based alternative for summary-based context management (server-side compaction is generally preferred) +* **Tool result clearing:** Best for agentic workflows with heavy tool use where old tool results are no longer needed +* **Thinking block clearing:** For managing thinking blocks from earlier turns, with options to preserve recent thinking for context continuity +* **Client-side SDK compaction:** An SDK-based alternative for summary-based context management (server-side compaction is generally preferred) | Approach | Where it runs | Strategies | How it works | | --------------- | ------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -35,7 +35,7 @@ Context editing allows you to selectively clear specific content from conversati ### Tool result clearing -The `clear_tool_uses_20250919` strategy clears tool results when conversation context grows beyond your configured threshold. This is particularly useful for agentic workflows with heavy tool use. Older tool results (like file contents or search results) are no longer needed once Claude has processed them. +The `clear_tool_uses_20250919` strategy clears tool results when conversation context grows beyond your configured threshold. This is particularly useful for agentic workflows with heavy tool use. Older tool results (such as file contents or search results) are no longer needed once Claude has processed them. When activated, the API automatically clears the oldest tool results in chronological order. The API replaces each cleared result with placeholder text indicating to Claude that it was removed. By default, only tool results are cleared. You can optionally clear both tool results and tool calls (the tool use parameters) by setting `clear_tool_inputs` to true. @@ -56,9 +56,9 @@ The `clear_thinking_20251015` strategy manages `thinking` blocks from earlier as Use this strategy to override the default. If your code runs across multiple model tiers, set `keep` explicitly rather than relying on the per-model default. -An assistant conversation turn may include multiple content blocks (for example, when using tools) and multiple thinking blocks (for example, with [interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#interleaved-thinking)). +An assistant conversation turn might include multiple content blocks (for example, when using tools) and multiple thinking blocks (for example, with [interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#interleaved-thinking)). -### Context editing happens server-side +### Context editing occurs server-side Context editing is applied server-side before the prompt reaches Claude. Your client application maintains the full, unmodified conversation history. You do not need to sync your client state with the edited version. Continue managing your full conversation history locally as you normally would. @@ -70,7 +70,7 @@ Context editing's interaction with [prompt caching](https://platform.claude.com/ * **Tool result clearing:** Invalidates cached prompt prefixes when content is cleared. To account for this, clear enough tokens to make the cache invalidation worthwhile. Use the `clear_at_least` parameter to ensure a minimum number of tokens is cleared each time. You'll incur cache write costs each time content is cleared, but subsequent requests can reuse the newly cached prefix. -* **Thinking block clearing:** When thinking blocks are **kept** in context (not cleared), the prompt cache is preserved, enabling cache hits and reducing input token costs. When thinking blocks are **cleared**, the cache is invalidated at the point where clearing occurs. Configure the `keep` parameter based on whether you want to prioritize cache performance or context window availability. +* **Thinking block clearing:** When thinking blocks are **kept** in context (not cleared), the prompt cache is preserved, allowing cache hits and reducing input token costs. When thinking blocks are **cleared**, the cache is invalidated at the point where clearing occurs. Configure the `keep` parameter based on whether you want to prioritize cache performance or context window availability. ## Supported models @@ -83,31 +83,31 @@ The simplest way to enable tool result clearing is to specify only the strategy ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 4096, - "messages": [ - { - "role": "user", - "content": "Search for recent developments in AI" - } - ], - "tools": [ - { - "type": "web_search_20250305", - "name": "web_search" - } - ], - "context_management": { - "edits": [ - {"type": "clear_tool_uses_20250919"} - ] - } - }' + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 4096, + "messages": [ + { + "role": "user", + "content": "Search for recent developments in AI" + } + ], + "tools": [ + { + "type": "web_search_20250305", + "name": "web_search" + } + ], + "context_management": { + "edits": [ + {"type": "clear_tool_uses_20250919"} + ] + } + }' ``` ```bash CLI @@ -176,9 +176,7 @@ The simplest way to enable tool result clearing is to specify only the strategy { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [ - new() { Role = Role.User, Content = "Search for recent developments in AI" } - ], + Messages = [new BetaUserMessageParam { Content = "Search for recent developments in AI" }], Tools = [ new BetaWebSearchTool20250305() ], @@ -298,52 +296,52 @@ You can customize the tool result clearing behavior with additional parameters: ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 4096, - "messages": [ - { - "role": "user", - "content": "Create a simple command line calculator app using Python" - } - ], - "tools": [ - { - "type": "text_editor_20250728", - "name": "str_replace_based_edit_tool", - "max_characters": 10000 - }, - { - "type": "web_search_20250305", - "name": "web_search", - "max_uses": 3 - } - ], - "context_management": { - "edits": [ - { - "type": "clear_tool_uses_20250919", - "trigger": { - "type": "input_tokens", - "value": 30000 - }, - "keep": { - "type": "tool_uses", - "value": 3 - }, - "clear_at_least": { - "type": "input_tokens", - "value": 5000 - }, - "exclude_tools": ["web_search"] - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 4096, + "messages": [ + { + "role": "user", + "content": "Create a simple command line calculator app using Python" + } + ], + "tools": [ + { + "type": "text_editor_20250728", + "name": "str_replace_based_edit_tool", + "max_characters": 10000 + }, + { + "type": "web_search_20250305", + "name": "web_search", + "max_uses": 3 + } + ], + "context_management": { + "edits": [ + { + "type": "clear_tool_uses_20250919", + "trigger": { + "type": "input_tokens", + "value": 30000 + }, + "keep": { + "type": "tool_uses", + "value": 3 + }, + "clear_at_least": { + "type": "input_tokens", + "value": 5000 + }, + "exclude_tools": ["web_search"] } - }' + ] + } + }' ``` ```bash CLI @@ -481,7 +479,7 @@ You can customize the tool result clearing behavior with additional parameters: Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 4096, Messages = [ - new() { Role = Role.User, Content = "Create a simple command line calculator app using Python" } + new BetaUserMessageParam { Content = "Create a simple command line calculator app using Python" } ], Tools = [ new BetaToolTextEditor20250728 { MaxCharacters = 10000 }, @@ -701,26 +699,26 @@ Use thinking block clearing to manage context and prompt caching in conversation ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 16000, - "messages": [{"role": "user", "content": "Hello"}], - "context_management": { - "edits": [ - { - "type": "clear_thinking_20251015", - "keep": { - "type": "thinking_turns", - "value": 2 - } - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 16000, + "messages": [{"role": "user", "content": "Hello"}], + "context_management": { + "edits": [ + { + "type": "clear_thinking_20251015", + "keep": { + "type": "thinking_turns", + "value": 2 + } } - }' + ] + } + }' ``` ```bash CLI @@ -792,9 +790,7 @@ Use thinking block clearing to manage context and prompt caching in conversation { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 16000, - Messages = [ - new() { Role = Role.User, Content = "Hello" } - ], + Messages = [new BetaUserMessageParam { Content = "Hello" }], Betas = [AnthropicBeta.ContextManagement2025_06_27], ContextManagement = new BetaContextManagementConfig { @@ -932,26 +928,26 @@ Keep thinking blocks from the last 3 assistant turns: ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 16000, - "messages": [{"role": "user", "content": "Hello"}], - "context_management": { - "edits": [ - { - "type": "clear_thinking_20251015", - "keep": { - "type": "thinking_turns", - "value": 3 - } - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 16000, + "messages": [{"role": "user", "content": "Hello"}], + "context_management": { + "edits": [ + { + "type": "clear_thinking_20251015", + "keep": { + "type": "thinking_turns", + "value": 3 + } } - }' + ] + } + }' ``` ```bash CLI @@ -1023,9 +1019,7 @@ Keep thinking blocks from the last 3 assistant turns: { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 16000, - Messages = [ - new() { Role = Role.User, Content = "Hello" } - ], + Messages = [new BetaUserMessageParam { Content = "Hello" }], Betas = [AnthropicBeta.ContextManagement2025_06_27], ContextManagement = new BetaContextManagementConfig { @@ -1146,23 +1140,23 @@ Keep all thinking blocks (maximizes cache hits): ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 16000, - "messages": [{"role": "user", "content": "Hello"}], - "context_management": { - "edits": [ - { - "type": "clear_thinking_20251015", - "keep": "all" - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 16000, + "messages": [{"role": "user", "content": "Hello"}], + "context_management": { + "edits": [ + { + "type": "clear_thinking_20251015", + "keep": "all" } - }' + ] + } + }' ``` ```bash CLI @@ -1229,9 +1223,7 @@ Keep all thinking blocks (maximizes cache hits): { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 16000, - Messages = [ - new() { Role = Role.User, Content = "Hello" } - ], + Messages = [new BetaUserMessageParam { Content = "Hello" }], Betas = [AnthropicBeta.ContextManagement2025_06_27], ContextManagement = new BetaContextManagementConfig { @@ -1348,49 +1340,49 @@ You can use both thinking block clearing and tool result clearing together: ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 16000, - "messages": [ - { - "role": "user", - "content": "Search for the latest developments in quantum error correction and summarize the key breakthroughs." - } - ], - "tools": [ - { - "type": "web_search_20250305", - "name": "web_search", - "max_uses": 5 - } - ], - "context_management": { - "edits": [ - { - "type": "clear_thinking_20251015", - "keep": { - "type": "thinking_turns", - "value": 2 - } - }, - { - "type": "clear_tool_uses_20250919", - "trigger": { - "type": "input_tokens", - "value": 50000 - }, - "keep": { - "type": "tool_uses", - "value": 5 - } - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 16000, + "messages": [ + { + "role": "user", + "content": "Search for the latest developments in quantum error correction and summarize the key breakthroughs." + } + ], + "tools": [ + { + "type": "web_search_20250305", + "name": "web_search", + "max_uses": 5 + } + ], + "context_management": { + "edits": [ + { + "type": "clear_thinking_20251015", + "keep": { + "type": "thinking_turns", + "value": 2 + } + }, + { + "type": "clear_tool_uses_20250919", + "trigger": { + "type": "input_tokens", + "value": 50000 + }, + "keep": { + "type": "tool_uses", + "value": 5 + } } - }' + ] + } + }' ``` ```bash CLI @@ -1421,6 +1413,8 @@ You can use both thinking block clearing and tool result clearing together: ``` ```python Python + client = anthropic.Anthropic() + response = client.beta.messages.create( model="claude-opus-5-5", max_tokens=16000, @@ -1519,7 +1513,7 @@ You can use both thinking block clearing and tool result clearing together: Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 16000, Messages = [ - new() { Role = Role.User, Content = "Search for the latest developments in quantum error correction and summarize the key breakthroughs." } + new BetaUserMessageParam { Content = "Search for the latest developments in quantum error correction and summarize the key breakthroughs." } ], Tools = [ new BetaWebSearchTool20250305 { MaxUses = 5 } @@ -1731,7 +1725,7 @@ You can use both thinking block clearing and tool result clearing together: | Configuration option | Default | Description | | -------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `trigger` | 100,000 input tokens | Defines when the context editing strategy activates. Once the prompt exceeds this threshold, clearing begins. You can specify this value in either `input_tokens` or `tool_uses`. | +| `trigger` | 100,000 input tokens | Defines when the context editing strategy activates. Once the prompt exceeds this threshold, clearing starts. You can specify this value in either `input_tokens` or `tool_uses`. | | `keep` | 3 tool uses | Defines how many recent tool use/result pairs to keep after clearing occurs. The API removes the oldest tool interactions first, preserving the most recent ones. | | `clear_at_least` | None | Ensures a minimum number of tokens is cleared each time the strategy activates. If the API can't clear at least the specified amount, the strategy will not be applied. This helps determine if context clearing is worth breaking your prompt cache. | | `exclude_tools` | None | List of tool names whose tool uses and results should never be cleared. Useful for preserving important context. | @@ -1798,34 +1792,34 @@ The [token counting](https://platform.claude.com/docs/en/build-with-claude/token ```bash cURL curl https://api.anthropic.com/v1/messages/count_tokens \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "messages": [ - { - "role": "user", - "content": "Continue our conversation..." - } - ], - "context_management": { - "edits": [ - { - "type": "clear_tool_uses_20250919", - "trigger": { - "type": "input_tokens", - "value": 30000 - }, - "keep": { - "type": "tool_uses", - "value": 5 - } - } - ] + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "messages": [ + { + "role": "user", + "content": "Continue our conversation..." + } + ], + "context_management": { + "edits": [ + { + "type": "clear_tool_uses_20250919", + "trigger": { + "type": "input_tokens", + "value": 30000 + }, + "keep": { + "type": "tool_uses", + "value": 5 + } } - }' + ] + } + }' ``` ```bash CLI @@ -1921,7 +1915,7 @@ The [token counting](https://platform.claude.com/docs/en/build-with-claude/token var parameters = new MessageCountTokensParams { Model = Messages::Model.ClaudeOpus5_5, - Messages = [new() { Role = Role.User, Content = "Continue our conversation..." }], + Messages = [new BetaUserMessageParam { Content = "Continue our conversation..." }], Betas = [AnthropicBeta.ContextManagement2025_06_27], ContextManagement = new BetaContextManagementConfig { @@ -2089,13 +2083,13 @@ The response shows both the final token count after context management is applie ## Using with the memory tool -Context editing can be combined with the [memory tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool). When your conversation context approaches the configured clearing threshold, Claude receives an automatic warning to preserve important information. This enables Claude to save tool results or context to its memory files before they're cleared from the conversation history. +Context editing can be combined with the [memory tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool). When your conversation context approaches the configured clearing threshold, Claude receives an automatic warning to preserve important information. This allows Claude to save tool results or context to its memory files before they're cleared from the conversation history. This combination allows you to: -* **Preserve important context:** Claude can write essential information from tool results to memory files before those results are cleared -* **Maintain long-running workflows:** Enable agentic workflows that would otherwise exceed context limits by offloading information to persistent storage -* **Access information on demand:** Claude can look up previously cleared information from memory files when needed, rather than keeping everything in the active context window +* **Preserve important context:** Claude can write essential information from tool results to memory files before those results are cleared. +* **Maintain long-running workflows:** Claude can continue agentic workflows that would otherwise exceed context limits by offloading information to persistent storage. +* **Access information on demand:** Claude can look up previously cleared information from memory files when needed, rather than keeping everything in the active context window. For example, in a file editing workflow where Claude performs many operations, Claude can summarize completed changes to memory files as the context grows. When tool results are cleared, Claude retains access to that information through its memory system and can continue working effectively. @@ -2104,31 +2098,31 @@ To use both features together, enable them in your API request: ```bash cURL curl https://api.anthropic.com/v1/messages \ - --header "x-api-key: $ANTHROPIC_API_KEY" \ - --header "anthropic-version: 2023-06-01" \ - --header "content-type: application/json" \ - --header "anthropic-beta: context-management-2025-06-27" \ - --data '{ - "model": "claude-opus-5-5", - "max_tokens": 4096, - "messages": [ - { - "role": "user", - "content": "Hello" - } - ], - "tools": [ - { - "type": "memory_20250818", - "name": "memory" - } - ], - "context_management": { - "edits": [ - {"type": "clear_tool_uses_20250919"} - ] - } - }' + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -H "content-type: application/json" \ + -H "anthropic-beta: context-management-2025-06-27" \ + -d '{ + "model": "claude-opus-5-5", + "max_tokens": 4096, + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "tools": [ + { + "type": "memory_20250818", + "name": "memory" + } + ], + "context_management": { + "edits": [ + {"type": "clear_tool_uses_20250919"} + ] + } + }' ``` ```bash CLI @@ -2192,9 +2186,7 @@ To use both features together, enable them in your API request: { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [ - new() { Role = Role.User, Content = "Hello" } - ], + Messages = [new BetaUserMessageParam { Content = "Hello" }], Tools = [ new BetaMemoryTool20250818() ], @@ -2316,7 +2308,7 @@ For the full memory tool reference including commands and examples, see [Memory **Anthropic recommends server-side compaction over SDK compaction.** [Server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) handles context management automatically with less integration complexity, better token usage calculation, and no client-side limitations. Use SDK compaction only if you specifically need client-side control over the summarization process. - The `compaction_control` parameter is deprecated in the TypeScript and Ruby SDKs and will be removed in a future version. The SDKs emit a deprecation warning when it is enabled. The Python SDK removed it in v1.0. To use server-side compaction with a tool runner, pass the `compact_20260112` edit in the request's `context_management` parameter. + The `compaction_control` parameter is deprecated in the TypeScript and Ruby SDKs and will be removed in a future version. The TypeScript and Ruby SDKs emit a deprecation warning when it is enabled. The Python SDK removed it in v1.0. To use server-side compaction with a tool runner, pass the `compact_20260112` edit in the request's `context_management` parameter. @@ -2332,7 +2324,7 @@ When compaction is enabled, the SDK monitors token usage after each model respon 1. **Threshold check:** The SDK calculates total tokens as `input_tokens + cache_creation_input_tokens + cache_read_input_tokens + output_tokens` (see [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for the cache token fields). 2. **Summary generation:** When the threshold is exceeded, a summary prompt is injected as a user turn, and Claude generates a structured summary wrapped in `` tags. 3. **Context replacement:** The SDK extracts the summary and replaces the entire message history with it. -4. **Continuation:** The conversation resumes from the summary, with Claude picking up where it left off. +4. **Continuation:** The conversation resumes from the summary, with Claude continuing from where it stopped. ### Using compaction @@ -2353,7 +2345,7 @@ Add `compaction_control` to your `tool_runner` call to enable automatic summariz - In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2377,25 +2369,25 @@ Add `compaction_control` to your `tool_runner` call to enable automatic summariz - The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2485,7 +2477,7 @@ The threshold determines when compaction occurs. A lower threshold means more fr - In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2510,25 +2502,25 @@ The threshold determines when compaction occurs. A lower threshold means more fr - The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2571,7 +2563,7 @@ You can use a faster or cheaper model for generating summaries: - In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2599,25 +2591,25 @@ You can use a faster or cheaper model for generating summaries: - The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2663,7 +2655,7 @@ You can provide a custom prompt for domain-specific needs. Your prompt should in - In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + In v1.0 and later, the Python SDK's tool runner does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2696,25 +2688,25 @@ You can provide a custom prompt for domain-specific needs. Your prompt should in - The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The C# SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Go SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The Java SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. - The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. + The PHP SDK includes a tool runner, but it does not support client-side `compaction_control`. Use [server-side compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) instead: it works with the tool runner by passing the `compact_20260112` edit in the request's `context_management` parameter. @@ -2758,7 +2750,7 @@ The built-in summary prompt instructs Claude to create a structured continuation 4. **Next Steps:** Specific actions needed, blockers, and priority order. 5. **Context to Preserve:** User preferences, domain-specific details, and commitments made. -This structure enables Claude to resume work efficiently without losing important context or repeating mistakes. +This structure allows Claude to resume work efficiently without losing important context or repeating mistakes. ```text wrap @@ -2803,7 +2795,7 @@ This structure enables Claude to resume work efficiently without losing importan Compaction requires special consideration when using server-side tools such as [web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) or [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool). -When using server-side tools, the SDK may incorrectly calculate token usage, causing compaction to trigger at the wrong time. +When using server-side tools, the SDK might incorrectly calculate token usage, causing compaction to trigger at the wrong time. For example, after a web search operation, the API response might show: @@ -2818,12 +2810,12 @@ For example, after a web search operation, the API response might show: } ``` -The SDK calculates total usage as 63,000 + 0 + 270,000 + 1,400 = 334,400 tokens. However, the `cache_read_input_tokens` value includes accumulated reads from multiple internal API calls made by the server-side tool, not your actual conversation context. Your real context length might only be the 63,000 `input_tokens`, but the SDK sees 334k and triggers compaction prematurely. +The SDK calculates total usage as 63,000 + 0 + 270,000 + 1,400 = 334,400 tokens. However, the `cache_read_input_tokens` value includes accumulated reads from multiple internal API calls made by the server-side tool, not your actual conversation context. Your real context length might only be the 63,000 `input_tokens`, but the SDK calculates 334k and triggers compaction prematurely. **Workarounds:** -* Use the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint to get accurate context length -* Avoid compaction when using server-side tools extensively +* Use the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint to get accurate context length. +* Avoid compaction when using server-side tools extensively. #### Tool use edge cases diff --git a/content/en/build-with-claude/context-windows.md b/content/en/build-with-claude/context-windows.md index e3b553c1e2..a248ab7e39 100644 --- a/content/en/build-with-claude/context-windows.md +++ b/content/en/build-with-claude/context-windows.md @@ -54,7 +54,7 @@ Whether thinking blocks from previous assistant turns stay in the context window The following diagram shows how tokens are managed when thinking is enabled on a model that strips previous thinking blocks: - ![Diagram of thinking on a model that strips previous thinking blocks: each turn's thinking block is generated in the output and not carried into later turns' input](https://platform.claude.com/docs/images/context-window-thinking.svg) + ![Thinking on a model that strips previous thinking: each turn's thinking is generated but not carried into later turns' input](https://platform.claude.com/docs/images/context-window-thinking.svg) * **Stripping thinking blocks:** On models that strip previous thinking blocks, thinking blocks (shown in dark gray) are generated during each turn's output phase but are not carried forward as input tokens for subsequent turns. You do not need to strip the thinking blocks yourself: if you pass them back, the Claude API strips them automatically. @@ -69,7 +69,7 @@ The following diagram shows how tokens are managed when thinking is enabled on a The following diagram illustrates how tokens are managed when you combine thinking with tool use on a model that strips previous thinking blocks: - ![Diagram of thinking with tool use: thinking is kept with its tool result, then dropped on the next user turn on models that strip previous thinking blocks](https://platform.claude.com/docs/images/context-window-thinking-tools.svg) + ![Thinking with tools on a model that strips previous thinking: thinking stays with its tool result until the next user turn](https://platform.claude.com/docs/images/context-window-thinking-tools.svg) diff --git a/content/en/build-with-claude/effort.md b/content/en/build-with-claude/effort.md index 52754d0afa..aca7e8dd48 100644 --- a/content/en/build-with-claude/effort.md +++ b/content/en/build-with-claude/effort.md @@ -117,8 +117,7 @@ Set `output_config.effort` on the request. The following example runs one reques Model = Model.ClaudeOpus5_5, MaxTokens = 4096, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Analyze the trade-offs between microservices and monolithic architectures" } ], @@ -200,7 +199,7 @@ Set `output_config.effort` on the request. The following example runs one reques client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: [ { role: "user", content: "Analyze the trade-offs between microservices and monolithic architectures" } @@ -230,7 +229,7 @@ The effort parameter affects **all tokens** in the response, including: * Tool calls and function arguments * Thinking (when active) -Because effort applies to every output token, it works whether or not thinking is enabled. Lower effort also means fewer and terser tool calls. +Because effort applies to every output token, it works with or without thinking. Lower effort also means fewer and terser tool calls. ### Effort levels @@ -302,7 +301,7 @@ The API default is `high`. To use `xhigh`, set `effort` explicitly. The value yo | `xhigh` | The recommended starting point for coding and agentic work, and for exploratory tasks such as repeated tool calling, detailed web search, and knowledge-base search. Expect meaningfully higher token usage than `high`. | | `max` | Reserve for frontier problems. On most workloads `max` adds significant cost for relatively small quality gains, and on some structured-output or less intelligence-sensitive tasks it can lead to overthinking. | -Claude Opus 4.7 also respects effort levels more strictly than Claude Opus 4.6, especially at `low` and `medium`. At lower effort levels, the model scopes its work to what was asked rather than doing more than requested. If you observe shallow reasoning on complex problems with Claude Opus 4.7, raise effort rather than prompting around it. If you must keep effort low for latency, add targeted guidance like "This task involves multistep reasoning. Think carefully before responding." +Claude Opus 4.7 also respects effort levels more strictly than Claude Opus 4.6, especially at `low` and `medium`. At lower effort levels, the model scopes its work to what was asked rather than doing more than requested. If you observe shallow reasoning on complex problems with Claude Opus 4.7, raise effort rather than prompting around it. If you must keep effort low for latency, add targeted guidance such as "This task involves multistep reasoning. Think carefully before responding." When running Claude Opus 4.7 at `xhigh` or `max` effort, set a large `max_tokens` so the model has room to think and act across subagents and tool calls. Starting at 64k tokens and tuning from there is a reasonable default. @@ -312,7 +311,7 @@ Claude Sonnet 5.5 supports all five effort levels, and `high` is the default on To turn off up-front thinking, send `thinking: {"type": "between_tools"}` instead of `"disabled"`. It's the lowest thinking setting on Claude Sonnet 5.5, and it works at `low`, `medium`, and `high` effort. At `xhigh` or `max`, a request with it returns a 400 error, so use adaptive thinking at those levels: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. See [Running without up-front thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#running-without-up-front-thinking). -Claude Sonnet 5.5 also supports [changing effort mid-conversation](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) with a per-message `output_config`, which preserves the prompt cache. With `between_tools`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort per turn, use adaptive thinking. See [Prompting Claude Sonnet 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#calibrate-effort). +Claude Sonnet 5.5 also supports [changing effort mid-conversation](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) with a per-message `output_config`, which preserves the prompt cache. With `between_tools`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort for each turn, use adaptive thinking. See [Prompting Claude Sonnet 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#calibrate-effort). ### Recommended effort levels for Claude Sonnet 5 @@ -328,7 +327,7 @@ Claude Sonnet 5 defaults to `high` effort on the Claude API and Claude Code. Sonnet 4.6 defaults to `high` effort. Explicitly set effort when using Sonnet 4.6 to avoid unexpected latency: -* **Medium effort** (recommended default): Best balance of speed, cost, and performance for most applications. Suitable for agentic coding, tool-heavy workflows, and code generation. +* **Medium effort (recommended default):** Best balance of speed, cost, and performance for most applications. Suitable for agentic coding, tool-heavy workflows, and code generation. * **Low effort:** For high-volume or latency-sensitive workloads. Suitable for chat and non-coding use cases where faster turnaround is prioritized. * **High effort:** For complex reasoning and tasks where quality matters more than speed or cost. * **Max effort:** For tasks requiring the absolute highest capability with no constraints on token spending. @@ -350,7 +349,7 @@ When using tools, the effort parameter affects both the explanations around tool * Proceed directly to action without preamble * Use terse confirmation messages after completion -Higher effort levels may: +Higher effort levels might: * Make more tool calls * Explain the plan before taking action @@ -375,7 +374,7 @@ You can run later turns of a conversation at a different effort level in two way Per-message effort is in beta. On the Claude API and [Google Cloud](https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai), it's available on Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, and Claude Haiku 5.5. On [Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), it's available on Claude Fable 5.1, Claude Mythos 5.1, and Claude Opus 5.5. It requires the [beta header](https://platform.claude.com/docs/en/api/beta-headers) `mid-conversation-output-config-2026-07-01`. With the Amazon Bedrock [InvokeModel API](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy), it's available on Claude Fable 5.1 and Claude Opus 5.5, and you send that value in the `anthropic_beta` array of the request body instead. -Without the beta value, a per-message `output_config` returns a 400 error: `messages.N.output_config: Extra inputs are not permitted`, where `N` is the index of the `system` message in `messages`. With the beta value, models without per-message effort, including Claude Fable 5, return a 400 error: `output_config.effort requires a model that supports per-turn effort; this model does not`. On Amazon Bedrock, those models and Claude Opus 5 return the `Extra inputs are not permitted` error instead. On Claude Sonnet 5.5 with `thinking: {"type": "between_tools"}` and on Claude Haiku 5.5 with `thinking: {"type": "disabled"}`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort per turn, use adaptive thinking. +Without the beta value, a per-message `output_config` returns a 400 error: `messages.N.output_config: Extra inputs are not permitted`, where `N` is the index of the `system` message in `messages`. With the beta value, models without per-message effort, including Claude Fable 5, return a 400 error: `output_config.effort requires a model that supports per-turn effort; this model does not`. On Amazon Bedrock, those models and Claude Opus 5 return the `Extra inputs are not permitted` error instead. On Claude Sonnet 5.5 with `thinking: {"type": "between_tools"}` and on Claude Haiku 5.5 with `thinking: {"type": "disabled"}`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort for each turn, use adaptive thinking. Add a `role: "system"` message with empty `content` and the new level in `output_config.effort`. Placed directly after a `user` turn with new input, it sets the level for Claude's reply to that turn. Placed anywhere else, such as between an `assistant` turn and the next `user` turn as in the following example, it takes effect from the next `user` turn with new input. A `user` turn that holds only `tool_result` blocks doesn't count as new input, so a change placed after one in a tool-use loop waits for the next `user` turn with new input. The new level then holds until a later message changes it. Everything before that message is unchanged, so the cached prefix still matches. @@ -496,16 +495,15 @@ The following example starts at `high`, then drops to `low` for a routine follow OutputConfig = new() { Effort = Effort.High }, Messages = [ - new() { Role = Role.User, Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, - new() { Role = Role.Assistant, Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, + new BetaUserMessageParam { Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, + new BetaAssistantMessageParam { Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, // Effort-only system message: the new level takes effect from the next user turn. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new([]), OutputConfig = new() { Effort = BetaSystemMessageOutputConfigEffort.Low }, }, - new() { Role = Role.User, Content = "Summarize the plan in one sentence." }, + new BetaUserMessageParam { Content = "Summarize the plan in one sentence." }, ], Betas = [AnthropicBeta.MidConversationOutputConfig2026_07_01], }); @@ -556,9 +554,9 @@ The following example starts at `high`, then drops to `low` for a routine follow ```java Java import com.anthropic.models.beta.AnthropicBeta; import com.anthropic.models.beta.messages.BetaMessage; - import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaOutputConfig; import com.anthropic.models.beta.messages.BetaSystemMessageOutputConfig; + import com.anthropic.models.beta.messages.BetaSystemMessageParam; import com.anthropic.models.beta.messages.MessageCreateParams; import com.anthropic.models.messages.Model; @@ -575,9 +573,8 @@ The following example starts at `high`, then drops to `low` for a routine follow .addUserMessage("Plan a migration from SQLite to PostgreSQL in three short steps.") .addAssistantMessage("1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts.") // Effort-only system message: the new level takes effect from the next user turn. - .addMessage(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) - .contentOfBetaContentBlockParams(List.of()) + .addMessage(BetaSystemMessageParam.builder() + .contentOfBlocks(List.of()) .outputConfig(BetaSystemMessageOutputConfig.builder() .effort(BetaSystemMessageOutputConfig.Effort.LOW) .build()) @@ -630,7 +627,7 @@ The following example starts at `high`, then drops to `low` for a routine follow client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 4096, output_config: {effort: :high}, messages: [ @@ -662,7 +659,7 @@ The top-level `output_config.effort` applies to the whole request. To run a late 1. **Set effort explicitly:** The API defaults to `high` (`medium` on Claude Opus 5.5 and Claude Haiku 5.5), but the right starting point depends on your model and workload. 2. **Use low for speed-sensitive or simple tasks:** When latency matters or tasks are straightforward, low effort can significantly reduce response times and costs. 3. **Test your use case:** The impact of effort levels varies by task type. Evaluate performance on your specific use cases before deploying. -4. **Consider dynamic effort:** Adjust effort based on task complexity. Simple queries may warrant low effort while agentic coding and complex reasoning benefit from high effort. See the next item before varying it within one conversation. +4. **Consider dynamic effort:** Adjust effort based on task complexity. Simple queries might warrant low effort, whereas agentic coding and complex reasoning benefit from high effort. See the next item before varying it within one conversation. 5. **Hold top-level effort constant within cached conversations:** Changing the top-level effort value between requests invalidates [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), so vary it across workloads rather than within a conversation that relies on cache hits. On models that support it, use a [per-message effort change](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) instead, which preserves the cache. See [Thinking and prompt caching](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-prompt-caching). ## Next steps diff --git a/content/en/build-with-claude/embeddings.md b/content/en/build-with-claude/embeddings.md index 742990eb1b..3741284069 100644 --- a/content/en/build-with-claude/embeddings.md +++ b/content/en/build-with-claude/embeddings.md @@ -1,15 +1,15 @@ --- title: Embeddings url: https://platform.claude.com/docs/en/build-with-claude/embeddings -description: Text embeddings are numerical representations of text that enable measuring semantic similarity. This guide introduces embeddings, their applications, and how to use embedding models for tasks like search, recommendations, and anomaly detection. +description: Text embeddings are numerical representations of text that let you measure semantic similarity. This guide introduces embeddings, their applications, and how to use embedding models for tasks such as search, recommendations, and anomaly detection. --- ## Before implementing embeddings When selecting an embeddings provider, there are several factors you can consider depending on your needs and preferences: -* Dataset size & domain specificity: size of the model training dataset and its relevance to the domain you want to embed. Larger or more domain-specific data generally produces better in-domain embeddings -* Inference performance: embedding lookup speed and end-to-end latency. This is a particularly important consideration for large scale production deployments +* Dataset size and domain specificity: size of the model training dataset and its relevance to the domain you want to embed. Larger or more domain-specific data generally produces better in-domain embeddings +* Inference performance: embedding lookup speed and end-to-end latency. This is a particularly important consideration for large-scale production deployments * Customization: options for continued training on private data, or specialization of models for very specific domains. This can improve performance on unique vocabularies ## How to get embeddings with Anthropic @@ -140,7 +140,7 @@ curl https://ai.mongodb.com/v1/embeddings \ }' ``` -The response you would get is a JSON object containing the embeddings and the token usage: +The response is a JSON object containing the embeddings and the token usage: ```json { @@ -176,7 +176,7 @@ Voyage AI models are also available on AWS Marketplace through [MongoDB's seller The following brief example shows how to use embeddings. -Suppose you have a small corpus of six documents to retrieve from +Suppose you have a small corpus of six documents to retrieve from: ```python documents = [ @@ -200,7 +200,7 @@ vo = voyageai.Client() doc_embds = vo.embed(documents, model="voyage-4", input_type="document").embeddings ``` -The embeddings allow you to do semantic search / retrieval in the vector space. Given an example query, +The embeddings allow you to do semantic search / retrieval in the vector space. Consider the following example query: ```python query = "When is Apple's conference call scheduled?" @@ -231,7 +231,7 @@ The output is the fifth document, which is indeed the most relevant to the query Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET. ``` -If you are looking for a detailed set of recipes on how to do RAG with embeddings, including vector databases, check out the [RAG recipe](https://platform.claude.com/cookbook/third-party-pinecone-rag-using-pinecone). +If you are looking for a detailed set of recipes on how to do RAG with embeddings, including vector databases, see the [RAG recipe](https://platform.claude.com/cookbook/third-party-pinecone-rag-using-pinecone). ## FAQ @@ -272,7 +272,7 @@ If you are looking for a detailed set of recipes on how to do RAG with embedding Voyage AI embeddings are normalized to length 1, which means that: - * Cosine similarity is equivalent to dot-product similarity, while the latter can be computed more quickly. + * Cosine similarity is equivalent to dot-product similarity, although the latter can be computed more quickly. * Cosine similarity and Euclidean distance result in identical rankings. diff --git a/content/en/build-with-claude/extended-thinking.md b/content/en/build-with-claude/extended-thinking.md index abce6359d6..27ce71f4fc 100644 --- a/content/en/build-with-claude/extended-thinking.md +++ b/content/en/build-with-claude/extended-thinking.md @@ -24,7 +24,7 @@ To learn how thinking itself works, including thinking blocks and the response s ## Supported models -Extended thinking availability per model, including the models where extended thinking is the only mode, is listed in the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#supported-models). +Extended thinking availability for each model, including the models where extended thinking is the only mode, is listed in the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#supported-models). ## How to use extended thinking @@ -131,9 +131,8 @@ Here is an example of using extended thinking in the Messages API: Thinking = new ThinkingConfigEnabled(budgetTokens: 10000), Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Are there an infinite number of prime numbers such that n mod 4 == 3?", }, ], @@ -265,23 +264,23 @@ Here is an example of using extended thinking in the Messages API: To turn on manual extended thinking, add a `thinking` object with `type` set to `enabled` and a `budget_tokens` value. -The `budget_tokens` parameter sets a target for how many tokens Claude can use for its internal reasoning process. Larger budgets can improve response quality by enabling more thorough analysis for complex problems. +The `budget_tokens` parameter sets a target for how many tokens Claude can use for its internal reasoning process. Larger budgets can improve response quality by allowing more thorough analysis for complex problems. ## Budget rules and tuning `budget_tokens` must satisfy these constraints: * **Minimum of 1,024 tokens.** The API rejects smaller values. -* **Less than `max_tokens`.** Thinking tokens count toward the `max_tokens` limit for the turn, so the budget must leave room for the final response. The one exception is [interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#interleaved-thinking), where `budget_tokens` can exceed `max_tokens` because the budget spans all thinking blocks within one assistant turn. +* **Less than `max_tokens`.** Thinking tokens count toward the `max_tokens` limit for the turn, so the budget must leave room for the final response. The one exception is [interleaved thinking in manual mode](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#interleaved-thinking), where `budget_tokens` can exceed `max_tokens` because the budget spans all thinking blocks within one assistant turn. * **No cache pre-warming.** Because `budget_tokens` must be less than `max_tokens`, extended thinking cannot be combined with `max_tokens: 0` ([cache pre-warming](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pre-warming-the-cache)). -The budget is a target rather than a strict cap. Actual token usage varies with the task, and Claude may stop reasoning well before the budget is exhausted; `max_tokens` remains the hard ceiling on total output. +The budget is a target rather than a strict cap. Actual token usage varies with the task, and Claude might stop reasoning well before the budget is exhausted; `max_tokens` remains the hard ceiling on total output. -On Claude Opus 4.5, the only extended-thinking-only model that supports [effort](https://platform.claude.com/docs/en/build-with-claude/effort), effort shapes the overall response while `budget_tokens` sets thinking depth; set both. +On Claude Opus 4.5, the only extended-thinking-only model that supports [effort](https://platform.claude.com/docs/en/build-with-claude/effort), effort shapes the overall response whereas `budget_tokens` sets thinking depth; set both. To tune the budget: -* Match the starting point to the task. For simple tasks, start near the 1,024-token minimum and increase incrementally to find the optimal range for your use case. For complex tasks, start with a larger budget of 16,000 tokens or more and adjust to your latency and quality needs. Higher budgets enable more comprehensive reasoning, with diminishing returns that depend on the task, and at the cost of increased latency. For critical tasks, test different settings to find the right balance. +* Match the starting point to the task. For simple tasks, start near the 1,024-token minimum and increase incrementally to find the optimal range for your use case. For complex tasks, start with a larger budget of 16,000 tokens or more and adjust to your latency and quality needs. Higher budgets allow more comprehensive reasoning, with diminishing returns that depend on the task, and at the cost of increased latency. For critical tasks, test different settings to find the right balance. * For thinking budgets above 32k, use [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) to avoid networking issues. Pushing the model to think beyond 32k tokens produces long-running requests that can hit system timeouts and open-connection limits. To track what a budget actually costs you, monitor the `usage.output_tokens_details.thinking_tokens` field in the response, which reports how many of the billed output tokens were internal reasoning. When streaming, this breakdown appears only on the final `message_delta` event. @@ -314,7 +313,7 @@ Partner-operated platforms ([Amazon Bedrock](https://platform.claude.com/docs/en The general turn-structure rules, including the single-turn tool-use loop, mid-turn conflict handling, and toggling thinking between turns, are on [Thinking with tool use](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-with-tool-use). -Manual mode adds one requirement: the final assistant turn of a thinking-enabled request must begin with a thinking block ([adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) drops that requirement). Changing the thinking configuration between turns also invalidates prompt caching; see the following section. +Manual mode adds one requirement: the final assistant turn of a thinking-enabled request must start with a thinking block ([adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) drops that requirement). Changing the thinking configuration between turns also invalidates prompt caching; see the following section. ## Prompt caching in manual mode @@ -386,7 +385,7 @@ becomes: `effort: "high"` is the default on Claude Sonnet 4.6, so omitting it here produces identical behavior; it appears only to show where the depth control lives in adaptive mode. Claude Opus 5.5 and Claude Haiku 5.5 default to `"medium"`, and other models that support effort default to `"high"` (see [Effort levels](https://platform.claude.com/docs/en/build-with-claude/effort#effort-levels)). -Expect a behavioral difference, not just a syntax change. With a fixed budget, Claude thinks on every request. With adaptive thinking, Claude determines whether and how much to think on each request, and at lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) settings it may skip thinking entirely on easy inputs. You can also remove the `interleaved-thinking-2025-05-14` beta header after migrating: adaptive thinking interleaves automatically, and the Claude API ignores the header on these models. Thinking block preservation changes too: Claude Opus 4.5 and models numbered 4.6 and higher keep prior turns' thinking blocks in context and bill them as input, where Claude Sonnet 4.5 (deprecated), Claude Haiku 4.5, and earlier models stripped them; see [thinking block preservation by model](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model). +Expect a behavioral difference, not just a syntax change. With a fixed budget, Claude thinks on every request. With adaptive thinking, Claude determines whether and how much to think on each request, and at lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) settings it might skip thinking entirely on easy inputs. You can also remove the `interleaved-thinking-2025-05-14` beta header after migrating: adaptive thinking interleaves automatically, and the Claude API ignores the header on these models. Thinking block preservation changes too: Claude Opus 4.5 and models numbered 4.6 and higher keep prior turns' thinking blocks in context and bill them as input, where Claude Sonnet 4.5 (deprecated), Claude Haiku 4.5, and earlier models strip them; see [thinking block preservation by model](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model). Switching modes is a thinking-configuration change, so the first request after the switch invalidates cache breakpoints, as described in [Prompt caching in manual mode](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#extended-thinking-with-prompt-caching). diff --git a/content/en/build-with-claude/fallback-credit.md b/content/en/build-with-claude/fallback-credit.md index c851d3952b..9fce7e5fff 100644 --- a/content/en/build-with-claude/fallback-credit.md +++ b/content/en/build-with-claude/fallback-credit.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/build-with-claude/fallback-credit description: Avoid paying the prompt-cache cost twice when you retry a refused request on another model. --- -Prompt caches are per-model. When a model declines a request and you retry on another model, the conversation prefix already cached for the first model must be written into the new model's cache from scratch. Cache writes cost more than cache reads. Fallback credit removes that extra cost. The refusal carries a credit token, you echo the token on the retry, and the retry is billed as though the conversation had been on the new model all along. +Prompt caches are per-model. When a model declines a request and you retry on another model, the conversation prefix already cached for the first model must be written into the new model's cache in full. Cache writes cost more than cache reads. Fallback credit removes that extra cost. The refusal carries a credit token, you echo the token on the retry, and the retry is billed as though the conversation had been on the new model from the start. You need this page only when you build the retry yourself: over raw HTTP or with custom retry logic. [Server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback) and the [SDK middleware](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#client-side-fallback) apply fallback credit automatically. If you use either, skip this page. @@ -20,8 +20,8 @@ You need this page only when you build the retry yourself: over raw HTTP or with On a refusal, `stop_details` includes two fields: - * **`fallback_credit_token`:** an opaque string that represents the credit. - * **`fallback_has_prefill_claim`:** a Boolean that tells you which retry body shape to use. + * **`fallback_credit_token`:** an opaque string that represents the credit + * **`fallback_has_prefill_claim`:** a Boolean that tells you which retry body shape to use Both are `null` when no credit is available for the refusal. @@ -37,14 +37,14 @@ You need this page only when you build the retry yourself: over raw HTTP or with The `fallback_has_prefill_claim` field tells you whether the retry can continue the refused model's partial output instead of starting over: -| `fallback_has_prefill_claim` | Retry body | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `true` | The refused request body, unchanged, plus one appended assistant message whose `content` echoes the refused response's `content`. The retry model continues the response from where the refused model stopped, and completed server tool calls are not re-executed. | -| `false` | The refused request body, unchanged. | +| `fallback_has_prefill_claim` | Retry body | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `true` | The refused request body, unchanged, plus one appended assistant message whose `content` echoes the refused response's `content`. The retry model continues the response from where the refused model stopped, and completed server tool calls are not run again. | +| `false` | The refused request body, unchanged. | ## Example -The following example makes a request that may be refused and redeems the credit token on a retry against Claude Opus 4.8. When a retry attempt is rejected, the example degrades through the rejection ladder: the sequence of progressively simpler retry shapes covered in [When a retry is rejected](https://platform.claude.com/docs/en/build-with-claude/fallback-credit#when-a-retry-is-rejected). +The following example makes a request that might be refused and redeems the credit token on a retry against Claude Opus 4.8. When a retry attempt is rejected, the example degrades through the rejection ladder: the sequence of progressively simpler retry shapes covered in [When a retry is rejected](https://platform.claude.com/docs/en/build-with-claude/fallback-credit#when-a-retry-is-rejected). @@ -189,10 +189,7 @@ The following example makes a request that may be refused and redeems the credit var client = new AnthropicClient(); const string beta = "fallback-credit-2026-07-01"; - List requestMessages = - [ - new() { Role = Role.User, Content = "Hello, Claude" }, - ]; + List requestMessages = [new BetaUserMessageParam { Content = "Hello, Claude" }]; MessageCreateParams Request(Model model) => new() { Model = model, @@ -226,10 +223,9 @@ The following example makes a request that may be refused and redeems the credit Messages = [ .. requestMessages, - new() + new BetaAssistantMessageParam { - Role = Role.Assistant, - Content = new BetaMessageParamContent( + Content = new BetaMessageContentParam( JsonSerializer.SerializeToElement(echoed) ), }, @@ -370,7 +366,7 @@ The following example makes a request that may be refused and redeems the credit echoed.addLast(BetaContentBlockParam.ofText( lastText.toBuilder().text(lastText.text().stripTrailing()).build())); } - attempt.addAssistantMessageOfBetaContentBlockParams(echoed); + attempt.addAssistantMessageOfContentBlockParams(echoed); } try { response = send(Model.CLAUDE_OPUS_4_8, attempt); @@ -466,7 +462,7 @@ The following example makes a request that may be refused and redeems the credit client.beta.messages.create(model:, betas: ["fallback-credit-2026-07-01"], **body) end - response = send_message.call("claude-fable-5", request) + response = send_message.call(Anthropic::Model::CLAUDE_FABLE_5, request) if response in {stop_reason: :refusal, stop_details: {fallback_credit_token: String => credit_token} => details} @@ -486,18 +482,18 @@ The following example makes a request that may be refused and redeems the credit end begin - response = send_message.call("claude-opus-4-8", attempt) + response = send_message.call(Anthropic::Model::CLAUDE_OPUS_4_8, attempt) rescue Anthropic::Errors::BadRequestError => error # Transient: retry with the token within its five-minute window raise if error.message.include?("redemption temporarily unavailable") begin # Fall back to the unchanged body, still with the token - response = send_message.call("claude-opus-4-8", exact_body) + response = send_message.call(Anthropic::Model::CLAUDE_OPUS_4_8, exact_body) rescue Anthropic::Errors::BadRequestError => error # Transient: retry with the token within its five-minute window raise if error.message.include?("redemption temporarily unavailable") # The token itself was rejected: forfeit it and retry without. - response = send_message.call("claude-opus-4-8", request) + response = send_message.call(Anthropic::Model::CLAUDE_OPUS_4_8, request) end end end @@ -535,11 +531,11 @@ Most retries redeem on the first attempt. When one does not, the API returns a 4 - If the refused request executed server tools, a tokenless retry re-runs and re-bills those tools. In that case, surface the 400 error to your caller instead of falling through to a tokenless retry. + If the refused request ran server tools, a tokenless retry re-runs and re-bills those tools. In that case, surface the 400 error to your caller instead of falling through to a tokenless retry. - This rejection is transient, not a verdict on your retry shape. Retry the same request, with the same token, within the token's five-minute window. Do not move to the next step of the ladder. + This rejection is transient, not a verdict on your retry shape. Retry the same request, with the same token, within the token's 5-minute window. Do not move to the next step of the ladder. ## Reference @@ -552,7 +548,7 @@ The following sections cover edge cases and the complete redemption rules. Most | Rule | Fields | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Must match exactly | `system`, `messages`, `tools`, `tool_choice`, `thinking`, and `cache_control`, plus `output_config`, `mcp_servers`, `context_management`, and `container` when you use them | - | May change on the retry | `model`, `max_tokens`, `stop_sequences`, `temperature`, `top_p`, `top_k`, `stream`, `metadata`, and `service_tier` | + | May change on the retry | `model`, `max_tokens`, `stop_sequences`, `stream`, `metadata`, and `service_tier` | The continuation shape (`fallback_has_prefill_claim: true`) is the one exception to the `messages` match: it adds exactly one assistant message at the end of `messages`. @@ -579,7 +575,7 @@ The following sections cover edge cases and the complete redemption rules. Most When a refusal's token supports the continuation shape, the response `content` carries only the model's own output, and the refusal explanation is delivered in `stop_details.explanation`. You can therefore echo `content` into the appended assistant message as-is. - Two adjustments may still be needed before sending: + Two adjustments might still be needed before sending: * If the final block you send is a `text` block, strip its trailing whitespace. * Omit any client-side `tool_use` block that has no matching `tool_result`. @@ -590,16 +586,16 @@ The following sections cover edge cases and the complete redemption rules. Most The token redeems only from the organization and workspace that received the refusal, including on Microsoft Foundry. On Amazon Bedrock and Google Cloud, which do not have workspaces, the token is bound to the platform's caller identity instead. - The token expires five minutes after the refusal. After that, send the retry without it. The token is also stateless: the server stores nothing about it, and there is no endpoint to inspect or revoke it. + The token expires 5 minutes after the refusal. After that, send the retry without it. The token is also stateless: the server stores nothing about it, and there is no endpoint to inspect or revoke it. - When the refusal arrived after server tools had already executed within the request, the token redeems only by continuing the partial response. That restriction is what prevents the completed tool calls from running, and billing, again. + When the refusal arrived after server tools had already run within the request, the token redeems only by continuing the partial response. That restriction is what prevents the completed tool calls from running, and billing, again. One combination can therefore leave the token unredeemable by either shape, when both of the following are true: * The request used `output_config.format` or a `tool_choice` that forces tool use. Either one rules out the appended-assistant-message shape. - * The refusal arrived after server tools had executed. That rules out the unchanged body. + * The refusal arrived after server tools had run. That rules out the unchanged body. If the unchanged-body retry is rejected with a 400 error saying the token must be redeemed by continuing the partial response, discard the token. A retry without it goes through, but it re-runs and re-bills the completed server tools. Surface the cost or the error to your caller rather than retrying silently. diff --git a/content/en/build-with-claude/fast-mode.md b/content/en/build-with-claude/fast-mode.md index fe859439ee..568b47e3e0 100644 --- a/content/en/build-with-claude/fast-mode.md +++ b/content/en/build-with-claude/fast-mode.md @@ -108,7 +108,7 @@ Fast mode works only on supported models. See [Model availability](https://platf MaxTokens = 4096, Speed = Speed.Fast, Messages = [ - new() { Role = Role.User, Content = "Refactor this module to use dependency injection" } + new UserMessageParam { Content = "Refactor this module to use dependency injection" } ], }); @@ -181,7 +181,7 @@ Fast mode works only on supported models. See [Model availability](https://platf client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, speed: "fast", messages: [{role: "user", content: "Refactor this module to use dependency injection"}] @@ -309,7 +309,7 @@ The response `usage` object includes a `speed` field that indicates which speed Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Speed = Speed.Fast, - Messages = [new() { Role = Role.User, Content = "Hello" }], + Messages = [new UserMessageParam { Content = "Hello" }], }); Console.WriteLine(response.Usage.Speed); // "fast" or "standard" @@ -363,7 +363,7 @@ The response `usage` object includes a `speed` field that indicates which speed client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, speed: "fast", messages: [{ role: "user", content: "Hello" }] @@ -400,7 +400,7 @@ The SDK automatically retries fast mode `429` errors up to 2 times by default (c If you'd prefer to fall back to standard speed rather than wait for fast mode capacity, catch the rate limit error and retry without `speed: "fast"`. Set `max_retries` (typescript, java, php: `maxRetries`; csharp: `MaxRetries`; go: `option.WithMaxRetries`) to `0` on the initial fast request to skip automatic retries and fail immediately on rate limit errors. - Falling back from fast to standard speed will result in a [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) miss. Requests at different speeds do not share cached prefixes. + Falling back from fast to standard speed results in a [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) miss. Requests at different speeds do not share cached prefixes. Because setting `max_retries` (typescript, java, php: `maxRetries`; csharp: `MaxRetries`; go: `option.WithMaxRetries`) to `0` also disables retries for other transient errors (overloaded, internal server errors), the following examples reissue the original request with default retries for those cases. @@ -518,7 +518,7 @@ Because setting `max_retries` (typescript, java, php: `maxRetries`; csharp: `Max { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello" }], + Messages = [new UserMessageParam { Content = "Hello" }], Speed = Speed.Fast, }, maxRetries: 0); diff --git a/content/en/build-with-claude/files.md b/content/en/build-with-claude/files.md index f01afde4a3..644b459dc9 100644 --- a/content/en/build-with-claude/files.md +++ b/content/en/build-with-claude/files.md @@ -29,16 +29,16 @@ The Files API provides a create-once, use-many-times approach for working with f * **Manage your files** with list, retrieve, and delete operations - **Uploaded files are accessible to your entire workspace, not scoped to an end user, conversation, or session.** Any API key with access to a workspace can access any files uploaded to that workspace. Every service account, and every user whose organization role allows API access, can use the Default Workspace in addition to any workspace you add them to, so keep files that must stay separate in their own [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#api-keys-and-resource-scoping) and access them only with keys scoped to that workspace. Never accept `file_id` values from end users or other untrusted sources: a user-supplied file ID would let one user of your application read content that another user uploaded. Treat file IDs as server-side references, and keep the mapping between your users and their files in your application. + **Uploaded files are accessible to your entire workspace, not scoped to an end user, conversation, or session.** Any API key with access to a workspace can access any files uploaded to that workspace. Every service account, and every user whose organization role allows API access, can use the Default Workspace in addition to any workspace you add them to, so keep files that must stay separate in their own workspace and access them only with [keys scoped to that workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#api-keys-and-resource-scoping). Never accept `file_id` values from end users or other untrusted sources: a user-supplied file ID would let one user of your application read content that another user uploaded. Treat file IDs as server-side references, and keep the mapping between your users and their files in your application. - If you are building a multi-tenant application on the Files API, create a separate [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) for each tenant. The workspace is the isolation boundary for files, so a workspace per tenant gives each tenant's data hard isolation from every other tenant. Each organization can have up to 100 workspaces; contact your account team if you need more. + If you are building a multitenant application on the Files API, create a separate [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) for each tenant. The workspace is the isolation boundary for files, so a workspace for each tenant gives that tenant's data hard isolation from every other tenant. Each organization can have up to 100 workspaces; contact your account team if you need more. ## How to use the Files API ### Uploading a file -Upload a file to be referenced in future API calls: +Upload a file to reference in future API calls: ```bash cURL @@ -266,9 +266,8 @@ Once uploaded, reference the file by passing the `id` from the upload response a MaxTokens = 1024, Messages = [ - new MessageParam + new UserMessageParam { - Role = Role.User, Content = new List { new TextBlockParam { Text = "Please summarize this document for me." }, @@ -309,7 +308,7 @@ Once uploaded, reference the file by passing the `id` from the upload response a MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text("Please summarize this document for me.") .build()), @@ -376,12 +375,12 @@ Once uploaded, reference the file by passing the `id` from the upload response a The Files API supports different file types that correspond to different content block types: -| File type | MIME type | Content block type | Use case | -| --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------ | ----------------------------------- | -| PDF | `application/pdf` | `document` | Text analysis, document processing | -| Plain text | `text/plain` | `document` | Text analysis, processing | -| Images | `image/jpeg`, `image/png`, `image/gif`, `image/webp` | `image` | Image analysis, visual tasks | -| [Datasets, others](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#upload-and-analyze-your-own-files) | Varies | `container_upload` | Analyze data, create visualizations | +| File type | MIME type | Content block type | Use case | +| --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------ | ---------------------------------- | +| PDF | `application/pdf` | `document` | Text analysis, document processing | +| Plain text | `text/plain` | `document` | Text analysis, processing | +| Images | `image/jpeg`, `image/png`, `image/gif`, `image/webp` | `image` | Image analysis, visual tasks | +| [Datasets, others](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#upload-and-analyze-your-own-files) | Varies | `container_upload` | Data analysis, visualization | #### Document blocks @@ -543,9 +542,8 @@ The following examples read a text file and send its contents as plain text: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() + Messages = [new UserMessageParam { - Role = Role.User, Content = $"Here's the document content:\n\n{textContent}\n\nPlease summarize this document." }] }; @@ -754,8 +752,7 @@ Retrieve information about a specific file: ``` ```bash CLI - ant files retrieve-metadata \ - --file-id "$FILE_ID" + ant files retrieve-metadata --file-id "$FILE_ID" ``` ```python Python @@ -801,7 +798,7 @@ Retrieve information about a specific file: #### Delete a file -Remove a file from your workspace: +Delete a file from your workspace: ```bash cURL @@ -811,8 +808,7 @@ Remove a file from your workspace: ``` ```bash CLI - ant files delete \ - --file-id "$FILE_ID" + ant files delete --file-id "$FILE_ID" ``` ```python Python @@ -856,13 +852,11 @@ Download files that were created by [skills](https://platform.claude.com/docs/en curl -X GET "https://api.anthropic.com/v1/files/$FILE_ID/content" \ -H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ - --output downloaded_file.txt + -o downloaded_file.txt ``` ```bash CLI - ant files download \ - --file-id "$FILE_ID" \ - --output downloaded_file.txt + ant files download --file-id "$FILE_ID" --output downloaded_file.txt ``` ```python Python @@ -936,17 +930,17 @@ On the Claude API, supported image, video, and audio files that Claude produces ### Storage limits -* **Maximum file size:** 500 MB per file -* **Total storage:** 1 TB per organization +* **Maximum file size:** 500 MB for each file +* **Total storage:** 1 TB for each organization ### File lifecycle -* Files are scoped to the workspace they were uploaded in. Any request in the same workspace can reference them; never accept file IDs from untrusted sources (see the [workspace access warning](https://platform.claude.com/docs/en/build-with-claude/files#workspace-scoped-access)) -* Files cannot be modified or renamed after upload. To change a file's content, upload a new file and delete the old one -* Files persist until you delete them with the `DELETE /v1/files/{file_id}` endpoint or they reach their `expires_at` -* Deleted files cannot be recovered -* Files are inaccessible through the API shortly after deletion, but they may persist in active Messages API calls and associated tool uses -* Files that users delete will be deleted in accordance with Anthropic's [data retention policy](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data). For ZDR eligibility across all features, see [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention) +* Files are scoped to the workspace they were uploaded in. Any request in the same workspace can reference them; never accept file IDs from untrusted sources (see the [workspace access warning](https://platform.claude.com/docs/en/build-with-claude/files#workspace-scoped-access)). +* Files cannot be modified or renamed after upload. To change a file's content, upload a new file and delete the old one. +* Files persist until you delete them with the `DELETE /v1/files/{file_id}` endpoint or they reach their `expires_at`. +* Deleted files cannot be recovered. +* Files are inaccessible through the API shortly after deletion, but they may persist in active Messages API calls and associated tool uses. +* Files that users delete will be deleted in accordance with Anthropic's [data retention policy](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data). For ZDR eligibility across all features, see [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention). ### File expiration @@ -954,15 +948,15 @@ To have a file expire automatically, include an `expires_in_seconds` form field When a file reaches its `expires_at`: -* Downloading its content (`GET /v1/files/{file_id}/content`) returns a 404 error -* A Messages request that references the file fails before inference -* Its metadata (`GET /v1/files/{file_id}`) remains readable for up to 30 days, with `expires_at` in the past -* It continues to appear in list responses during that window; compare `expires_at` to the current time to filter expired files +* Downloading its content (`GET /v1/files/{file_id}/content`) returns a 404 error. +* A Messages request that references the file fails before inference. +* Its metadata (`GET /v1/files/{file_id}`) remains readable for up to 30 days, with `expires_at` in the past. +* It continues to appear in list responses during that window; compare `expires_at` to the current time to filter expired files. Deleting an expired file with `DELETE /v1/files/{file_id}` removes its metadata immediately instead of waiting for the 30-day window to elapse. - Expiration is a lifecycle feature, not a guaranteed-deletion control. After `expires_at`, file content is no longer retrievable through the API and is released from your storage quota; the underlying content may be retained for a limited period thereafter for safety review before permanent deletion, and file metadata remains visible for up to 30 days after expiration. To remove a file before its scheduled expiration, use `DELETE /v1/files/{file_id}`. + Expiration is a lifecycle feature, not a guaranteed-deletion control. After `expires_at`, file content is no longer retrievable through the API and is released from your storage quota; the underlying content may be retained for a limited period thereafter for safety review before permanent deletion, and file metadata remains visible for up to 30 days after expiration. To delete a file before its scheduled expiration, use `DELETE /v1/files/{file_id}`. ### Audit logging @@ -982,13 +976,13 @@ The Files API is out of beta and needs no beta header. Migrating off `files-api- To migrate: -1. **Remove the beta header.** Drop `anthropic-beta: files-api-2025-04-14` from your requests. In the SDKs, call `client.files` instead of `client.beta.files`; keeping `client.beta.files` works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/files#sdk-beta-namespace). Earlier releases send it from `client.beta.files` even with no `betas` argument. +1. **Remove the beta header.** Drop `anthropic-beta: files-api-2025-04-14` from your requests. With the SDK, call `client.files` (csharp, go: `client.Files`; java: `client.files()`; php: `$client->files`) instead of `client.beta.files` (csharp, go: `client.Beta.Files`; java: `client.beta().files()`; php: `$client->beta->files`); keeping `client.beta.files` (csharp, go: `client.Beta.Files`; java: `client.beta().files()`; php: `$client->beta->files`) works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/files#sdk-beta-namespace). Earlier releases send it from `client.beta.files` (csharp, go: `client.Beta.Files`; java: `client.beta().files()`; php: `$client->beta->files`) even when you pass no beta names. 2. **Update pagination.** Replace `after_id`/`before_id` loops with the `page`/`next_page` cursor, or use the SDK auto-pagination helpers shown in [Managing files](https://platform.claude.com/docs/en/build-with-claude/files#managing-files). 3. **Read `expires_at`.** The field appears only without the header; `null` means the file has no expiration (see [File expiration](https://platform.claude.com/docs/en/build-with-claude/files#file-expiration)). ### SDK beta namespace -Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.files` no longer sends `files-api-2025-04-14` and returns the same shapes as `client.files`, with `Beta`-prefixed type names. It accepts a `betas` argument for Files features that are still in beta, such as `scope_id` filtering under a [Managed Agents](https://platform.claude.com/docs/en/managed-agents/files) beta header. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. +Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, PHP SDK 0.45.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.files` (csharp, go: `client.Beta.Files`; java: `client.beta().files()`; php: `$client->beta->files`) no longer sends `files-api-2025-04-14` and returns the same shapes as `client.files` (csharp, go: `client.Files`; java: `client.files()`; php: `$client->files`), with `Beta`-prefixed type names (in PHP, classes in the `Anthropic\Beta` namespace). It takes beta names through `betas` (csharp, go: `Betas`; java: `.addBeta()`) for Files features that are in beta, such as `scope_id` filtering under a [Managed Agents](https://platform.claude.com/docs/en/managed-agents/files) beta header. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. Requests that carry `anthropic-beta: managed-agents-2026-04-01` without `files-api-2025-04-14` receive the shapes on this page with one compatibility affordance on `GET /v1/files`: `before_id` and `after_id` are still accepted (not combinable with `page` or `ids[]`), and the list response includes `has_more`, `first_id`, and `last_id` alongside `next_page`. Later Managed Agents beta versions receive the plain shape. @@ -1000,9 +994,9 @@ Common errors when using the Files API include: * **Invalid file type (400):** The file type doesn't match the content block type (for example, using an image file in a document block) * **Not downloadable (400):** Files you upload have `"downloadable": false` and cannot be downloaded. Only files created by skills or the code execution tool can be downloaded * **Exceeds context window size (400):** The file is larger than the context window size (for example, using a 500 MB plain text file in a `/v1/messages` request) -* **Invalid filename (400):** The file name doesn't meet the length requirements (1-255 characters) or contains forbidden characters (`<`, `>`, `:`, `"`, `|`, `?`, `*`, `\`, `/`, or Unicode characters 0-31) +* **Invalid file name (400):** The file name doesn't meet the length requirements (1–255 characters) or contains forbidden characters (`<`, `>`, `:`, `"`, `|`, `?`, `*`, `\`, `/`, or Unicode characters 0–31) * **File too large (413):** File exceeds the 500 MB limit -* **Storage limit exceeded (400):** Your organization has reached the 1 TB storage limit +* **Storage limit exceeded (400):** Your organization has reached the 1 TB storage limit ```json Output { @@ -1039,7 +1033,7 @@ File-related API calls are limited to approximately 500 requests per minute. To - Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. + Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. diff --git a/content/en/build-with-claude/handling-stop-reasons.md b/content/en/build-with-claude/handling-stop-reasons.md index aef62de2ee..f415b0dab6 100644 --- a/content/en/build-with-claude/handling-stop-reasons.md +++ b/content/en/build-with-claude/handling-stop-reasons.md @@ -12,7 +12,7 @@ For the full response schema, see the [Messages API reference](https://platform. | Value | When it occurs | What to do | | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [`end_turn`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#end-turn) | Claude finished its response naturally. | Use the response. | +| [`end_turn`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#end-turn) | Claude completed its response naturally. | Use the response. | | [`max_tokens`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#max-tokens) | The response reached your `max_tokens` limit. | Raise `max_tokens` or [continue the response](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#ensuring-complete-responses). | | [`stop_sequence`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#stop-sequence) | Claude emitted one of your `stop_sequences`. | Read `stop_sequence` to see which one fired. | | [`tool_use`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use) | Claude is calling a tool. | Run the tool and return the result. A server tool call still missing its result block completes in a later response. | @@ -49,7 +49,7 @@ The `stop_reason` field is part of every successful Messages API response. Unlik ### end\_turn -The most common stop reason. Indicates Claude finished its response naturally. +The most common stop reason. Indicates Claude completed its response naturally. ```bash cURL @@ -109,7 +109,7 @@ The most common stop reason. Indicates Claude finished its response naturally. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }); if (response.StopReason == "end_turn") @@ -206,11 +206,11 @@ The most common stop reason. Indicates Claude finished its response naturally. - Sometimes Claude returns an empty response (exactly 2–3 tokens with no content) with `stop_reason: "end_turn"`. This typically occurs when Claude interprets that the assistant turn is complete, particularly after tool results. + Sometimes Claude returns an empty response (exactly 2–3 tokens with no content) with `stop_reason: "end_turn"`. This typically occurs when Claude determines that the assistant turn is complete, particularly after tool results. **Common causes:** - * Adding text blocks immediately after tool results (Claude learns to expect the user to always insert text after tool results, so it ends its turn to follow the pattern) + * Adding text blocks immediately after tool results (the history then shows user text after every tool result, so Claude ends its turn to follow that pattern) * Sending Claude's completed response back without adding anything (Claude already determined it's done, so it will remain done) **How to prevent empty responses:** @@ -323,18 +323,16 @@ The most common stop reason. Indicates Claude finished its response naturally. // INCORRECT: Adding text immediately after tool_result List messages = [ - new() { Role = Role.User, Content = "Calculate the sum of 1234 and 5678" }, - new() + new UserMessageParam { Content = "Calculate the sum of 1234 and 5678" }, + new AssistantMessageParam { - Role = Role.Assistant, Content = new List { new ToolUseBlockParam { ID = "toolu_123", Name = "calculator", Input = input } } }, - new() + new UserMessageParam { - Role = Role.User, Content = new List { new ToolResultBlockParam { ToolUseID = "toolu_123", Content = "6912" }, @@ -346,18 +344,16 @@ The most common stop reason. Indicates Claude finished its response naturally. // CORRECT: Send tool results directly without additional text messages = [ - new() { Role = Role.User, Content = "Calculate the sum of 1234 and 5678" }, - new() + new UserMessageParam { Content = "Calculate the sum of 1234 and 5678" }, + new AssistantMessageParam { - Role = Role.Assistant, Content = new List { new ToolUseBlockParam { ID = "toolu_123", Name = "calculator", Input = input } } }, - new() + new UserMessageParam { - Role = Role.User, // Just the tool_result, no additional text Content = new List { @@ -408,31 +404,25 @@ The most common stop reason. Indicates Claude finished its response naturally. // INCORRECT: Adding text immediately after tool_result List messages = List.of( - MessageParam.builder().role(MessageParam.Role.USER) - .content("Calculate the sum of 1234 and 5678").build(), - MessageParam.builder().role(MessageParam.Role.ASSISTANT) - .contentOfBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))).build(), - MessageParam.builder().role(MessageParam.Role.USER) - .contentOfBlockParams(List.of( - ContentBlockParam.ofToolResult( - ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()), - // Don't add text after tool_result - ContentBlockParam.ofText(TextBlockParam.builder().text("Here's the result").build()) - )).build() + MessageParam.ofUser("Calculate the sum of 1234 and 5678"), + MessageParam.ofAssistantOfContentBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))), + MessageParam.ofUserOfContentBlockParams(List.of( + ContentBlockParam.ofToolResult( + ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()), + // Don't add text after tool_result + ContentBlockParam.ofText(TextBlockParam.builder().text("Here's the result").build()) + )) ); // CORRECT: Send tool results directly without additional text messages = List.of( - MessageParam.builder().role(MessageParam.Role.USER) - .content("Calculate the sum of 1234 and 5678").build(), - MessageParam.builder().role(MessageParam.Role.ASSISTANT) - .contentOfBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))).build(), + MessageParam.ofUser("Calculate the sum of 1234 and 5678"), + MessageParam.ofAssistantOfContentBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))), // Just the tool_result, no additional text - MessageParam.builder().role(MessageParam.Role.USER) - .contentOfBlockParams(List.of( - ContentBlockParam.ofToolResult( - ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()) - )).build() + MessageParam.ofUserOfContentBlockParams(List.of( + ContentBlockParam.ofToolResult( + ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()) + )) ); ``` @@ -547,7 +537,7 @@ The most common stop reason. Indicates Claude finished its response naturally. # Check if response is empty if response.stop_reason == "end_turn" and not response.content: # INCORRECT: Don't just retry with the empty response - # This won't work because Claude already decided it's done + # This won't work because Claude already determined it's done # CORRECT: Add a continuation prompt in a NEW user message messages.append({"role": "user", "content": "Please continue"}) @@ -573,7 +563,7 @@ The most common stop reason. Indicates Claude finished its response naturally. // Check if response is empty if (response.stop_reason === "end_turn" && response.content.length === 0) { // INCORRECT: Don't just retry with the empty response - // This won't work because Claude already decided it's done + // This won't work because Claude already determined it's done // CORRECT: Add a continuation prompt in a NEW user message messages.push({ role: "user", content: "Please continue" }); @@ -603,7 +593,7 @@ The most common stop reason. Indicates Claude finished its response naturally. if (response.StopReason == "end_turn" && response.Content.Count == 0) { // CORRECT: Add a continuation prompt in a NEW user message - messages.Add(new() { Role = Role.User, Content = "Please continue" }); + messages.Add(new UserMessageParam { Content = "Please continue" }); response = await client.Messages.Create(new MessageCreateParams { @@ -662,10 +652,7 @@ The most common stop reason. Indicates Claude finished its response naturally. if (isEndTurn && response.content().isEmpty()) { // CORRECT: Add a continuation prompt in a NEW user message List extended = new ArrayList<>(messages); - extended.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content("Please continue") - .build()); + extended.add(MessageParam.ofUser("Please continue")); response = client.messages().create( MessageCreateParams.builder() @@ -732,7 +719,7 @@ The most common stop reason. Indicates Claude finished its response naturally. **Best practices:** - 1. **Never add text blocks immediately after tool results:** This teaches Claude to expect user input after every tool use. + 1. **Never add text blocks immediately after tool results:** This sets a pattern of user input after every tool use, and Claude follows that pattern by ending its turn. 2. **Don't retry empty responses without modification:** Sending the empty response back won't help. 3. **Use continuation prompts as a last resort:** Only if these fixes don't resolve the issue. @@ -801,7 +788,7 @@ Claude stopped because it reached the `max_tokens` limit specified in your reque { Model = Model.ClaudeOpus5_5, MaxTokens = 10, - Messages = [new() { Role = Role.User, Content = "Explain quantum physics" }] + Messages = [new UserMessageParam { Content = "Explain quantum physics" }] }); if (response.StopReason == "max_tokens") @@ -1111,7 +1098,7 @@ Claude encountered one of your custom stop sequences. Model = Model.ClaudeOpus5_5, MaxTokens = 1024, StopSequences = ["END", "STOP"], - Messages = [new() { Role = Role.User, Content = "Generate text until you say END" }] + Messages = [new UserMessageParam { Content = "Generate text until you say END" }] }); if (response.StopReason == "stop_sequence") @@ -1191,7 +1178,7 @@ Claude encountered one of your custom stop sequences. ### tool\_use -Claude is calling a tool and expects you to run it. +Claude is calling a tool that you need to run. For most tool use implementations, use the [tool runner](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner), which automatically handles tool execution, result formatting, and conversation management. @@ -1332,7 +1319,7 @@ Claude is calling a tool and expects you to run it. Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Tools = [weatherTool], - Messages = [new() { Role = Role.User, Content = "What is the weather in San Francisco?" }] + Messages = [new UserMessageParam { Content = "What is the weather in San Francisco?" }] }); if (response.StopReason == "tool_use") @@ -1483,10 +1470,10 @@ Claude is calling a tool and expects you to run it. ``` -A `tool_use` response can also contain a `server_tool_use` block whose `id` has no matching result block. That server tool call is not finished, and this response does not carry its result. In the common case, Claude calls a [server tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) and one of your client tools in the same group of parallel tool calls: the API returns without running the server tool so that you can run the client tools first. There is no other marker for the state; detect it by checking each `server_tool_use` or `mcp_tool_use` block's `id` for a matching result block. +A `tool_use` response can also contain a `server_tool_use` block whose `id` has no matching result block. That server tool call is not complete, and this response does not carry its result. In the common case, Claude calls a [server tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) and one of your client tools in the same group of parallel tool calls: the API returns without running the server tool so that you can run the client tools first. There is no other marker for the state; detect it by checking each `server_tool_use` or `mcp_tool_use` block's `id` for a matching result block. - With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), the same response shape means something different. The client `tool_use` block comes from code that is running in the `code_execution` tool rather than from Claude directly, and its `caller` field names the `code_execution` block that called it. That code has already started: it is paused waiting for your `tool_result` blocks, and sending them resumes the execution instead of starting a deferred tool. The `code_execution` block's own result block arrives once the code finishes, which can take more than one round of tool results. The follow-up user message itself is the same in both cases; with programmatic tool calling, also pass back the `id` from the response's `container` field, as that page shows. + With [programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling), the same response shape means something different. The client `tool_use` block comes from code that is running in the `code_execution` tool rather than from Claude directly, and its `caller` field names the `code_execution` block that called it. That code has already started: it is paused waiting for your `tool_result` blocks, and sending them resumes the execution instead of starting a deferred tool. The `code_execution` block's own result block arrives once the code completes, which can take more than one round of tool results. The follow-up user message itself is the same in both cases; with programmatic tool calling, also pass back the `id` from the response's `container` field, as that page shows. ```json A mixed tool_use response @@ -1534,9 +1521,9 @@ Leaving out a `tool_result`, or putting one after other content, fails earlier w ### pause\_turn -Returned when the server-side sampling loop reaches its iteration limit while executing [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) such as web search. The default limit is 10 iterations per request. +Returned when the server-side sampling loop reaches its iteration limit while running [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) such as web search. The default limit is 10 iterations for each request. -When this happens, the response may contain a `server_tool_use` block without a corresponding result block. To let Claude finish processing, continue the conversation by sending the response back as-is. A response that leaves a client `tool_use` block waiting on you never has a `stop_reason` of `pause_turn`: when Claude stops to call your tools, `stop_reason` is [`tool_use`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use), and you continue it by sending the client `tool_result` blocks instead of the response itself. +When this occurs, the response might contain a `server_tool_use` block without a corresponding result block. To let Claude finish processing, continue the conversation by sending the response back as-is. A response that leaves a client `tool_use` block waiting on you never has a `stop_reason` of `pause_turn`: when Claude stops to call your tools, `stop_reason` is [`tool_use`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#tool-use), and you continue it by sending the client `tool_result` blocks instead of the response itself. ```bash cURL @@ -1613,7 +1600,7 @@ When this happens, the response may contain a `server_tool_use` block without a ```csharp C# List tools = [new ToolUnion(new WebSearchTool20250305())]; - MessageParam userMessage = new() { Role = Role.User, Content = "Search for latest AI news" }; + MessageParam userMessage = new UserMessageParam { Content = "Search for latest AI news" }; var response = await client.Messages.Create(new MessageCreateParams { @@ -1634,9 +1621,8 @@ When this happens, the response may contain a `server_tool_use` block without a Messages = [ userMessage, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() } ] @@ -1816,7 +1802,7 @@ Claude declined to generate a response. Safety classifiers return this stop reas { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "[Unsafe request]" }] + Messages = [new UserMessageParam { Content = "[Unsafe request]" }] }); if (response.StopReason == "refusal") @@ -1903,7 +1889,7 @@ Claude declined to generate a response. Safety classifiers return this stop reas If you encounter `refusal` stop reasons frequently while using Claude Sonnet 4.5 ([deprecated](https://platform.claude.com/docs/en/about-claude/model-deprecations)) or Claude Opus 4.1 (the latter [retired, except on Bedrock and Google Cloud](https://platform.claude.com/docs/en/about-claude/model-deprecations)), you can try updating your API calls to use Haiku 4.5 (`claude-haiku-4-5-20251001`), which has different usage restrictions. Learn more about [understanding Sonnet 4.5's API safety filters](https://support.claude.com/en/articles/12449294-understanding-sonnet-4-5-s-api-safety-filters). -On a refusal, the `stop_details` object identifies the policy category that triggered it. The categories and the full refusal response shape are covered on [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). `stop_details` is `null` for all stop reasons other than `refusal`. +On a refusal, the `stop_details` object identifies the policy category that triggered it. The categories and the full refusal response shape are covered in [What a refusal looks like](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). `stop_details` is `null` for all stop reasons other than `refusal`. A refused request on Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, or Claude Haiku 5.5 can usually be served by retrying on another Claude model. [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) shows how to set up that retry, server-side or in your client. Claude Haiku 5.5 has no server-side fallback, so set up its retry [in your client](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#client-side-fallback). If you build the retry yourself from Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, or Claude Sonnet 5.5, [fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) covers how to avoid paying the prompt-cache cost twice. @@ -1912,7 +1898,7 @@ A refused request on Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude O Claude stopped because it reached the model's context window limit. This lets you request the maximum possible tokens without knowing the exact input size. - This stop reason is currently typed only in the SDK's `beta` (csharp, go: `Beta`; java: `beta()`) namespace, so the following examples call `client.beta.messages` (csharp, go: `client.Beta.Messages`; java: `client.beta().messages()`; php: `$client->beta->messages`) and use the `Beta`-prefixed types. On Sonnet 4.5 (deprecated) and newer models the API returns this value without a beta header. For earlier models, add the `model-context-window-exceeded-2025-08-26` beta header to enable it. + This stop reason is currently typed only in the SDK's `beta` (csharp, go: `Beta`; java: `beta()`) namespace, so the following examples call `client.beta.messages` (csharp, go: `client.Beta.Messages`; java: `client.beta().messages()`; php: `$client->beta->messages`) and use the `Beta`-prefixed types. On Sonnet 4.5 (deprecated) and newer models, the API returns this value without a beta header. For earlier models, add the `model-context-window-exceeded-2025-08-26` beta header to enable it. @@ -1975,7 +1961,7 @@ Claude stopped because it reached the model's context window limit. This lets yo { Model = Model.ClaudeOpus5_5, MaxTokens = 20000, - Messages = [new() { Role = Role.User, Content = "Large input that uses most of context window..." }] + Messages = [new BetaUserMessageParam { Content = "Large input that uses most of context window..." }] }); if (response.StopReason?.Value() == BetaStopReason.ModelContextWindowExceeded) @@ -2332,7 +2318,7 @@ When a response is truncated because of token limits or the context window, appe ### Implement retry logic for pause\_turn -When using [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), the API may return `pause_turn` if the server-side sampling loop reaches its iteration limit (default 10). Handle this by continuing the conversation: +When using [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), the API might return `pause_turn` if the server-side sampling loop reaches its iteration limit (default 10). Handle this by continuing the conversation: ```python Python @@ -2410,7 +2396,7 @@ When using [server tools](https://platform.claude.com/docs/en/agents-and-tools/t List tools, int maxContinuations = 5) { - List messages = [new() { Role = Role.User, Content = userQuery }]; + List messages = [new UserMessageParam { Content = userQuery }]; Message response = null!; for (var i = 0; i < maxContinuations; i++) @@ -2432,10 +2418,9 @@ When using [server tools](https://platform.claude.com/docs/en/agents-and-tools/t // pause_turn: replace the full message list to maintain alternating roles messages = [ - new() { Role = Role.User, Content = userQuery }, - new() + new UserMessageParam { Content = userQuery }, + new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() } ]; @@ -2587,7 +2572,7 @@ When using [server tools](https://platform.claude.com/docs/en/agents-and-tools/t ``` -## Stop reasons vs. errors +## Stop reasons versus errors It's important to distinguish between `stop_reason` values and actual errors: @@ -2689,7 +2674,7 @@ It's important to distinguish between `stop_reason` values and actual errors: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }); // Handle successful response with stop_reason @@ -2879,7 +2864,7 @@ When using streaming, `stop_reason` is: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello!" }] + Messages = [new UserMessageParam { Content = "Hello!" }] }; await foreach (var streamEvent in client.Messages.CreateStreaming(parameters)) @@ -3040,7 +3025,7 @@ When using streaming, `stop_reason` is: string userQuery, List tools) { - List messages = [new() { Role = Role.User, Content = userQuery }]; + List messages = [new UserMessageParam { Content = userQuery }]; while (true) { @@ -3056,12 +3041,11 @@ When using streaming, `stop_reason` is: { // Execute tools and continue var toolResults = ExecuteTools(response.Content); - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }); - messages.Add(new() { Role = Role.User, Content = toolResults }); + messages.Add(new UserMessageParam { Content = toolResults }); } else { @@ -3115,7 +3099,7 @@ When using streaming, `stop_reason` is: List tools ) { List messages = new ArrayList<>(); - messages.add(MessageParam.builder().role(MessageParam.Role.USER).content(userQuery).build()); + messages.add(MessageParam.ofUser(userQuery)); while (true) { MessageCreateParams.Builder params = MessageCreateParams.builder() @@ -3134,10 +3118,8 @@ When using streaming, `stop_reason` is: // Execute tools and continue List toolResults = executeTools(response.content()); messages.add(response.toParam()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults.stream().map(ContentBlockParam::ofToolResult).toList()) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams( + toolResults.stream().map(ContentBlockParam::ofToolResult).toList())); } } ``` @@ -3260,7 +3242,7 @@ When using streaming, `stop_reason` is: ```csharp C# static async Task GetCompleteResponse(AnthropicClient client, string prompt, int maxAttempts = 3) { - List messages = [new() { Role = Role.User, Content = prompt }]; + List messages = [new UserMessageParam { Content = prompt }]; var fullResponse = ""; for (var i = 0; i < maxAttempts; i++) @@ -3289,9 +3271,9 @@ When using streaming, `stop_reason` is: // Continue from where it left off messages = [ - new() { Role = Role.User, Content = prompt }, - new() { Role = Role.Assistant, Content = fullResponse }, - new() { Role = Role.User, Content = "Please continue from where you left off." } + new UserMessageParam { Content = prompt }, + new AssistantMessageParam { Content = fullResponse }, + new UserMessageParam { Content = "Please continue from where you left off." } ]; } @@ -3339,9 +3321,7 @@ When using streaming, `stop_reason` is: ```java Java static String getCompleteResponse(AnthropicClient client, String prompt, int maxAttempts) { - List messages = List.of( - MessageParam.builder().role(MessageParam.Role.USER).content(prompt).build() - ); + List messages = List.of(MessageParam.ofUser(prompt)); StringBuilder fullResponse = new StringBuilder(); for (int i = 0; i < maxAttempts; i++) { @@ -3364,9 +3344,9 @@ When using streaming, `stop_reason` is: // Continue from where it left off messages = List.of( - MessageParam.builder().role(MessageParam.Role.USER).content(prompt).build(), - MessageParam.builder().role(MessageParam.Role.ASSISTANT).content(fullResponse.toString()).build(), - MessageParam.builder().role(MessageParam.Role.USER).content("Please continue from where you left off.").build() + MessageParam.ofUser(prompt), + MessageParam.ofAssistant(fullResponse.toString()), + MessageParam.ofUser("Please continue from where you left off.") ); } @@ -3509,7 +3489,7 @@ With the `model_context_window_exceeded` stop reason, you can request the maximu { Model = Model.ClaudeOpus5_5, MaxTokens = 20000, - Messages = [new() { Role = Role.User, Content = prompt }] + Messages = [new BetaUserMessageParam { Content = prompt }] }); var tokens = response.Usage.OutputTokens; @@ -3661,7 +3641,7 @@ With the `model_context_window_exceeded` stop reason, you can request the maximu Retry refused requests on a fallback model, server-side or in your client. - + Let the SDK manage the `tool_use` loop, result formatting, and retries for you. diff --git a/content/en/build-with-claude/mid-conversation-effort-example.md b/content/en/build-with-claude/mid-conversation-effort-example.md index d6560156b5..c868ac5334 100644 --- a/content/en/build-with-claude/mid-conversation-effort-example.md +++ b/content/en/build-with-claude/mid-conversation-effort-example.md @@ -18,7 +18,7 @@ The mode is not an API parameter. It is built entirely from documented pieces: ## Set up the loop -The example is a single file. The constants control the effort level, the fan-out shape, and how often the mode refresher is re-sent. `MAX_CONCURRENT` caps how many subagents run at the same time (the PHP port is sequential and ignores it); `MAX_TOTAL_SUBTASKS` caps how many the model may queue in a single Workflow call. Splitting the two lets the model plan a large backlog without launching it all at once. The `DOC_TEST_MODE` check caps the loops to a single turn when that environment variable is set, so the automated docs harness can validate that the file compiles and finishes quickly without running the full orchestration; leave it unset when running the example yourself. +The example is a single file. The constants control the effort level, the fan-out shape, and how often the mode refresher is re-sent. `MAX_CONCURRENT` caps how many subagents run at the same time (the PHP port is sequential and ignores it); `MAX_TOTAL_SUBTASKS` caps how many the model may queue in a single Workflow call. Splitting the two lets the model plan a large backlog without launching it all at once. The `DOC_TEST_MODE` check caps the loops to a single turn when that environment variable is set, so the automated docs harness can validate that the file compiles and completes quickly without running the full orchestration; leave it unset when running the example yourself. ```python Python @@ -1548,7 +1548,7 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni "You are one agent in a larger parallel fan-out, assigned a single subtask. " + "Investigate it directly, using bash to check facts rather than guessing, and finish " + "by calling report_findings exactly once. Return findings, not narration."; - List messages = [new() { Role = Role.User, Content = prompt }]; + List messages = [new UserMessageParam { Content = prompt }]; for (var turn = 0; turn < maxSubagentTurns; turn++) { using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(requestTimeoutSeconds)); @@ -1561,9 +1561,8 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni Tools = [bashTool, reportTool], Messages = messages, }, cancellationToken: deadline.Token).Aggregate(); - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList(), }); if (response.StopReason == StopReason.PauseTurn) @@ -1604,7 +1603,7 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni { return report; } - messages.Add(new() { Role = Role.User, Content = toolResults }); + messages.Add(new UserMessageParam { Content = toolResults }); } return "(subagent hit the turn limit before finishing)"; } @@ -1714,7 +1713,7 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni // Subagents inherit the main loop's effort level. String runSubagent(Model model, String prompt) throws InterruptedException { List messages = new ArrayList<>(); - messages.add(MessageParam.builder().role(MessageParam.Role.USER).content(prompt).build()); + messages.add(MessageParam.ofUser(prompt)); for (int turn = 0; turn < MAX_SUBAGENT_TURNS; turn++) { MessageCreateParams params = MessageCreateParams.builder() .model(model) @@ -1768,10 +1767,7 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni if (report != null) { return report; } - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(toolResults)); } return "(subagent hit the turn limit before finishing)"; } @@ -1952,7 +1948,7 @@ Each workflow subtask becomes its own small agent loop with the bash tool, runni ## Journal results so reruns resume -A fan-out that spawns dozens of subagents is expensive to restart from scratch. A small content-addressed journal makes it idempotent: before dispatching a subagent, look up the SHA-256 of its prompt in a local JSON file, and return the recorded result if one exists. Interrupt the run, rerun it, and only the subtasks that never finished are recomputed. The journal deduplicates across runs, not within a single fan-out wave; delete the journal file to start fresh. +A fan-out that spawns dozens of subagents is expensive to restart from the beginning. A small content-addressed journal makes it idempotent: before dispatching a subagent, look up the SHA-256 of its prompt in a local JSON file, and return the recorded result if one exists. Interrupt the run, rerun it, and only the subtasks that never completed are recomputed. The journal deduplicates across runs, not within a single fan-out wave; delete the journal file to start fresh. ```python Python @@ -2243,7 +2239,7 @@ A fan-out that spawns dozens of subagents is expensive to restart from scratch. ## Fan out, then verify -The fan-out accepts up to `MAX_TOTAL_SUBTASKS` prompts, runs them through the journal with at most `MAX_CONCURRENT` in flight (sequential in the PHP port), and isolates failures so one broken subagent degrades to an error string instead of ending the run. Once the first wave finishes, a second wave reuses the same subagent path to try to refute each result: every verifier re-derives the claims from the source, defaulting to refuted when uncertain. Both the original result and its verdict are returned to the orchestrator so it can weigh them together. +The fan-out accepts up to `MAX_TOTAL_SUBTASKS` prompts, runs them through the journal with at most `MAX_CONCURRENT` in flight (sequential in the PHP port), and isolates failures so one broken subagent degrades to an error string instead of ending the run. Once the first wave completes, a second wave reuses the same subagent path to attempt to refute each result: every verifier re-derives the claims from the source, defaulting to refuted when uncertain. Both the original result and its verdict are returned to the orchestrator so it can weigh them together. ```python Python @@ -3205,7 +3201,7 @@ The agent appends the user's message first, then any system messages that are du modeOn = nextModeOn; } - MessageParam SystemMessage(string content) => new() { Role = Role.System, Content = content }; + MessageParam SystemMessage(string content) => new SystemMessageParam { Content = content }; // System messages owed on this turn: an exit notice, the full mode text on entry, // or a one-line refresher every turnsBetweenRefreshers user turns. @@ -3240,7 +3236,7 @@ The agent appends the user's message first, then any system messages that are du { // Mid-conversation system messages follow the user turn they apply to, which keeps // the cached prefix ahead of them untouched. - messages.Add(new() { Role = Role.User, Content = userInput }); + messages.Add(new UserMessageParam { Content = userInput }); messages.AddRange(DueSystemMessages()); turnsSinceReminder++; @@ -3256,9 +3252,8 @@ The agent appends the user's message first, then any system messages that are du Tools = [workflowTool, bashTool], Messages = messages, }, cancellationToken: deadline.Token).Aggregate(); - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList(), }); @@ -3294,7 +3289,7 @@ The agent appends the user's message first, then any system messages that are du }; toolResults.Add(new ToolResultBlockParam(toolUse.ID) { Content = output, IsError = isError }); } - messages.Add(new() { Role = Role.User, Content = toolResults }); + messages.Add(new UserMessageParam { Content = toolResults }); } return "(hit the main loop turn limit before finishing)"; } @@ -3476,17 +3471,14 @@ The agent appends the user's message first, then any system messages that are du } private MessageParam systemMessage(String content) { - return MessageParam.builder() - .role(MessageParam.Role.SYSTEM) - .content(content) - .build(); + return MessageParam.ofSystem(content); } // Send one user turn through the loop, executing tool calls until the model stops. String turn(String userInput) throws InterruptedException { // Mid-conversation system messages follow the user turn they apply to, which keeps // the cached prefix ahead of them untouched. - messages.add(MessageParam.builder().role(MessageParam.Role.USER).content(userInput).build()); + messages.add(MessageParam.ofUser(userInput)); messages.addAll(dueSystemMessages()); turnsSinceReminder++; @@ -3541,10 +3533,7 @@ The agent appends the user's message first, then any system messages that are du .isError(result.isError()) .build())); } - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(toolResults) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(toolResults)); } return "(hit the main loop turn limit before finishing)"; } @@ -3903,7 +3892,7 @@ This example is deliberately small. A harness meant for real workloads would typ * **Sandboxed orchestration scripts:** let the model emit a short orchestration program (branching, loops, and reduce steps) and run it inside an isolated interpreter, rather than accepting only a flat list of subtask strings. * **Durable journaling:** replace the local JSON file with a store that survives process restarts and is safe under concurrent writers across machines. -* **Budget enforcement:** track total subagents launched across the whole session, not just per Workflow call, and refuse to exceed a hard cap so a runaway plan cannot exhaust your quota. +* **Budget enforcement:** track total subagents launched across the whole session, not just for each Workflow call, and refuse to exceed a hard cap so a runaway plan cannot exhaust your quota. The patterns in this example (the mode reminders, standing consent in the tool description, journaling, and a verification wave) carry over unchanged; only the execution substrate around them gets more robust. @@ -3923,6 +3912,6 @@ The patterns in this example (the mode reminders, standing consent in the tool d - The Anthropic-defined bash tool this example executes locally. + The Anthropic-defined bash tool this example runs locally. diff --git a/content/en/build-with-claude/mid-conversation-system-messages.md b/content/en/build-with-claude/mid-conversation-system-messages.md index d012a97822..f534a974b0 100644 --- a/content/en/build-with-claude/mid-conversation-system-messages.md +++ b/content/en/build-with-claude/mid-conversation-system-messages.md @@ -228,13 +228,12 @@ The following request declares `get_weather` in `tools`, then withdraws it after ], Messages = [ - new() { Role = Role.User, Content = "Say OK." }, + new BetaUserMessageParam { Content = "Say OK." }, // Withdraw get_weather from this point onward. The block references // the tool by name instead of editing `Tools`, so earlier turns stay // byte-identical and the cache still hits. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new( [ new BetaRequestToolRemovalBlock @@ -307,10 +306,9 @@ The following request declares `get_weather` in `tools`, then withdraws it after ```java Java import com.anthropic.models.beta.AnthropicBeta; - import com.anthropic.models.beta.messages.BetaContentBlockParam; import com.anthropic.models.beta.messages.BetaMessage; - import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaRequestToolRemovalBlock; + import com.anthropic.models.beta.messages.BetaSystemMessageParam.Content.SystemMessageContentBlock; import com.anthropic.models.beta.messages.BetaTool; import com.anthropic.models.beta.messages.MessageCreateParams; // ... @@ -340,13 +338,10 @@ The following request declares `get_weather` in `tools`, then withdraws it after // Withdraw get_weather from this point onward. The block references // the tool by name instead of editing `tools`, so earlier turns stay // byte-identical and the cache still hits. - .addMessage(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) - .contentOfBetaContentBlockParams(List.of( - BetaContentBlockParam.ofToolRemoval(BetaRequestToolRemovalBlock.builder() - .referenceTool("get_weather") - .build()))) - .build()) + .addSystemMessageOfBlocks(List.of( + SystemMessageContentBlock.ofToolRemoval(BetaRequestToolRemovalBlock.builder() + .referenceTool("get_weather") + .build()))) .build(); BetaMessage response = client.beta().messages().create(params); @@ -719,12 +714,11 @@ The following request keeps `get_weather` in `tools` and defines `db_query` afte ], Messages = [ - new() { Role = Role.User, Content = "How many orders shipped yesterday?" }, + new BetaUserMessageParam { Content = "How many orders shipped yesterday?" }, // Define db_query by value from this point onward. `Tools` and the // earlier messages stay exactly as sent, so the cache still hits. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new( [ new BetaRequestToolAdditionBlock @@ -820,9 +814,9 @@ The following request keeps `get_weather` in `tools` and defines `db_query` afte ```java Java import com.anthropic.models.beta.AnthropicBeta; - import com.anthropic.models.beta.messages.BetaContentBlockParam; import com.anthropic.models.beta.messages.BetaMessage; import com.anthropic.models.beta.messages.BetaRequestToolAdditionBlock; + import com.anthropic.models.beta.messages.BetaSystemMessageParam.Content.SystemMessageContentBlock; import com.anthropic.models.beta.messages.BetaTool; import com.anthropic.models.beta.messages.MessageCreateParams; // ... @@ -864,8 +858,8 @@ The following request keeps `get_weather` in `tools` and defines `db_query` afte .addUserMessage("How many orders shipped yesterday?") // Define db_query by value from this point onward. `tools` and the // earlier messages stay exactly as sent, so the cache still hits. - .addSystemMessageOfBetaContentBlockParams(List.of( - BetaContentBlockParam.ofToolAddition(BetaRequestToolAdditionBlock.builder() + .addSystemMessageOfBlocks(List.of( + SystemMessageContentBlock.ofToolAddition(BetaRequestToolAdditionBlock.builder() .definitionTool(dbQueryTool) .build()))) .build(); @@ -1012,7 +1006,7 @@ To change a tool's schema, or to move a server tool to a newer version, send a d A few rules follow from where the definition renders: -* **Declare what you know up front.** A tool you know about at the first request belongs in `tools`, with `defer_loading: true` and a later `tool_addition` reference if the model shouldn't see it yet. Define by value only what is unknown at the first request or changes later. +* **Declare what you know up front.** A tool you know about at the first request belongs in `tools`, with `defer_loading: true` and a later `tool_addition` reference if it shouldn't be offered to the model yet. Define by value only what is unknown at the first request or changes later. * **Keep at least one non-deferred tool in `tools`.** A conversation whose `tools` array has no non-deferred tool is accepted, but the first tool it defines by value changes the start of the rendered prompt, which costs one full cache miss on that request. A [tool search tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) counts as non-deferred. * **Dated tool types keep their own beta headers.** If a server tool you define by value requires its own beta header, send that header on every later request in the conversation. * **`cache_control` goes on the block or in the definition, not both,** and counts toward the request's breakpoint limit. A deferred definition can't carry `cache_control`. @@ -1021,8 +1015,8 @@ A request returns a 400 error with `error.details.error_code` set to `available_ * More than 10,000 deferred tools are available after any message. * More than 10,000 tools defined after the first user message are available after any message. -* The tool definitions sent after the first user message that are still available after any message total more than 4 MB (4,194,304 bytes). -* The rendered tool text is larger than 4 MB (4,194,304 bytes). +* The tool definitions sent after the first user message that are still available after any message total more than 4 MB (4,194,304 bytes). +* The rendered tool text is larger than 4 MB (4,194,304 bytes). ### Add an MCP server mid-conversation (beta) @@ -1302,12 +1296,11 @@ The following request keeps `get_weather` in `tools`, lists the calendar server ], Messages = [ - new() { Role = Role.User, Content = "What's on my calendar tomorrow?" }, + new BetaUserMessageParam { Content = "What's on my calendar tomorrow?" }, // Make the calendar server's tools available from this point onward. // The block names the server; it never holds a URL or token. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new( [ new BetaRequestToolAdditionBlock @@ -1407,12 +1400,12 @@ The following request keeps `get_weather` in `tools`, lists the calendar server ```java Java import com.anthropic.models.beta.AnthropicBeta; - import com.anthropic.models.beta.messages.BetaContentBlockParam; import com.anthropic.models.beta.messages.BetaMcpTool; import com.anthropic.models.beta.messages.BetaMcpToolset; import com.anthropic.models.beta.messages.BetaMessage; import com.anthropic.models.beta.messages.BetaRequestMcpServerUrlDefinition; import com.anthropic.models.beta.messages.BetaRequestToolAdditionBlock; + import com.anthropic.models.beta.messages.BetaSystemMessageParam.Content.SystemMessageContentBlock; import com.anthropic.models.beta.messages.BetaTool; import com.anthropic.models.beta.messages.MessageCreateParams; // ... @@ -1447,8 +1440,8 @@ The following request keeps `get_weather` in `tools`, lists the calendar server .addUserMessage("What's on my calendar tomorrow?") // Make the calendar server's tools available from this point onward. // The block names the server; it never holds a URL or token. - .addSystemMessageOfBetaContentBlockParams(List.of( - BetaContentBlockParam.ofToolAddition(BetaRequestToolAdditionBlock.builder() + .addSystemMessageOfBlocks(List.of( + SystemMessageContentBlock.ofToolAddition(BetaRequestToolAdditionBlock.builder() .definitionTool(BetaMcpToolset.builder() .mcpServerName("calendar") .build()) @@ -1628,12 +1621,12 @@ A few situations where this matters: * **Mid-session policy or persona changes.** A long agentic session needs a new constraint ("from now on, write all SQL as parameterized queries") after dozens of cached turns. Adding it to the top-level `system` field would re-process the entire history. * **Per-turn context that must be authoritative.** You want to inject a freshness note, a session deadline, or a tool-availability change with system-level weight, and it changes too often to live in the cached prefix. -* **Per-turn reminders that shouldn't pile up.** A harness nudges the model after each batch of tool results ("request independent reads together", "the user hasn't heard from you in a while") and wants the model to see only the newest copy. A [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) renders for one turn and then costs nothing, without deleting anything from the history. -* **State changes your application observes.** Your application notices something Claude should treat as an operator-level fact: files changed on disk, the user toggled an auto-approve setting, available tools changed, or the remaining token budget dropped below a threshold. -* **User input that should not interrupt an agentic loop.** A user types a follow-up while Claude is still executing tools for the previous request. Relaying it as a system message after the next tool result lets Claude fold the new input into the work it is already doing, instead of treating it as a fresh request to switch to. On Claude Sonnet 5.5 and Claude Haiku 5.5, append the user's words as a `text` block after the last `tool_result` in the same `user` message instead. See [Placement after tool results](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#placement-after-tool-results). +* **Per-turn reminders that shouldn't pile up.** A harness nudges the model after each batch of tool results ("request independent reads together," "the user hasn't heard from you in a while") and needs the model to receive only the newest copy. A [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) renders for one turn and then costs nothing, without deleting anything from the history. +* **State changes your application observes.** Your application detects something Claude should treat as an operator-level fact: files changed on disk, the user toggled an auto-approve setting, available tools changed, or the remaining token budget dropped below a threshold. +* **User input that should not interrupt an agentic loop.** A user types a follow-up while Claude is still running tools for the previous request. Relaying it as a system message after the next tool result lets Claude fold the new input into the work it is already doing, instead of treating it as a fresh request to switch to. On Claude Sonnet 5.5 and Claude Haiku 5.5, append the user's words as a `text` block after the last `tool_result` in the same `user` message instead. See [Placement after tool results](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#placement-after-tool-results). * **Mode switches that grant standing permissions.** A session-level mode can use a mid-conversation system message to grant standing consent to an expensive capability, such as automatically launching multiagent workflows, with a short refresher every several turns and an exit notice when the mode is turned off. For a worked example, see [Build an orchestration mode](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-effort-example). -In all of these cases you could put the instruction in a regular `user` message, and Claude does follow instructions that arrive in user turns. The difference is priority: a `user` message is treated as coming from the end user, while a `system` message is treated as coming from you, the application operator. When the two conflict, system instructions take precedence, so use the `system` role for operator-level facts and constraints that should hold even if the end user asks for something different. A mid-conversation system message keeps that operator-level priority without paying the cache-miss cost of editing the top-level `system` field. +In all of these cases you could put the instruction in a regular `user` message, and Claude does follow instructions that arrive in user turns. The difference is priority: a `user` message is treated as coming from the end user, whereas a `system` message is treated as coming from you, the application operator. When the two conflict, system instructions take precedence, so use the `system` role for operator-level facts and constraints that should hold even if the end user asks for something different. A mid-conversation system message keeps that operator-level priority without paying the cache-miss cost of editing the top-level `system` field. ## How it works @@ -1787,28 +1780,18 @@ A `role: "system"` message can also carry `output_config.effort` to change the [ System = "You are a code review assistant. Be concise.", Messages = [ - new() - { - Role = Role.User, - Content = "Review process() in utils.py for performance issues." - }, - new() + new UserMessageParam { Content = "Review process() in utils.py for performance issues." }, + new AssistantMessageParam { - Role = Role.Assistant, Content = "The list comprehension is fine for small inputs. For large inputs, consider a generator to avoid materializing the full list." }, - new() - { - Role = Role.User, - Content = "Now review the calling code that invokes process()." - }, + new UserMessageParam { Content = "Now review the calling code that invokes process()." }, // The reviewer realizes mid-session that all suggestions must also pass // the team's strict typing policy. Appending the instruction here keeps // earlier turns byte-identical, so the prefix cached by the previous // request is still read from cache. - new() + new SystemMessageParam { - Role = Role.System, Content = "From now on, every suggestion must include explicit type annotations." } ] @@ -1858,8 +1841,6 @@ A `role: "system"` message can also carry `output_config.effort` to change the [ ```java Java import com.anthropic.models.messages.CacheControlEphemeral; - // ... - import com.anthropic.models.messages.MessageParam; // ... AnthropicClient client = AnthropicOkHttpClient.fromEnv(); @@ -1877,10 +1858,7 @@ A `role: "system"` message can also carry `output_config.effort` to change the [ // the team's strict typing policy. Appending the instruction here keeps // earlier turns byte-identical, so the prefix cached by the previous // request is still read from cache. - .addMessage(MessageParam.builder() - .role(MessageParam.Role.SYSTEM) - .content("From now on, every suggestion must include explicit type annotations.") - .build()) + .addSystemMessage("From now on, every suggestion must include explicit type annotations.") .build(); Message response = client.messages().create(params); @@ -1924,7 +1902,7 @@ A `role: "system"` message can also carry `output_config.effort` to change the [ client = Anthropic::Client.new response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, # Automatic prompt caching: each request caches the conversation so far, # and the next request reads the unchanged prefix from cache. @@ -1976,7 +1954,7 @@ In an [agentic loop](https://platform.claude.com/docs/en/agents-and-tools/tool-u ] ``` -Phrase the system content as context rather than as a command that overrides the user. State the fact ("new input arrived from the user: X", "the remaining token budget is now Y") and let Claude act on it. Claude is trained to resist instructions that appear to work against the user, and that protection still applies to the system role, so language such as "ignore what the user said" is less effective than stating what changed. +Phrase the system content as context rather than as a command that overrides the user. State the fact ("new input arrived from the user: X," "the remaining token budget is now Y") and let Claude act on it. Claude is trained to resist instructions that appear to work against the user, and that protection still applies to the system role, so language such as "ignore what the user said" is less effective than stating what changed. This pattern is for relaying input from the conversation's own end user. Do not use it to pass tool output, retrieved documents, or other third-party content; keep that content in `tool_result` blocks (see [Limitations](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#limitations)). @@ -2020,7 +1998,7 @@ Turn-scoped system messages are in beta. Include the [beta header](https://platf The main use is a per-turn reminder in a tool loop. Append the reminder after the `tool_result` message each time you want the model to see it, and leave every earlier copy where it is. The model sees only the copies that come after the last user message, so the reminder never piles up. Nothing earlier in `messages` changes, so the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) keeps matching. On Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5 this also keeps later [thinking blocks valid](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation): deleting an earlier reminder would change the conversation before those blocks and fail the conversation check, while a cleared message stays in the array and leaves that conversation unchanged. -The following request is a later step of an agent loop. `messages[3]` rendered on the earlier request, when it was the last message in the array. Once `messages[5]` (a later user message) exists, `messages[3]` is cleared: the cleared message stays in the array, so the conversation before the thinking block in `messages[4]` is unchanged, but the model no longer sees its text. `messages[6]` and `messages[7]` both render, in order. +The following request is a later step of an agent loop. `messages[3]` rendered on the earlier request, when it was the last message in the array. Once `messages[5]` (a later user message) exists, `messages[3]` is cleared: the cleared message stays in the array, so the conversation before the thinking block in `messages[4]` is unchanged, but the model no longer receives its text. `messages[6]` and `messages[7]` both render, in order. ```json { @@ -2095,13 +2073,13 @@ The following request is a later step of an agent loop. `messages[3]` rendered o Rules for turn-scoped messages: -* **Re-send cleared messages verbatim.** A cleared message is still part of the conversation history. Rebuilding it from current state (a fresh token count, a timestamp), dropping it as redundant, or changing its `clear_at` value is an edit to an earlier message. The prompt cache misses from that point, and on Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5 every thinking block produced after it fails the [conversation check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation). +* **Re-send cleared messages verbatim.** A cleared message is still part of the conversation history. Rebuilding it from current state (a fresh token count, a timestamp), dropping it as redundant, or changing its `clear_at` value is an edit to an earlier message. On Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, every thinking block produced after it fails the [conversation check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation). * **Text only.** `content` is one or more `text` blocks (or a string). `tool_addition` and `tool_removal` blocks return a 400 error on a turn-scoped message, and so does `output_config`. Use a separate `role: "system"` message without `clear_at` for those. * **No `cache_control` on its blocks.** A cleared message is never part of a cache key, so a breakpoint on it could never match. Put the breakpoint on the last block of the preceding user turn instead, as the example does. The top-level [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) field skips turn-scoped messages when it picks a breakpoint. On the request that clears a message, the reusable cached prefix ends at the user turn before it, so only the one assistant turn between that message and the new user message is reprocessed. * **Placement rules still apply**, cleared or not. A turn-scoped message must follow a `user` turn (or an `assistant` turn ending in a server tool result) and precede an `assistant` turn or end the array, like any mid-conversation system message. One that ends the array always renders. One followed directly by another `user` message is a 400 error, not a cleared message: put all of a tool round's results in one user message and the reminders after it. * **Assistant turns don't clear it.** A prefilled or [paused](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#pause-turn) assistant turn after the message, or a server-side tool loop, adds no user message, so the message still renders on that continuation. To keep a reminder in view through a client-side tool loop, append it again after each `tool_result` message. * **Token counting follows what renders.** A cleared message adds nothing to `usage.input_tokens` or to a [token count](https://platform.claude.com/docs/en/build-with-claude/token-counting). -* **Imported history.** In a transcript you construct in one step (few-shot examples, a migrated conversation), a turn-scoped message that already has an assistant turn and a user message after it is cleared from the first request and never renders. That is the right state for a per-turn reminder you are carrying over. Leave `clear_at` unset only on a message the model should see on every request. +* **Imported history.** In a transcript you construct in one step (few-shot examples, a migrated conversation), a turn-scoped message that already has an assistant turn and a user message after it is cleared from the first request and never renders. That is the right state for a per-turn reminder you are carrying over. Leave `clear_at` unset only on a message that should render on every request. The validation errors are: @@ -2216,11 +2194,10 @@ Through the SDK, set `clear_at` (csharp, go: `ClearAt`; java: `.clearAt()`; php: MaxTokens = 4096, Messages = [ - new() { Role = Role.User, Content = "Draft a short status update on the database migration for the team channel." }, + new BetaUserMessageParam { Content = "Draft a short status update on the database migration for the team channel." }, // Turn-scoped reminder: renders for this turn, then clears once a later user message exists. - new() + new BetaSystemMessageParam { - Role = Role.System, ClearAt = ClearAt.NextUserMessage, Content = "The reader is on call: keep this reply under 50 words.", }, @@ -2268,7 +2245,7 @@ Through the SDK, set `clear_at` (csharp, go: `ClearAt`; java: `.clearAt()`; php: ```java Java import com.anthropic.models.beta.AnthropicBeta; import com.anthropic.models.beta.messages.BetaMessage; - import com.anthropic.models.beta.messages.BetaMessageParam; + import com.anthropic.models.beta.messages.BetaSystemMessageParam; import com.anthropic.models.beta.messages.MessageCreateParams; import com.anthropic.models.messages.Model; @@ -2281,9 +2258,8 @@ Through the SDK, set `clear_at` (csharp, go: `ClearAt`; java: `.clearAt()`; php: .addBeta(AnthropicBeta.MID_CONVERSATION_SYSTEM_CLEAR_AT_2026_08_21) .addUserMessage("Draft a short status update on the database migration for the team channel.") // Turn-scoped reminder: renders for this turn, then clears once a later user message exists. - .addMessage(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) - .clearAt(BetaMessageParam.ClearAt.NEXT_USER_MESSAGE) + .addMessage(BetaSystemMessageParam.builder() + .clearAt(BetaSystemMessageParam.ClearAt.NEXT_USER_MESSAGE) .content("The reader is on call: keep this reply under 50 words.") .build()) .build(); @@ -2328,7 +2304,7 @@ Through the SDK, set `clear_at` (csharp, go: `ClearAt`; java: `.clearAt()`; php: client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 4096, messages: [ {role: "user", content: "Draft a short status update on the database migration for the team channel."}, @@ -2348,7 +2324,7 @@ Through the SDK, set `clear_at` (csharp, go: `ClearAt`; java: `.clearAt()`; php: Mid-conversation system messages and [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) are designed to be used together: -* **Enable caching explicitly.** Caching only happens when the request includes `cache_control`, either the top-level [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) field or an [explicit breakpoint](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints) on a content block. A mid-conversation system message does not create a cache entry on its own, and without caching enabled there are no savings to preserve. +* **Enable caching explicitly.** Caching only occurs when the request includes `cache_control`, either the top-level [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) field or an [explicit breakpoint](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints) on a content block. A mid-conversation system message does not create a cache entry on its own, and without caching enabled there are no savings to preserve. * **Cache the stable prefix as usual.** Place `cache_control` on the last block that stays the same across requests, whether that is the end of the top-level `system` field, the end of your tool definitions, or a stable point in the message history. * **Append the system message after the breakpoint.** Because it comes after the cached prefix, it does not change the prefix hash and the cache still hits. * **A mid-conversation system message is itself cacheable.** Once it is in the conversation, it becomes part of the stable history. On the next turn you can move your cache breakpoint past it (or rely on [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) to do so) and the system message is read from cache like any other turn. @@ -2370,7 +2346,7 @@ Avoid editing or removing a mid-conversation system message that has already bee - Find out exactly where two requests diverged when a cache hit you expected does not happen. + Find out exactly where two requests diverged when a cache hit you expected does not occur. diff --git a/content/en/build-with-claude/multilingual-support.md b/content/en/build-with-claude/multilingual-support.md index 23393a81b4..fade5339a4 100644 --- a/content/en/build-with-claude/multilingual-support.md +++ b/content/en/build-with-claude/multilingual-support.md @@ -102,10 +102,7 @@ Claude infers the response language from the conversation, but for production ap Model = Model.ClaudeOpus5_5, MaxTokens = 1024, System = "Always respond in French, regardless of the language the user writes in.", - Messages = - [ - new() { Role = Role.User, Content = "How do I reset my password?" } - ] + Messages = [new UserMessageParam { Content = "How do I reset my password?" }] }; var message = await client.Messages.Create(parameters); @@ -184,7 +181,7 @@ If your application lets users pick a language at runtime, interpolate that choi When working with multilingual content: -1. **Provide clear language context:** Although Claude can detect the target language automatically, explicitly stating the desired input and output languages improves reliability. For enhanced fluency, you can prompt Claude to use "idiomatic speech as if it were a native speaker." +1. **Provide clear language context:** Although Claude can detect the target language automatically, explicitly stating the input and output languages you want improves reliability. For enhanced fluency, you can prompt Claude to use "idiomatic speech as if it were a native speaker." 2. **Use native scripts:** Submit text in its native script rather than transliteration for optimal results. 3. **Consider cultural context:** Effective communication often requires cultural and regional awareness beyond pure translation. diff --git a/content/en/build-with-claude/overview.md b/content/en/build-with-claude/overview.md index dd2c108619..9d1da93e38 100644 --- a/content/en/build-with-claude/overview.md +++ b/content/en/build-with-claude/overview.md @@ -8,8 +8,8 @@ Claude's API surface is organized into five areas: * **Model capabilities:** Control how Claude reasons and formats responses. * **Tools:** Let Claude take actions on the web or in your environment. -* **Tool infrastructure:** Handles discovery and orchestration at scale. -* **Context management:** Keeps long-running sessions efficient. +* **Tool infrastructure:** Handle discovery and orchestration at scale. +* **Context management:** Keep long-running sessions efficient. * **Files and assets:** Manage the documents and data you provide to Claude. If you're new, start with [model capabilities](https://platform.claude.com/docs/en/build-with-claude/overview#model-capabilities) and [tools](https://platform.claude.com/docs/en/build-with-claude/overview#tools). Return to the other sections when you're ready to optimize cost, latency, or scale. @@ -41,21 +41,21 @@ The ZDR column indicates whether a feature is available under a Zero Data Retent | Feature | Description | Zero Data Retention (ZDR) | Availability | | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | [Context windows](https://platform.claude.com/docs/en/build-with-claude/context-windows) | Up to 1M tokens for processing large documents, extensive code bases, and long conversations. | ZDR eligible | | -| [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | Let Claude dynamically determine when and how much to think. The only thinking mode on Claude 4.7 and later models. Use the effort parameter to control thinking depth. | ZDR eligible | | +| [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | Let Claude dynamically determine when and how much to think. The only thinking mode on Claude 4.7 and later models. Use the `effort` parameter to control thinking depth. | ZDR eligible | | | [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) | Process large volumes of requests asynchronously for cost savings. Send batches with a large number of queries per batch. Batch API calls cost 50% less than standard API calls. | Not ZDR eligible | | | [Citations](https://platform.claude.com/docs/en/build-with-claude/citations) | Ground Claude's responses in source documents. With Citations, Claude can provide detailed references to the exact sentences and passages it uses to generate responses, leading to more verifiable, trustworthy outputs. | ZDR eligible | | | [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) | Control where model inference runs using geographic controls. Specify `"global"` or `"us"` routing per request through the `inference_geo` parameter. | ZDR eligible | | -| [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) | Control how many tokens Claude uses when responding with the effort parameter, trading off between response thoroughness and token efficiency. | ZDR eligible | | -| [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) | Avoid paying the prompt-cache cost twice when you retry a refused request on another model. The refusal carries a credit token, and echoing it on the retry bills the retry as though the conversation had been on the new model all along. Message Batches results do not include fallback credit tokens. | Not ZDR eligible\* | | +| [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) | Control how many tokens Claude uses when responding with the `effort` parameter, trading off between response thoroughness and token efficiency. | ZDR eligible | | +| [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) | Avoid paying the prompt-cache cost twice when you retry a refused request on another model. The refusal carries a credit token, and echoing it on the retry bills the retry as though the conversation had been on the new model from the start. Message Batches results do not include fallback credit tokens. | Not ZDR eligible\* | | | [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support) | Process and analyze text and visual content from PDF documents. | ZDR eligible | | -| [Search results](https://platform.claude.com/docs/en/build-with-claude/search-results) | Enable natural citations for RAG applications by providing search results with proper source attribution. Achieve web search-quality citations for custom knowledge bases and tools. | ZDR eligible | | +| [Search results](https://platform.claude.com/docs/en/build-with-claude/search-results) | Get natural citations for RAG applications by providing search results with proper source attribution. Achieve web search-quality citations for custom knowledge bases and tools. | ZDR eligible | | | [Server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) | Retry a refused request inside a single API call. Use the `"default"` mode to apply Anthropic's recommended fallback models, or name up to three models of your own; when the requested model declines, the API runs the next model in the chain on the same request. The `fallbacks` parameter is not available in the Message Batches API. | Not ZDR eligible\* | | | [Structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) | Guarantee schema conformance with two approaches: JSON outputs for structured data responses, and strict tool use for validated tool inputs. | [ZDR eligible (qualified)](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#data-retention)\* | | | [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | Enhanced reasoning capabilities for complex tasks, with an optional summary of Claude's reasoning before its final answer. | ZDR eligible | | ## Tools -Built-in tools that Claude invokes through `tool_use`. Server-side tools are run by the platform; client-side tools are implemented and executed by you. +Built-in tools that Claude calls through `tool_use`. Server-side tools are run by the platform; client-side tools are implemented and run by you. ### Server-side tools @@ -63,18 +63,18 @@ Built-in tools that Claude invokes through `tool_use`. Server-side tools are run | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | --------------------------------------------------------------------- | | [Advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) | Pair a faster executor model with a higher-intelligence advisor model that provides strategic guidance mid-generation for long-horizon agentic workloads. | ZDR eligible | | | [Code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) | Run code in a sandboxed environment for advanced data analysis, calculations, and file processing. Free when used with web search or web fetch. | Not ZDR eligible | † | -| [Web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) | Retrieve full content from specified web pages and PDF documents for in-depth analysis. | ZDR eligible\* | | +| [Web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) | Retrieve full content from specified webpages and PDF documents for in-depth analysis. | ZDR eligible\* | | | [Web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) | Augment Claude's comprehensive knowledge with current, real-world data from across the web. | ZDR eligible\* | | ### Client-side tools -| Feature | Description | ZDR | Availability | -| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ----------------------------------------------------------------------------------------- | -| [Bash](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) | Execute bash commands and scripts to interact with the system shell and perform command-line operations. | ZDR eligible | | -| [Browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) | Navigate, read, and interact with webpages in your own browser environment. | ZDR eligible | | -| [Computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) | Control computer interfaces by taking screenshots and issuing mouse and keyboard commands. | ZDR eligible | | -| [Memory](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool) | Enable Claude to store and retrieve information across conversations. Build knowledge bases over time, maintain project context, and learn from past interactions. | ZDR eligible | | -| [Text editor](https://platform.claude.com/docs/en/agents-and-tools/tool-use/text-editor-tool) | Create and edit text files with a built-in text editor interface for file manipulation tasks. | ZDR eligible | | +| Feature | Description | ZDR | Availability | +| ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------- | +| [Bash](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) | Run bash commands and scripts to interact with the system shell and perform command-line operations. | ZDR eligible | | +| [Browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) | Navigate, read, and interact with webpages in your own browser environment. | ZDR eligible | | +| [Computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) | Control computer interfaces by taking screenshots and issuing mouse and keyboard commands. | ZDR eligible | | +| [Memory](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool) | Allow Claude to store and retrieve information across conversations. Build knowledge bases over time, maintain project context, and learn from past interactions. | ZDR eligible | | +| [Text editor](https://platform.claude.com/docs/en/agents-and-tools/tool-use/text-editor-tool) | Create and edit text files with a built-in text editor interface for file manipulation tasks. | ZDR eligible | | ## Tool infrastructure @@ -86,7 +86,7 @@ Infrastructure that supports discovering, orchestrating, and scaling tool use. | [Fine-grained tool streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming) | Stream tool use parameters without buffering/JSON validation, reducing latency for receiving large parameters. | ZDR eligible | | | [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) | Connect to remote [MCP](https://modelcontextprotocol.io/) servers directly from the Messages API without a separate MCP client. | Not ZDR eligible | | | [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) | Enable Claude to call your tools programmatically from within code execution containers, reducing latency and token consumption for multi-tool workflows. | Not ZDR eligible | † | -| [Tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) | Scale to thousands of tools by dynamically discovering and loading tools on-demand using regex- and BM25-based search, optimizing context usage and improving tool selection accuracy. | ZDR eligible | | +| [Tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) | Scale to thousands of tools by dynamically discovering and loading tools on demand using regex- and BM25-based search, optimizing context usage and improving tool selection accuracy. | ZDR eligible | | ## Context management @@ -98,8 +98,8 @@ Infrastructure for controlling and optimizing Claude's context window. | [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) | Automatically manage conversation context with configurable strategies. Supports clearing tool results when approaching token limits and managing thinking blocks in extended thinking conversations. | ZDR eligible | | | [Automatic prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) | Simplify prompt caching to a single API parameter. The system automatically caches the last cacheable block in your request, moving the cache point forward as conversations grow. | ZDR eligible | | | [Prompt caching (5m)](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) | Provide Claude with more background knowledge and example outputs to reduce costs and latency. | ZDR eligible | | -| [Prompt caching (1hr)](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration) | Extended 1-hour cache duration for less frequently accessed but important context, complementing the standard 5-minute cache. | ZDR eligible | | -| [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) | Token counting enables you to determine the number of tokens in a message before sending it to Claude, helping you make informed decisions about your prompts and usage. | ZDR eligible | | +| [Prompt caching (1h)](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration) | Extended 1-hour cache duration for less frequently accessed but important context, complementing the standard 5-minute cache. | ZDR eligible | | +| [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) | Token counting allows you to determine the number of tokens in a message before sending it to Claude, helping you make informed decisions about your prompts and usage. | ZDR eligible | | ## Files and assets diff --git a/content/en/build-with-claude/pdf-support.md b/content/en/build-with-claude/pdf-support.md index fa739c27ca..5a5f301ffe 100644 --- a/content/en/build-with-claude/pdf-support.md +++ b/content/en/build-with-claude/pdf-support.md @@ -19,20 +19,20 @@ You can ask Claude about any text, pictures, charts, and tables in PDFs you prov * Analyzing financial reports and understanding charts/tables * Extracting key information from legal documents -* Assisting with document translation +* Helping with document translation * Converting document information into structured formats -## Before you begin +## Before you start ### Check PDF requirements Claude works with any standard PDF. Ensure your request size meets these requirements: -| Requirement | Limit | -| ------------------------- | -------------------------------------------------------------------------------------------------- | -| Maximum request size | 32 MB ([varies by platform](https://platform.claude.com/docs/en/api/overview#request-size-limits)) | -| Maximum pages per request | 600 (100 when the request's context window is under 1M tokens) | -| Format | Standard PDF (no passwords/encryption) | +| Requirement | Limit | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Maximum request size | 32 MB (varies by platform; see [request size limits](https://platform.claude.com/docs/en/api/overview#request-size-limits)) | +| Maximum pages per request | 600 (100 when the request's context window is under 1M tokens) | +| Format | Standard PDF (no passwords/encryption) | Both limits are on the entire request payload, including any other content sent alongside PDFs. For large PDFs, consider uploading with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and referencing by `file_id` to keep request payloads small. @@ -116,20 +116,20 @@ The simplest approach is to reference a PDF directly from a URL: "model": "claude-opus-5-5", "max_tokens": 1024, "messages": [{ - "role": "user", - "content": [{ - "type": "document", - "source": { - "type": "url", - "url": "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf" - } - }, - { - "type": "text", - "text": "What are the key findings in this document?" - }] + "role": "user", + "content": [{ + "type": "document", + "source": { + "type": "url", + "url": "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf" + } + }, + { + "type": "text", + "text": "What are the key findings in this document?" + }] }] - }' + }' ``` ```bash CLI @@ -221,9 +221,8 @@ The simplest approach is to reference a PDF directly from a URL: MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { documentParam, @@ -276,7 +275,7 @@ The simplest approach is to reference a PDF directly from a URL: MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText( @@ -533,9 +532,8 @@ If you need to send PDFs from your local system or when a URL isn't available: MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { documentParam, @@ -615,7 +613,7 @@ If you need to send PDFs from your local system or when a URL isn't available: MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument(documentParam), ContentBlockParam.ofText( @@ -854,9 +852,8 @@ For PDFs you'll use repeatedly, or when you want to avoid encoding overhead, use MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -921,7 +918,7 @@ For PDFs you'll use repeatedly, or when you want to avoid encoding overhead, use MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument( DocumentBlockParam.builder().fileSource(file.id()).build() @@ -1027,7 +1024,7 @@ When you send a PDF to Claude, the following steps occur: Claude can reference both textual and visual content when it responds. You can further improve performance by integrating PDF support with: * [Use prompt caching](https://platform.claude.com/docs/en/build-with-claude/pdf-support#use-prompt-caching): To improve performance for repeated analysis. - * [Process document batches](https://platform.claude.com/docs/en/build-with-claude/pdf-support#process-document-batches): For high-volume document processing. + * [Process document batches](https://platform.claude.com/docs/en/build-with-claude/pdf-support#process-document-batches): To process documents at high volume. * [Tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview): To extract specific information from documents for use as tool inputs. @@ -1200,9 +1197,8 @@ Cache PDFs with [prompt caching](https://platform.claude.com/docs/en/build-with- MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -1279,7 +1275,7 @@ Cache PDFs with [prompt caching](https://platform.claude.com/docs/en/build-with- MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument( DocumentBlockParam.builder() @@ -1639,9 +1635,8 @@ Use the [Message Batches API](https://platform.claude.com/docs/en/build-with-cla MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -1663,9 +1658,8 @@ Use the [Message Batches API](https://platform.claude.com/docs/en/build-with-cla MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = new List { new DocumentBlockParam @@ -1764,7 +1758,7 @@ Use the [Message Batches API](https://platform.claude.com/docs/en/build-with-cla BatchCreateParams.Request.Params.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument( DocumentBlockParam.builder() @@ -1791,7 +1785,7 @@ Use the [Message Batches API](https://platform.claude.com/docs/en/build-with-cla BatchCreateParams.Request.Params.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofDocument( DocumentBlockParam.builder() @@ -1959,7 +1953,7 @@ Batches process asynchronously. To check progress and retrieve results once proc - Claude's vision capabilities allow it to understand and analyze images, opening up exciting possibilities for multimodal interaction. + Claude's vision capabilities allow it to process and analyze images, opening up exciting possibilities for multimodal interaction. diff --git a/content/en/build-with-claude/preserved-thinking.md b/content/en/build-with-claude/preserved-thinking.md index 1e14b9af1b..38ccb5c52d 100644 --- a/content/en/build-with-claude/preserved-thinking.md +++ b/content/en/build-with-claude/preserved-thinking.md @@ -25,7 +25,7 @@ Check your integration if, between two requests in one conversation, it does any * [Summarizes or drops old turns on the client](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client) and keeps recent turns with their thinking * [Adds, removes, or edits entries in `tools`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#tool-changes) * [Adds a reminder to a user turn](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) and removes or rewrites it later -* [Drops some `thinking` blocks and keeps later ones](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned), or removes them and [later puts them back](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check) +* [Drops some `thinking` blocks and keeps later ones](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned), or removes them and [later restores those blocks](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check) * [Rebuilds a saved session from templates](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#faq) instead of replaying what it sent On an older account, none of these produces an error unless the request sets `prefix_mismatch_behavior`, so a run with no errors on your own key doesn't show whether your code is affected. If people run your tool with their own API keys, those on newer accounts get the 400 error before you do. To see what they see without changing how your requests behave, send the `thinking-binding-controls-2026-08-01` beta header. On an older account, each response then flags blocks that fail the check, and the model still reads them (see [Set the mismatch behavior and read `input_transformations`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls)). @@ -45,7 +45,7 @@ Claude Haiku 5.5 reads thinking blocks from Claude Sonnet 5, Claude Opus 4.8, Cl * **A conversation that moves to Claude Fable 5.1 from an earlier model, or from Claude Opus 5.5 on the Claude API, keeps its reasoning.** The earlier model's thinking blocks stay readable, so the model thinks as usual from the first turn after the switch. * **A conversation that moves from Claude Fable 5.1 to any model other than Claude Mythos 5.1 loses Claude Fable 5.1's reasoning for that request.** This occurs when a router sends a turn to a cheaper model, after a [classifier refusal fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), or during a [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback). The API removes the unreadable blocks before the prompt reaches the model. They aren't billed and don't count toward `input_tokens`. -Keep sending the full history on every request, thinking blocks included, and let the API drop what the current model can't read. The API never edits your `messages` array, so the dropped blocks stay in your history. When the same history goes back to Claude Fable 5.1, its blocks are readable again, along with the earlier model's thinking. The reasoning is lost for good only if your client removes the blocks itself, for example a harness that strips thinking on a model switch or rebuilds the history from what each model used. +Keep sending the full history on every request, thinking blocks included, and let the API drop what the current model can't read. The API never edits your `messages` array, so the dropped blocks stay in your history. When the same history goes back to Claude Fable 5.1, its blocks are readable again, along with the earlier model's thinking. The reasoning is permanently lost only if your client removes the blocks itself, for example a harness that strips thinking on a model switch or rebuilds the history from what each model used. ![Animation: switching to Claude Opus skips Claude Fable 5.1's thinking for that turn; switching back, everything is read again](https://platform.claude.com/docs/images/preserved-thinking-model-switch.svg) @@ -87,7 +87,7 @@ Request parameters outside those three fields, such as `effort`, `max_tokens`, ` Earlier thinking blocks aren't in the prefix, but each thinking block records which thinking block came before it, across turns. You can remove thinking blocks from the start of the history (oldest first), from the end, or all of them. What fails is a gap: the thinking blocks you keep must be an unbroken run of the original sequence, so removing one from the middle invalidates the thinking blocks after it. Once you remove a block, leave it out. Putting it back invalidates the thinking blocks produced while it was gone. -Keep `system` and `tools` fixed for the session and treat `messages` as append-only. The same discipline keeps the prefix stable for [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching): the edits that invalidate thinking are the edits that restart the cache. +Keep `system` and `tools` fixed for the session and treat `messages` as append-only. The same discipline keeps the prefix stable for [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching): most edits that invalidate thinking also restart the cache. ### What the API does with an invalid block @@ -97,14 +97,14 @@ You choose with `thinking.block_binding.prefix_mismatch_behavior`: * **`"drop_block"`:** the API drops each failing block and every thinking block after it, and the request succeeds. Dropped blocks aren't billed. The model answers that turn without using reasoning from dropped blocks, and the prompt cache restarts at the edit. The response lists each dropped block in `input_transformations` (on the `message_start` event when streaming) with `reason: "prefix_binding_mismatch"`. - `"drop_block"` keeps requests succeeding, but it doesn't fix the edit that caused the mismatch, and it has a cost. Dropping blocks can significantly increase the output tokens generated, especially at higher effort levels or when blocks are dropped on every turn. For more information, see [Output-token cost of `"drop_block"`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#drop-block-cost). Dropped blocks aren't billed, but Claude re-creates the reasoning it can no longer read, so it generates more output tokens. Output quality might also change on tasks where later turns build on earlier reasoning. Use `"drop_block"` as a stopgap while you fix the edit, but not as a long-term setting. + `"drop_block"` keeps requests succeeding, but it doesn't fix the edit that caused the mismatch, and it has a cost. Dropping blocks can significantly increase the output tokens generated, especially when blocks are dropped on every turn. For more information, see [Output-token cost of `"drop_block"`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#drop-block-cost). Dropped blocks aren't billed, but Claude re-creates the reasoning it can no longer read, so it generates more output tokens. Output quality might also change on tasks where later turns build on earlier reasoning. Use `"drop_block"` as a stopgap while you fix the edit, but not as a long-term setting. Count the responses in each session whose `input_transformations` has a `prefix_binding_mismatch` entry, alert on them, and replace each edit with the matching pattern in [Make changes without editing the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits). In the Message Batches API, an item that leaves the field unset doesn't fail. Where the API enforces the check by default, it drops the failing blocks instead. Set `"error"` explicitly there if you want batch items to fail. Both the field and the `input_transformations` array require the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers). [Set the mismatch behavior and read `input_transformations`](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls) shows the request in each SDK. -The 400 message begins: +The 400 message starts: ```text wrap messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". @@ -122,8 +122,6 @@ A tampered or undecryptable signature is a different failure. It always returns #### Output-token cost of `"drop_block"` -In Anthropic's testing on a multi-turn coding benchmark, dropping thinking blocks once per session increased output tokens by 2.5% at low effort, 3.9% at medium, 4.5% at high, and 20.1% at max. Dropping them on every turn after the first increased output tokens by 4.6% at low effort, 9.7% at medium, 10.3% at high, and 67.1% at max. These figures are estimates with wide error bars, and the impact on your workload depends on your harness. - When Claude can no longer read reasoning from earlier turns, it re-creates that reasoning, so requests that drop thinking blocks generate more output tokens and can take longer to respond. A drop on every turn costs more than an occasional drop, and how much more depends on your harness: how often it edits the prefix and how much each turn builds on earlier reasoning. Before you rely on `"drop_block"`, run evals on your own workload to measure the increase. If it's small, `"drop_block"` can keep requests succeeding while you fix the edit. Either way, fixing the edit with a pattern from [Make changes without editing the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits) is a better long-term solution. @@ -250,9 +248,8 @@ The following request opts into dropping rather than rejecting. On a first turn }, Messages = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "What is the greatest common divisor of 1071 and 462?", }, ], @@ -371,7 +368,7 @@ The following request opts into dropping rather than rejecting. On a first turn client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16_000, thinking: { type: "adaptive", @@ -418,26 +415,27 @@ To find out which group your account is in, take a Claude Fable 5.1 conversation Each row compares two consecutive requests: -| Change between requests | Later thinking blocks | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Append messages at the end | Valid | -| Add a tool with `defer_loading: true` that nothing has referenced yet | Valid | -| Remove `thinking` blocks from the start of the history, from the end, or all of them | Valid (the model loses that reasoning) | -| Change any request parameter outside `system`, `tools`, and `messages` (`effort`, `max_tokens`, `output_config`, `tool_choice`, `metadata`, `thinking.display`, and so on) | Valid | -| Add, move, or remove `cache_control` markers | Valid | -| A rotating signed URL that returns the same bytes | Valid | -| Server-side compaction or context editing removes or replaces content | Valid (the check compares what you sent, not the server's edited copy) | -| A cleared [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) left in place | Valid | -| Edit, reorder, or delete any earlier `user`, `assistant`, or `system` message | Invalid, except when the signed block from [on-demand compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand) replaces the messages it summarizes, under the [conditions for kept thinking](https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks#conditions-for-kept-thinking-to-stay-valid) | -| Re-render the context you put in the first user message with a changed value | Invalid for every thinking block | -| Clear or shorten an earlier `tool_result`, re-encode an earlier image, or change an earlier `tool_use` input | Invalid for every later thinking block | -| Add a text block to an earlier user turn, or remove one you added last time | Invalid | -| Change the top-level `system` string or blocks | Invalid | -| Add, remove, rename, or edit a tool in `tools` | Invalid | -| Remove a `thinking` block from the middle of the history and keep later ones | Invalid for every later thinking block | -| Put back a `thinking` block you removed on an earlier request | Invalid for thinking blocks produced while it was gone | -| An image or document URL that returns different bytes on the next request | Invalid | -| The same turn-scoped message deleted or reworded on a later request | Invalid | +| Change between requests | Later thinking blocks | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Append messages at the end | Valid | +| Add a tool with `defer_loading: true` that nothing has referenced yet | Valid | +| Remove `thinking` blocks from the start of the history, from the end, or all of them | Valid (the model loses that reasoning) | +| Change any request parameter outside `model`, `system`, `tools`, and `messages` (`effort`, `max_tokens`, `output_config`, `tool_choice`, `metadata`, `thinking.display`, and so on) | Valid | +| Change `model` | Valid for blocks that the new model can read; the API drops the others without an error (see [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models)) | +| Add, move, or remove `cache_control` markers | Valid | +| A rotating signed URL that returns the same bytes | Valid | +| Server-side compaction or context editing removes or replaces content | Valid (the check compares what you sent, not the server's edited copy) | +| A cleared [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) left in place | Valid | +| Edit, reorder, or delete any earlier `user`, `assistant`, or `system` message | Invalid, except when the signed block from [on-demand compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand) replaces the messages it summarizes, under the [conditions for kept thinking](https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks#conditions-for-kept-thinking-to-stay-valid) | +| Re-render the context you put in the first user message with a changed value | Invalid for every thinking block | +| Clear or shorten an earlier `tool_result`, re-encode an earlier image, or change an earlier `tool_use` input | Invalid for every later thinking block | +| Add a text block to an earlier user turn, or remove one you added last time | Invalid | +| Change the top-level `system` string or blocks | Invalid | +| Add, remove, rename, or edit a tool in `tools` | Invalid | +| Remove a `thinking` block from the middle of the history and keep later ones | Invalid for every later thinking block | +| Put back a `thinking` block you removed on an earlier request | Invalid for thinking blocks produced while it was gone | +| An image or document URL that returns different bytes on the next request | Invalid | +| The same turn-scoped message deleted or reworded on a later request | Invalid | ### Check whether your code edits the prefix @@ -536,7 +534,7 @@ Then confirm against the API. Add the `thinking-binding-controls-2026-08-01` bet List messages = []; foreach (var userTurn in userTurns) { - messages.Add(new() { Role = Role.User, Content = userTurn }); + messages.Add(new BetaUserMessageParam { Content = userTurn }); var response = await client.Beta.Messages.Create( new() { @@ -553,9 +551,8 @@ Then confirm against the API. Add the `thinking-binding-controls-2026-08-01` bet Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01], } ); - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); var thinkingBlocks = response.Content.Count(block => block.TryPickThinking(out _)); @@ -693,7 +690,7 @@ Then confirm against the API. Add the `thinking-binding-controls-2026-08-01` bet user_turns.each do |user_turn| messages << {role: "user", content: user_turn} response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16_000, thinking: { type: "adaptive", @@ -848,7 +845,7 @@ Run the following example from an [older account](https://platform.claude.com/do List messages = []; for (var turnIndex = 0; turnIndex < userTurns.Length; turnIndex++) { - messages.Add(new() { Role = Role.User, Content = userTurns[turnIndex] }); + messages.Add(new BetaUserMessageParam { Content = userTurns[turnIndex] }); var response = await client.Beta.Messages.Create( new() { @@ -861,9 +858,8 @@ Run the following example from an [older account](https://platform.claude.com/do Betas = [AnthropicBeta.ThinkingBindingControls2026_08_01], } ); - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); var thinkingBlocks = response.Content.Count(block => block.TryPickThinking(out _)); @@ -1019,7 +1015,7 @@ Run the following example from an [older account](https://platform.claude.com/do # Only the last request adds a system prompt, which changes the prefix on purpose system_param = (turn_index == user_turns.length - 1) ? {system_: "Answer briefly."} : {} response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16_000, thinking: {type: "adaptive"}, messages: messages, @@ -1042,9 +1038,9 @@ thinking blocks: 1, flagged: 0 thinking blocks: 1, flagged: 2 ``` -The third response flags every thinking block from the earlier turns, one per turn in this run, because the new system prompt comes before all of them. The model still read them. +The third response flags every thinking block from the earlier turns, one for each turn in this run, because the new system prompt comes before all of them. The model still read them. -Handle these entries as you would `prefix_binding_mismatch` drops. The edit is before the first block listed: diff `system`, `tools`, and `messages` up to that block's `path` against the previous request to find it, then replace it with the matching pattern in [Make changes without editing the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits). On a new account, or on any request that sets `prefix_mismatch_behavior`, the API instead rejects the request or drops the failing blocks. The entries are a lower bound on what enforcement would remove: with `"drop_block"`, a failing block also takes the rest of that turn's thinking blocks with it, and removing one block can make the next one fail too. When the API only records the check, it judges each block on its own and lists a block only if that block fails. +Handle these entries as you would `prefix_binding_mismatch` drops. The edit is before the first block listed: diff `system`, `tools`, and `messages` up to that block's `path` against the previous request to find it, then replace it with the matching pattern in [Make changes without editing the prefix](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits). On a new account, or on any request that sets `prefix_mismatch_behavior`, the API instead rejects the request or drops the failing blocks. The entries are a lower bound on what enforcement would remove: with `"drop_block"`, a failing block also takes the rest of that turn's thinking blocks with it, and removing one block can make the next one fail too. When the API only records the check, it evaluates each block on its own and lists a block only if that block fails. ## Make changes without editing the prefix @@ -1161,7 +1157,7 @@ A common prefix edit is the per-turn nudge: a line such as "request independent ] ``` -A user message that contains only `tool_result` blocks counts as the "next user message", so `messages[3]` is already cleared. It adds nothing to what the model sees and costs no input tokens, but because it's still in the array, the thinking in `messages[4]` stays valid. `messages[6]` is the copy the model sees this turn. On later requests, keep both where they are and append a fresh copy after the next `tool_result` message. +A user message that contains only `tool_result` blocks counts as the "next user message," so `messages[3]` is already cleared. It adds nothing to what the model receives and costs no input tokens, but because it's still in the array, the thinking in `messages[4]` stays valid. `messages[6]` is the copy the model receives this turn. On later requests, keep both where they are and append a fresh copy after the next `tool_result` message. ### Add or remove tools with `tool_addition` and `tool_removal` @@ -1169,8 +1165,8 @@ Editing the `tools` array mid-session invalidates preserved thinking blocks. Lea You have two ways to use these blocks: -* **Declare every tool up front.** Put every tool the session might need in `tools` on the first request, with `defer_loading: true` on any the model shouldn't see yet. Then turn tools on and off with `tool_addition` and `tool_removal` blocks that name them. -* **Start with a snapshot and add tools as you go.** Put the tools you know about in `tools` on the first request. When a new tool comes along, define it inside a `tool_addition` block instead of editing `tools`. +* **Declare every tool up front.** Put every tool the session might need in `tools` on the first request, with `defer_loading: true` on any that shouldn't be offered to the model yet. Then turn tools on and off with `tool_addition` and `tool_removal` blocks that name them. +* **Start with a snapshot and add tools as you go.** Put the tools you know about in `tools` on the first request. When you learn about another tool, define it inside a `tool_addition` block instead of editing `tools`. Either way, `tools` never changes, so earlier thinking stays valid and the prompt cache still hits, with the one exception noted later in this section. @@ -1246,7 +1242,7 @@ When the new level takes effect depends on where you put the message. Directly a Another common prefix edit is client-side trimming: dropping or summarizing the oldest turns and keeping the recent ones verbatim. The kept turns' thinking blocks were produced while the removed history was still in place, so they fail the check. The server-side equivalents don't count as edits, because the check compares the conversation as you sent it: * [On-demand compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand) (beta) returns the summary from a separate request, which can [run in the background](https://platform.claude.com/docs/en/build-with-claude/compaction-background), and you send the returned block in place of the messages it summarizes. The check accepts that swap, so the turns you keep can stay valid with their thinking, under the [conditions for kept thinking](https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks#conditions-for-kept-thinking-to-stay-valid). [Request a summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#request-a-summary) shows the request and names the beta header it needs. -* [Compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) summarizes older turns into a compaction block when the context approaches a threshold you set, and the checked prefix restarts from that block. Its [`instructions` parameter](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#custom-summarization-instructions) takes your own summarization prompt, such as "preserve every ticker, position size, and stated assumption". +* [Compaction at a token threshold](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) summarizes older turns into a compaction block when the context approaches a threshold you set, and the checked prefix restarts from that block. Its [`instructions` parameter](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#custom-summarization-instructions) takes your own summarization prompt, such as "preserve every ticker, position size, and stated assumption." * [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) clears old tool results or old thinking blocks by rule, oldest first. The strategies are `clear_tool_uses_20250919` and `clear_thinking_20251015`. ### Compact on the client @@ -1258,7 +1254,7 @@ You can still compact on the client. If you write the summary yourself, don't se When the conversation grows too long, summarize the whole session into one user message and send only that message plus the next instruction. Nothing earlier is replayed, so there's no thinking left to fail the check, and the model reasons afresh from the summary. - ![Simple compaction: request 4 sends the full history with thinking on each assistant turn; request 5 sends one user message holding a summary of turns 1 to 4 plus the next instruction, so no earlier thinking is sent and nothing is checked](https://platform.claude.com/docs/images/preserved-thinking-simple-compaction.svg) + ![Simple compaction: request 4 sends the full history with thinking; request 5 sends one summary message, so nothing is checked](https://platform.claude.com/docs/images/preserved-thinking-simple-compaction.svg) ```json @@ -1270,18 +1266,18 @@ When the conversation grows too long, summarize the whole session into one user ] ``` -Claude models are trained on long-horizon tasks with this scheme and for most workloads it performs well. +Claude models are trained on long-horizon tasks with this scheme, and for most workloads it performs well. #### Keep-tail compaction -Keep-tail compaction summarizes the older turns and keeps the most recent turns verbatim, so the model still sees the last few exchanges word for word. If you write the summary yourself, it breaks the rule: the kept assistant turns still carry thinking blocks that were produced when the original turns, not the summary, came before them. Those blocks fail. +Keep-tail compaction summarizes the older turns and keeps the most recent turns verbatim, so the model still receives the last few exchanges word for word. If you write the summary yourself, it breaks the rule: the kept assistant turns still carry thinking blocks that were produced when the original turns, not the summary, came before them. Those blocks fail. To keep that thinking, have the API write the summary with on-demand compaction. [Compaction that keeps recent turns](https://platform.claude.com/docs/en/build-with-claude/compaction-keep-recent-turns) shows how, and [Conditions for kept thinking to stay valid](https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks#conditions-for-kept-thinking-to-stay-valid) lists when the kept thinking stays valid. The rest of this section covers a summary you write yourself. - ![Keep-tail compaction: the history is replaced by a summary of turns 1 and 2 followed by turns 3 to 5 verbatim; the thinking on assistant turns 3 and 4 was produced after the original turns, not the summary, so it fails; the same request sent with prefix\_mismatch\_behavior drop\_block succeeds, the API drops those two blocks and lists them in input\_transformations](https://platform.claude.com/docs/images/preserved-thinking-keep-tail-compaction.svg) + ![Keep-tail compaction: thinking on kept turns 3 and 4 fails; with drop\_block, the API drops it and the request succeeds](https://platform.claude.com/docs/images/preserved-thinking-keep-tail-compaction.svg) Fix: keep the turns exactly as they are and send `prefix_mismatch_behavior: "drop_block"`. The API drops the stale thinking blocks, the model reads the kept turns' `text` and `tool_use` blocks, and the request succeeds. @@ -1477,7 +1473,7 @@ Pass the compacted history as `messages` and set `block_binding` on the `thinkin ``` -The response carries the new assistant turn as usual, plus one `input_transformations` entry per dropped block. For the history in the diagram, that's the thinking on assistant turns 3 and 4: +The response carries the new assistant turn as usual, plus one `input_transformations` entry for each dropped block. For the history in the diagram, that's the thinking on assistant turns 3 and 4: ```json { @@ -1507,7 +1503,7 @@ A summary you build yourself breaks the rule the same way keep-tail does, with a #### Patterns that don't work with preserved thinking * **Cutting turns out of the middle.** Removing individual turns invalidates every thinking block after them, and no compaction scheme avoids that. If you were cutting a turn to change an instruction, append a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions) instead. To remove old tool results or old thinking selectively, use server-side [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing). -* **Compacting in the middle of a tool round.** Don't compact between an assistant turn's `tool_use` and the `tool_result` that answers it. Send that assistant turn back with its thinking intact so the model finishes the round with its reasoning. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). +* **Compacting in the middle of a tool round.** Don't compact between an assistant turn's `tool_use` and the `tool_result` that answers it. Send that assistant turn back with its thinking intact so the model completes the round with its reasoning. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). ### Reference files by ID, not by a URL whose content changes @@ -1572,7 +1568,7 @@ A library, proxy, or gateway sits between someone else's history and the API, so - Diagnose and fix the most common thinking failures: configuration 400 errors, empty or missing thinking blocks, max\_tokens stops, and cache misses. + Diagnose and fix the most common thinking failures: configuration 400 errors, empty or missing thinking blocks, `max_tokens` stops, and cache misses. diff --git a/content/en/build-with-claude/prompt-caching.md b/content/en/build-with-claude/prompt-caching.md index b96c00a656..8bd8e5031a 100644 --- a/content/en/build-with-claude/prompt-caching.md +++ b/content/en/build-with-claude/prompt-caching.md @@ -12,8 +12,8 @@ Prompt caching optimizes your API usage by allowing resuming from specific prefi There are two ways to enable prompt caching: -* **[Automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching)**: Add a single `cache_control` field at the top level of your request. The system automatically applies the cache breakpoint to the last cacheable block and moves it forward as conversations grow. Best for multi-turn conversations where the growing message history should be cached automatically. -* **[Explicit cache breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints)**: Place `cache_control` directly on individual content blocks for fine-grained control over exactly what gets cached. +* **[Automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching):** Add a single `cache_control` field at the top level of your request. The system automatically applies the cache breakpoint to the last cacheable block and moves it forward as conversations grow. Best for multi-turn conversations where the growing message history should be cached automatically. +* **[Explicit cache breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints):** Place `cache_control` directly on individual content blocks for fine-grained control over exactly what gets cached. The simplest way to start is with automatic caching: @@ -100,11 +100,7 @@ The simplest way to start is with automatic caching: System = "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.", Messages = [ - new() - { - Role = Role.User, - Content = "Analyze the major themes in 'Pride and Prejudice'." - } + new UserMessageParam { Content = "Analyze the major themes in 'Pride and Prejudice'." } ] }; @@ -200,7 +196,7 @@ When you send a request with prompt caching enabled: 1. The system checks if a prompt prefix, up to a specified cache breakpoint, is already cached from a recent query. 2. If found, it uses the cached version, reducing processing time and costs. -3. Otherwise, it processes the full prompt and caches the prefix once the response begins. +3. Otherwise, it processes the full prompt and caches the prefix once the response starts. This is especially useful for: @@ -264,11 +260,11 @@ Prompt caching introduces a new pricing structure. The following table shows the The previous table reflects the following pricing multipliers for prompt caching: - * 5-minute cache write tokens are 1.25 times the base input tokens price - * 1-hour cache write tokens are 2 times the base input tokens price - * Cache read tokens are 0.1 times the base input tokens price (see the table footnote for per-model exceptions) + * Cache write tokens with a 5-minute TTL are 1.25 times the base input tokens price. + * Cache write tokens with a 1-hour TTL are 2 times the base input tokens price. + * Cache read tokens are 0.1 times the base input tokens price (see the table footnote for per-model exceptions). - These multipliers stack with other pricing modifiers such as the Batch API discount, [long context pricing](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing), and data residency. On a model priced by prompt length, cache reads and cache writes count toward a request's prompt length. See [pricing](https://platform.claude.com/docs/en/about-claude/pricing) for full details. + These multipliers stack with other pricing modifiers such as the Batch API discount, [long context pricing](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing), and data residency. On a model priced by prompt length, cache reads and cache writes count toward a request's prompt length. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing) for full details. *** @@ -370,21 +366,12 @@ Automatic caching is the simplest way to enable prompt caching. Instead of placi System = "You are a helpful assistant that remembers our conversation.", Messages = [ - new() + new UserMessageParam { Content = "My name is Alex. I work on machine learning." }, + new AssistantMessageParam { - Role = Role.User, - Content = "My name is Alex. I work on machine learning." - }, - new() - { - Role = Role.Assistant, Content = "Nice to meet you, Alex! How can I help with your ML work today?" }, - new() - { - Role = Role.User, - Content = "What did I say I work on?" - } + new UserMessageParam { Content = "What did I say I work on?" } ] }; @@ -546,22 +533,22 @@ Cache prefixes are created in the following order: `tools`, `system`, then `mess #### How automatic prefix checking works -You can use just one cache breakpoint at the end of your static content, and the system will automatically find the longest prefix that a prior request already wrote to the cache. Understanding how this works helps you optimize your caching strategy. +You can use just one cache breakpoint at the end of your static content, and the system automatically finds the longest prefix that a prior request already wrote to the cache. Understanding how this works helps you optimize your caching strategy. **Three core principles:** -1. **Cache writes happen only at your breakpoint.** Marking a block with `cache_control` writes exactly one cache entry: a hash of the prefix ending at that block. The system does not write entries for any earlier position. Because the hash is cumulative, covering everything up to and including the breakpoint, changing any block at or before the breakpoint produces a different hash on the next request. +1. **Cache writes occur only at your breakpoint.** Marking a block with `cache_control` writes exactly one cache entry: a hash of the prefix ending at that block. The system does not write entries for any earlier position. Because the hash is cumulative, covering everything up to and including the breakpoint, changing any block at or before the breakpoint produces a different hash on the next request. 2. **Cache reads look backward for entries that prior requests wrote.** On each request the system computes the prefix hash at your breakpoint and checks for a matching cache entry. If none exists, it walks backward one block at a time, checking whether the prefix hash at each earlier position matches something already in the cache. It is looking for prior writes, not for stable content. -3. **The lookback window is 20 blocks.** The system checks at most 20 positions per breakpoint, counting the breakpoint itself as the first. If the system finds no matching entry in that window, checking stops (or resumes from the next explicit breakpoint, if any). On the Claude API, a run of consecutive `tool_use` blocks counts as one position, and so does a run of consecutive `tool_result` blocks, so a turn with many parallel tool calls doesn't push the previous request's entry out of the window on its own. +3. **The lookback window is 20 blocks.** The system checks at most 20 positions for each breakpoint, counting the breakpoint itself as the first. If the system finds no matching entry in that window, checking stops (or resumes from the next explicit breakpoint, if any). On the Claude API, a run of consecutive `tool_use` blocks counts as one position, and so does a run of consecutive `tool_result` blocks, so a turn with many parallel tool calls doesn't push the previous request's entry out of the window on its own. **Example: Lookback in a growing conversation** You append new blocks each turn and set `cache_control` on the final block of each request: * **Turn 1:** 10 blocks, breakpoint on block 10. No prior cache entries exist. The system writes an entry at block 10. -* **Turn 2:** 15 blocks, breakpoint on block 15. Block 15 has no entry, so the system walks back to block 10 and finds the turn-1 entry. Cache hit at block 10; the system processes only blocks 11 through 15 fresh and writes a new entry at block 15. +* **Turn 2:** 15 blocks, breakpoint on block 15. Block 15 has no entry, so the system walks back to block 10 and finds the turn-1 entry. Cache hit at block 10. The system processes only blocks 11 through 15 fresh and writes a new entry at block 15. * **Turn 3:** 35 blocks, breakpoint on block 35. The system checks 20 positions (blocks 35 through 16) and finds nothing. The turn-2 entry at block 15 is one position outside the window, so there is no cache hit. Adding a second breakpoint at block 15 starts a second lookback window there, which finds the turn-2 entry. **Common mistake: Breakpoint on content that changes every request** @@ -571,7 +558,7 @@ Your prompt has a large static system context (blocks 1 through 5) followed by a * **Request 1:** Cache write at block 6. The hash includes the timestamp. * **Request 2:** The timestamp differs, so the prefix hash at block 6 differs. The lookback walks through blocks 5, 4, 3, 2, and 1, but the system never wrote an entry at any of those positions. No cache hit. You pay for a fresh cache write on every request and never get a read. -The lookback does not find stable content behind your breakpoint and cache it. It finds entries that prior requests already wrote, and writes happen only at breakpoints. Move `cache_control` to block 5, the last block that stays the same across requests, and every subsequent request reads the cached prefix. [Automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) hits the same trap: it places the breakpoint on the last cacheable block, which in this structure is the one that changes every request, so use an explicit breakpoint on block 5 instead. +The lookback does not find stable content behind your breakpoint and cache it. It finds entries that prior requests already wrote, and writes occur only at breakpoints. Move `cache_control` to block 5, the last block that stays the same across requests, and every subsequent request reads the cached prefix. [Automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) has the same problem: it places the breakpoint on the last cacheable block, which in this structure is the one that changes every request, so use an explicit breakpoint on block 5 instead. **Key takeaway:** Place `cache_control` on the last block whose prefix is identical across the requests you want to share a cache. In a growing conversation the final block works as long as each turn adds fewer than 20 blocks: earlier content never changes, so the next request's lookback finds the prior write. For a prompt with a varying suffix (timestamps, per-request context, the incoming message), place the breakpoint at the end of the static prefix, not on the varying block. @@ -614,7 +601,7 @@ On the Claude API, [Claude Platform on AWS](https://platform.claude.com/docs/en/ These minimums apply on every platform where each model is available. -Shorter prompts cannot be cached, even if marked with `cache_control`. Any requests to cache fewer than this number of tokens will be processed without caching, and no error is returned. To verify whether a prompt was cached, check the [response usage fields](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#tracking-cache-performance): if both `cache_creation_input_tokens` and `cache_read_input_tokens` are 0, the prompt was not cached (likely because it did not meet the minimum length requirement). +Shorter prompts cannot be cached, even if marked with `cache_control`. Any requests to cache fewer than this number of tokens are processed without caching, and no error is returned. To verify whether a prompt was cached, check the [response usage fields](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#tracking-cache-performance): if both `cache_creation_input_tokens` and `cache_read_input_tokens` are 0, the prompt was not cached (likely because it did not meet the minimum length requirement). If your prompt falls just short of the minimum for your model and platform, expanding the cached content to reach the threshold is often worthwhile. Cache reads cost significantly less than uncached input tokens, so reaching the minimum can reduce costs for frequently reused prompts. @@ -622,7 +609,7 @@ If your prompt falls just short of the minimum for your model and platform, expa [Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock) is an AWS-operated platform. On Bedrock, see the [Bedrock prompt caching documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html) for the per-model minimums, failure behavior, and usage-field names that apply. -For concurrent requests, note that a cache entry only becomes available after the first response begins. If you need cache hits for parallel requests, wait for the first response before sending subsequent requests. +For concurrent requests, note that a cache entry only becomes available after the first response starts. If you need cache hits for parallel requests, wait for the first response before sending subsequent requests. Currently, "ephemeral" is the only supported cache type, which by default has a 5-minute lifetime. @@ -633,20 +620,20 @@ Most blocks in the request can be cached. This includes: * Tools: Tool definitions in the `tools` array * System messages: Content blocks in the `system` array * Text messages: Content blocks in the `messages.content` array, for both user and assistant turns -* Images & Documents: Content blocks in the `messages.content` array, in user turns +* Images and documents: Content blocks in the `messages.content` array, in user turns * Tool use and tool results: Content blocks in the `messages.content` array, in both user and assistant turns Each of these elements can be cached, either automatically or by marking them with `cache_control`. ### What cannot be cached -While most request blocks can be cached, there are some exceptions: +Although most request blocks can be cached, there are some exceptions: * Thinking blocks cannot be cached directly with `cache_control`. However, thinking blocks CAN be cached alongside other content when they appear in previous assistant turns. When cached this way, they DO count as input tokens when read from cache. -* Sub-content blocks (like [citations](https://platform.claude.com/docs/en/build-with-claude/citations)) themselves cannot be cached directly. Instead, cache the top-level block. +* Sub-content blocks (such as [citations](https://platform.claude.com/docs/en/build-with-claude/citations)) themselves cannot be cached directly. Instead, cache the top-level block. - In the case of citations, the top-level document content blocks that serve as the source material for citations can be cached. This allows you to use prompt caching with citations effectively by caching the documents that citations will reference. + In the case of citations, the top-level document content blocks that serve as the source material for citations can be cached. This allows you to use prompt caching with citations effectively by caching the documents that citations reference. * Empty text blocks cannot be cached. @@ -656,7 +643,7 @@ Modifications to cached content can invalidate some or all of the cache. As described in [Structuring your prompt](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#structuring-your-prompt), the cache follows the hierarchy: `tools` → `system` → `messages`. Changes at each level invalidate that level and all subsequent levels. -The following table shows which parts of the cache are invalidated by different types of changes. ✘ indicates that the cache is invalidated, while ✓ indicates that the cache remains valid. +The following table shows which parts of the cache are invalidated by different types of changes. ✘ indicates that the cache is invalidated, whereas ✓ indicates that the cache remains valid. | What changes | Tools cache | System cache | Messages cache | Impact | | ----------------------------------------------------- | -------------- | -------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -664,12 +651,12 @@ The following table shows which parts of the cache are invalidated by different | **Web search toggle** | ✓ | ✘ | ✘ | Enabling/disabling web search modifies the system prompt | | **Citations toggle** | ✓ | ✘ | ✘ | Enabling/disabling citations modifies the system prompt | | **Speed setting** | ✓ | ✘ | ✘ | Switching between [`speed: "fast"` and standard speed](https://platform.claude.com/docs/en/build-with-claude/fast-mode) invalidates system and message caches | -| **Tool choice** | ✓ | ✓ | ✘ | Changes to `tool_choice` parameter only affect message blocks | +| **Tool choice** | ✓ | ✓ | ✘ | Changes to the `tool_choice` parameter only affect message blocks | | **Images** | ✓ | ✓ | ✘ | Adding/removing images anywhere in the prompt affects message blocks | | **Thinking parameters** | Model-specific | Model-specific | ✘ | The thinking configuration (mode, and `budget_tokens` in extended mode) is rendered into the prompt, so changing it always invalidates message blocks; tool and system caches are also invalidated on models that render the configuration ahead of them. See [Thinking and prompt caching](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-prompt-caching). | | **Effort setting** | Model-specific | Model-specific | ✘ | Changing the [`output_config.effort`](https://platform.claude.com/docs/en/build-with-claude/effort) value always invalidates message blocks, with the same model-specific effect on tool and system caches as thinking parameters. Setting effort explicitly to the model's default is equivalent to omitting it and does not invalidate. On models that support [per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta), an effort change carried in a `role: "system"` message inside `messages` leaves the cached prefix intact. | | **Non-tool results passed to requests with thinking** | ✓ | ✓ | Model-specific | On Opus 4.5+, Sonnet 4.6+, and Haiku 5.5, thinking blocks are preserved by default, so the cache remains valid (✓). On earlier Opus/Sonnet models and Haiku models through Claude Haiku 4.5, all previously-cached thinking blocks are stripped from context, and any messages that follow those thinking blocks are removed from the cache (✘). For more details, see [Caching with thinking blocks](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#caching-with-thinking-blocks). | -| **Dropped thinking blocks** | ✓ | ✓ | ✘ | When the API drops a Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, or Claude Haiku 5.5 thinking block that isn't [preserved](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking) on that request (for example, one you replay to a model that can't read it), the cached prefix changes from that block's position onward on that request. Blocks the receiving model can read, passed back unchanged, keep the cache intact. | +| **Dropped thinking blocks** | ✓ | ✓ | ✘ | When the API drops a Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, or Claude Haiku 5.5 thinking block that isn't [preserved](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking) on that request, the cached prefix changes from that block's position onward on that request. Blocks the receiving model can read, passed back unchanged, keep the cache intact. | On models that support [mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes), the `inline-tools-2026-09-15` beta header lets you add a tool, or change a tool's definition, partway through a conversation without editing `tools`. Send the definition in a `tool_addition` block in a mid-conversation system message and leave `tools` exactly as you first sent it. The cached prefix still matches, so only the appended message is processed as new input. The one exception is a `tools` array with no non-deferred tool, where the first tool defined this way costs one full cache miss on that request. See [Define tools in a message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#define-tools-in-a-message-beta). @@ -681,9 +668,9 @@ On models that support [mid-conversation tool changes](https://platform.claude.c Monitor cache performance using these API response fields, within `usage` in the response (or `message_start` event if [streaming](https://platform.claude.com/docs/en/build-with-claude/streaming)): -* `cache_creation_input_tokens`: Number of tokens written to the cache when creating a new entry. -* `cache_read_input_tokens`: Number of tokens retrieved from the cache for this request. -* `input_tokens`: Number of input tokens which were not read from or used to create a cache (that is, tokens after the last cache breakpoint). +* `cache_creation_input_tokens`: Number of tokens written to the cache when creating a new entry +* `cache_read_input_tokens`: Number of tokens retrieved from the cache for this request +* `input_tokens`: Number of input tokens that were not read from or used to create a cache (that is, tokens after the last cache breakpoint) **Understanding the token breakdown** @@ -716,16 +703,16 @@ Monitor cache performance using these API response fields, within `usage` in the When using [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) with prompt caching, thinking blocks have special behavior: -**Automatic caching alongside other content:** While thinking blocks cannot be explicitly marked with `cache_control`, they get cached as part of the request content when you make subsequent API calls with tool results. This commonly happens during tool use when you pass thinking blocks back to continue the conversation. +**Automatic caching alongside other content:** Although thinking blocks cannot be explicitly marked with `cache_control`, they get cached as part of the request content when you make subsequent API calls with tool results. This commonly occurs during tool use when you pass thinking blocks back to continue the conversation. **Input token counting:** When thinking blocks are read from cache, they count as input tokens in your usage metrics. This is important for cost calculation and token budgeting. **Cache invalidation patterns:** -* Cache remains valid when only tool results are provided as user messages -* On Opus 4.5+, Sonnet 4.6+, and Haiku 5.5, thinking blocks are preserved by default even when non-tool-result user content is added, so the cache remains valid -* On earlier Opus/Sonnet models and Haiku models through Claude Haiku 4.5, cache gets invalidated when non-tool-result user content is added, causing all previous thinking blocks to be stripped from context -* This caching behavior occurs even without explicit `cache_control` markers +* Cache remains valid when only tool results are provided as user messages. +* On Opus 4.5+, Sonnet 4.6+, and Haiku 5.5, thinking blocks are preserved by default even when non-tool-result user content is added, so the cache remains valid. +* On earlier Opus/Sonnet models and Haiku models through Claude Haiku 4.5, cache gets invalidated when non-tool-result user content is added, causing all previous thinking blocks to be stripped from context. +* This caching behavior occurs even without explicit `cache_control` markers. For more details on cache invalidation, see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache). @@ -764,7 +751,7 @@ For more detailed information, see [Thinking and prompt caching](https://platfor * **Organization and workspace isolation:** Caches are isolated between organizations. Different organizations never share caches, even if they use identical prompts. Caches are also isolated per workspace within an organization on the Claude API, Claude Platform on AWS, and Microsoft Foundry; Bedrock and Google Cloud use organization-level isolation only. -* **Exact matching:** Cache hits require 100% identical prompt segments, including all text and images up to and including the block marked with cache control. +* **Exact matching:** Cache hits require 100 percent identical prompt segments, including all text and images up to and including the block marked with cache control. * **Output token generation:** Prompt caching has no effect on output token generation. The response you receive is identical to what you would get if prompt caching were not used. @@ -774,7 +761,7 @@ To optimize prompt caching performance: * Start with [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) for multi-turn conversations. It handles breakpoint management automatically. * Use [explicit block-level breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints) when you need to cache different sections with different change frequencies. -* Cache stable, reusable content like system instructions, background information, large contexts, or frequent tool definitions. +* Cache stable, reusable content such as system instructions, background information, large contexts, or frequent tool definitions. * Place cached content at the prompt's beginning for best performance. * Use cache breakpoints strategically to separate different cacheable prefix sections. * Place the breakpoint on the last block that stays identical across requests. For a prompt with a static prefix and a varying suffix (timestamps, per-request context, the incoming message), that is the end of the prefix, not the varying block. @@ -785,11 +772,11 @@ To optimize prompt caching performance: Tailor your prompt caching strategy to your scenario: * Conversational agents: Reduce cost and latency for extended conversations, especially those with long instructions or uploaded documents. -* Coding assistants: Improve autocomplete and code base Q\&A by keeping relevant sections or a summarized version of the code base in the prompt. +* Coding assistants: Improve auto-complete and code base Q\&A by keeping relevant sections or a summarized version of the code base in the prompt. * Large document processing: Incorporate complete long-form material including images in your prompt without increasing response latency. -* Detailed instruction sets: Share extensive lists of instructions, procedures, and examples to fine-tune Claude's responses. Developers often include an example or two in the prompt, but with prompt caching you can get even better performance by including 20+ diverse examples of high quality answers. +* Detailed instruction sets: Share extensive lists of instructions, procedures, and examples to fine-tune Claude's responses. Developers often include an example or two in the prompt, but with prompt caching you can get even better performance by including 20+ diverse examples of high-quality answers. * Agentic tool use: Enhance performance for scenarios involving multiple tool calls and iterative code changes, where each step typically requires a new API call. -* Talk to books, papers, documentation, podcast transcripts, and other longform content: Bring any knowledge base alive by embedding the entire document(s) into the prompt, and letting users ask it questions. +* Books, papers, documentation, podcast transcripts, and other long-form content: Make any knowledge base interactive by embedding the entire document(s) into the prompt, and letting users ask it questions. ### Troubleshooting common issues @@ -799,16 +786,16 @@ If experiencing unexpected behavior: [Cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) has the API compare consecutive requests and report where the prompt prefix diverged, which automatically handles many of the steps in this list. -* Ensure cached sections are identical across calls. For explicit breakpoints, verify that `cache_control` markers are in the same locations -* Check that calls are made within the cache lifetime (5 minutes by default) -* Verify that `tool_choice`, image usage, the thinking configuration, and `output_config.effort` remain consistent between calls -* Validate that you are caching at least the minimum number of tokens for your model and platform (see [Cache limitations](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations)) -* Confirm your breakpoint is on a block that stays identical across requests. Cache writes happen only at the breakpoint, and if that block changes (timestamps, per-request context, the incoming message), the prefix hash never matches. The lookback does not find stable content behind the breakpoint; it only finds entries that earlier requests wrote at their own breakpoints -* Verify that the keys in your `tool_use` content blocks have stable ordering as some languages (for example, Swift, Go) randomize key order during JSON conversion, breaking caches -* Use [cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) to have the API compare consecutive requests and report which part of the prompt diverged +* Ensure cached sections are identical across calls. For explicit breakpoints, verify that `cache_control` markers are in the same locations. +* Check that calls are made within the cache lifetime (5 minutes by default). +* Verify that `tool_choice`, image usage, the thinking configuration, and `output_config.effort` remain consistent between calls. +* Validate that you are caching at least the minimum number of tokens for your model and platform (see [Cache limitations](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations)). +* Confirm your breakpoint is on a block that stays identical across requests. Cache writes occur only at the breakpoint, and if that block changes (timestamps, per-request context, the incoming message), the prefix hash never matches. The lookback does not find stable content behind the breakpoint; it only finds entries that earlier requests wrote at their own breakpoints. +* Verify that the keys in your `tool_use` content blocks have stable ordering as some languages (for example, Swift, Go) randomize key order during JSON conversion, breaking caches. +* Use [cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) to have the API compare consecutive requests and report which part of the prompt diverged. - Changes to `tool_choice` or the presence/absence of images anywhere in the prompt will invalidate the cache, requiring a new cache entry to be created. For more details on cache invalidation, see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache). + Changes to `tool_choice` or the presence/absence of images anywhere in the prompt invalidate the cache, requiring a new cache entry to be created. For more details on cache invalidation, see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache). *** @@ -850,7 +837,7 @@ The response includes detailed cache information like the following: Note that the current `cache_creation_input_tokens` field equals the sum of the values in the `cache_creation` object. -If you see `ephemeral_5m_input_tokens` writes you didn't request while using server tools such as web search, see [Tool use with prompt caching](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-use-with-prompt-caching#server-tool-results-are-cached-automatically). +If you see `ephemeral_5m_input_tokens` writes you didn't request while using server tools such as web search, see [Server tool results are cached automatically](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-use-with-prompt-caching#server-tool-results-are-cached-automatically). ### When to use the 1-hour cache @@ -858,12 +845,12 @@ If you have prompts that are used at a regular cadence (that is, system prompts The 1-hour cache is best used in the following scenarios: -* When you have prompts that are likely used less frequently than 5 minutes, but more frequently than every hour. For example, when an agentic side-agent will take longer than 5 minutes, or when storing a long chat conversation with a user and you generally expect that user may not respond in the next 5 minutes. -* When latency is important and your follow-up prompts may be sent beyond 5 minutes. +* When you have prompts that are likely used less frequently than every 5 minutes, but more frequently than every hour. For example, when an agentic side-agent will take longer than 5 minutes, or when storing a long chat conversation with a user and you generally expect that user might not respond in the next 5 minutes. +* When latency is important and your follow-up prompts might be sent beyond 5 minutes. * When you want to improve your rate limit utilization, because cache hits are not deducted against your rate limit. - The 5-minute and 1-hour cache behave the same with respect to latency. You will generally see improved time-to-first-token for long documents. + The 5-minute and 1-hour cache behave the same with respect to latency. You generally see improved time-to-first-token for long documents. ### Mixing different TTLs @@ -880,7 +867,7 @@ When mixing TTLs, the API determines three billing locations in your prompt: If `B` or `C` is larger than `A`, it is necessarily a cache miss, because `A` is the highest cache hit. -You'll be charged for: +You are charged for: 1. Cache read tokens for `A`. 2. 1-hour cache write tokens for `(B - A)`. @@ -889,7 +876,7 @@ You'll be charged for: Here are three examples. This depicts the input tokens of 3 requests, each of which has different cache hits and cache misses. Each has a different calculated pricing, shown in the colored boxes, as a result. - ![Three requests with different cache hits and misses: A, B, and C mark where cache reads, 1-hour writes, and 5-minute writes end](https://platform.claude.com/docs/images/prompt-cache-mixed-ttl.svg) + ![Three requests with different cache hits and misses: A, B, and C mark where reads, 1-hour writes, and 5-minute writes end](https://platform.claude.com/docs/images/prompt-cache-mixed-ttl.svg) *** @@ -902,7 +889,7 @@ Cache pre-warming lets you load your system prompt or tool definitions into the Set `max_tokens: 0` in your request. The API reads your prompt into the model and writes the cache at any `cache_control` breakpoint, then returns immediately without generating any output. The response has an empty `content` array, `stop_reason: "max_tokens"`, and a fully populated `usage` block. -Place the `cache_control` breakpoint on the last block that is shared with the follow-up request (typically your system prompt or tool definitions), not on the placeholder user message. Otherwise the cache entry is keyed to the placeholder and the follow-up request won't hit it. Use the same thinking configuration and `output_config.effort` as your follow-up requests too: those values are rendered into the prompt (see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache)), so a pre-warm with a different configuration can write an entry your real traffic never hits. This means using an [explicit cache breakpoint](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints) rather than [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching), since automatic caching places the breakpoint on the last block, which here is the placeholder. The placeholder user message can be any string with non-whitespace content (the examples here use `"warmup"`); its content is read into the model but never answered. +Place the `cache_control` breakpoint on the last block that is shared with the follow-up request (typically your system prompt or tool definitions), not on the placeholder user message. Otherwise the cache entry is keyed to the placeholder and the follow-up request won't hit it. Use the same thinking configuration and `output_config.effort` as your follow-up requests too: those values are rendered into the prompt (see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache)), so a pre-warm with a different configuration can write an entry your real traffic never hits. This means using an [explicit cache breakpoint](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints) rather than [automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching), because automatic caching places the breakpoint on the last block, which here is the placeholder. The placeholder user message can be any string with non-whitespace content (the examples here use `"warmup"`); its content is read into the model but never answered. A pre-warm request incurs a **cache write** charge if the prefix is not already cached, the same as any other request. Check `usage.cache_creation_input_tokens` in the response to confirm a write occurred. Zero output tokens are billed. @@ -1004,7 +991,7 @@ Place the `cache_control` breakpoint on the last block that is shared with the f }, ] ), - Messages = [new() { Role = Role.User, Content = "warmup" }], + Messages = [new UserMessageParam { Content = "warmup" }], } ); @@ -1140,7 +1127,7 @@ The API returns an empty `content` array: ### Typical usage pattern -Fire a pre-warm request when your application starts (or on a scheduled interval), then send real user requests after the pre-warm completes: +Make a pre-warm request when your application starts (or on a scheduled interval), then send real user requests after the pre-warm completes: ```bash cURL @@ -1317,7 +1304,7 @@ Fire a pre-warm request when your application starts (or on a scheduled interval Model = Model.ClaudeOpus5_5, MaxTokens = 0, System = new(systemPrompt), - Messages = [new() { Role = Role.User, Content = "warmup" }], + Messages = [new UserMessageParam { Content = "warmup" }], } ); @@ -1329,7 +1316,7 @@ Fire a pre-warm request when your application starts (or on a scheduled interval Model = Model.ClaudeOpus5_5, MaxTokens = 1024, System = new(systemPrompt), - Messages = [new() { Role = Role.User, Content = userMessage }], + Messages = [new UserMessageParam { Content = userMessage }], } ); @@ -1526,7 +1513,7 @@ Keep in mind that the cache TTL still applies. For the default 5-minute cache, s ### Limitations -A `max_tokens: 0` request is rejected with an `invalid_request_error` if any of the following are set, since each implies output that a zero-token budget cannot produce: +A `max_tokens: 0` request is rejected with an `invalid_request_error` if any of the following are set, because each implies output that a zero-token budget cannot produce: * `stream: true` * [Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) (`thinking.type: "enabled"`) @@ -1543,7 +1530,7 @@ Before `max_tokens: 0` was available, some applications used `max_tokens: 1` war ## Prompt caching examples -To help you get started with prompt caching, the [prompt caching cookbook](https://platform.claude.com/cookbook/misc-prompt-caching) provides detailed examples and best practices. +To help you get started with prompt caching, the [prompt caching recipe](https://platform.claude.com/cookbook/misc-prompt-caching) in the Claude Cookbook provides detailed examples and best practices. The following code snippets showcase various prompt caching patterns. These examples demonstrate how to implement caching in different scenarios, helping you understand the practical applications of this feature: @@ -1675,9 +1662,8 @@ The following code snippets showcase various prompt caching patterns. These exam }), Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "What are the key terms and conditions in this agreement?" } ] @@ -2045,23 +2031,20 @@ The following code snippets showcase various prompt caching patterns. These exam }), Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam("Hello, can you tell me more about the solar system?")), - }), + }, }, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = "Certainly! The solar system is the collection of celestial bodies that orbit our Sun. It consists of eight planets, numerous moons, asteroids, comets, and other objects. The planets, in order from closest to farthest from the Sun, are: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Each planet has its own unique characteristics and features. Is there a specific aspect of the solar system you would like to know more about?" }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam("Good to know.")), new ContentBlockParam(new TextBlockParam() @@ -2069,7 +2052,7 @@ The following code snippets showcase various prompt caching patterns. These exam Text = "Tell me more about Mars.", CacheControl = new CacheControlEphemeral(), }), - }) + } } ] }; @@ -2137,7 +2120,7 @@ The following code snippets showcase various prompt caching patterns. These exam "Certainly! The solar system is the collection of celestial bodies that orbit our Sun. It consists of eight planets, numerous moons, asteroids, comets, and other objects. The planets, in order from closest to farthest from the Sun, are: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Each planet has its own unique characteristics and features. Is there a specific aspect of the solar system you would like to know more about?" ) // Second user message (with cache control) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofText(TextBlockParam.builder().text("Good to know.").build()), ContentBlockParam.ofText( @@ -2254,7 +2237,7 @@ The following code snippets showcase various prompt caching patterns. These exam When this is set up properly, you should see the following in the usage response of each request: - * `input_tokens`: Number of tokens in the new user message (will be minimal) + * `input_tokens`: Number of tokens in the new user message (minimal) * `cache_creation_input_tokens`: Number of tokens in the new assistant and user turns * `cache_read_input_tokens`: Number of tokens in the conversation up to the previous turn @@ -2697,11 +2680,10 @@ The following code snippets showcase various prompt caching patterns. These exam }), Messages = [ - new() { Role = Role.User, Content = "Can you search for information about Mars rovers?" }, - new() + new UserMessageParam { Content = "Can you search for information about Mars rovers?" }, + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolUseBlockParam() { @@ -2712,36 +2694,33 @@ The following code snippets showcase various prompt caching patterns. These exam ["query"] = JsonSerializer.SerializeToElement("Mars rovers"), }, }), - }), + }, }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = "tool_1", Content = "Found 3 relevant documents: Document 3 (Mars Exploration), Document 7 (Rover Technology), Document 9 (Mission History)", }), - }), + }, }, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = "I found 3 relevant documents about Mars rovers. Let me get more details from the Mars Exploration document.", }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { Text = "Yes, please tell me about the Perseverance rover specifically.", CacheControl = new CacheControlEphemeral(), }), - }), + }, }, ] }; @@ -2891,7 +2870,7 @@ The following code snippets showcase various prompt caching patterns. These exam ) // Conversation history .addUserMessage("Can you search for information about Mars rovers?") - .addAssistantMessageOfBlockParams( + .addAssistantMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolUse( ToolUseBlockParam.builder() @@ -2902,7 +2881,7 @@ The following code snippets showcase various prompt caching patterns. These exam ) ) ) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() @@ -2914,7 +2893,7 @@ The following code snippets showcase various prompt caching patterns. These exam ) ) ) - .addAssistantMessageOfBlockParams( + .addAssistantMessageOfContentBlockParams( List.of( ContentBlockParam.ofText( TextBlockParam.builder() @@ -2925,7 +2904,7 @@ The following code snippets showcase various prompt caching patterns. These exam ) ) ) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofText( TextBlockParam.builder() @@ -3155,10 +3134,10 @@ The following code snippets showcase various prompt caching patterns. These exam This approach provides maximum flexibility: - * If you append a new turn to the conversation without changing earlier content, all four cache segments are reused - * If you update the RAG documents but keep the same tools and instructions, the first two cache segments are reused - * If you change the conversation but keep the same tools, instructions, and documents, the first three segments are reused - * Changes at any breakpoint invalidate that segment and everything after it, while earlier cached segments remain valid + * If you append a new turn to the conversation without changing earlier content, all four cache segments are reused. + * If you update the RAG documents but keep the same tools and instructions, the first two cache segments are reused. + * If you change the conversation but keep the same tools, instructions, and documents, the first three segments are reused. + * Changes at any breakpoint invalidate that segment and everything after it, whereas earlier cached segments remain valid. For the first request: @@ -3195,7 +3174,7 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - **In most cases, a single cache breakpoint at the end of your static content is sufficient.** Cache writes happen only at the block you mark. Place it on the last block that stays identical across requests, and every subsequent request reads that same entry. If a later block varies per request (a timestamp, the incoming message), keep the breakpoint before it, on the last stable block. + **In most cases, a single cache breakpoint at the end of your static content is sufficient.** Cache writes occur only at the block you mark. Place it on the last block that stays identical across requests, and every subsequent request reads that same entry. If a later block varies with each request (a timestamp, the incoming message), keep the breakpoint before it, on the last stable block. You only need multiple breakpoints if: @@ -3209,7 +3188,7 @@ For ZDR eligibility across all features, see [API and data retention](https://pl No, cache breakpoints themselves are free. You only pay for: - * Writing content to cache (25% more than base input tokens for 5-minute TTL) + * Writing content to cache (25 percent more than base input tokens for 5-minute TTL) * Reading from cache (a fraction of the base input token price, see [Pricing](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing)) * Regular input tokens for uncached content @@ -3272,13 +3251,13 @@ For ZDR eligibility across all features, see [API and data retention](https://pl - Yes, prompt caching can be used alongside other API features like tool use and vision capabilities. However, changing whether there are images in a prompt or modifying tool use settings will break the cache. + Yes, prompt caching can be used alongside other API features such as tool use and vision capabilities. However, changing whether there are images in a prompt or modifying tool use settings breaks the cache. For more details on cache invalidation, see [What invalidates the cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache). - Prompt caching introduces a new pricing structure where 5-minute cache writes cost 25% more than base input tokens, 1-hour cache writes cost 2x base input tokens, and cache hits cost a fraction of the base input token price (see [Pricing](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing) for the per-model multiplier). + Prompt caching introduces a new pricing structure where 5-minute cache writes cost 25 percent more than base input tokens, 1-hour cache writes cost 2x base input tokens, and cache hits cost a fraction of the base input token price (see [Pricing](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing) for the per-model multiplier). @@ -3310,11 +3289,11 @@ For ZDR eligibility across all features, see [API and data retention](https://pl Yes, it is possible to use prompt caching with your [Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing) requests. However, because asynchronous batch requests can be processed concurrently and in any order, cache hits are provided on a best-effort basis. - The [1-hour cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration) can help improve your cache hits. The most cost effective way of using it is the following: + The [1-hour cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration) can help improve your cache hits. The most cost-effective way of using it is the following: * Gather a set of message requests that have a shared prefix. * Send a batch request with a single request that has this shared prefix and a 1-hour cache block. This writes the prefix to the 1-hour cache. - * As soon as this is complete, submit the rest of the requests. You will have to monitor the job to know when it completes. + * As soon as this is complete, submit the rest of the requests. You have to monitor the job to know when it completes. This is typically better than using the 5-minute cache because it's common for batch requests to take between 5 minutes and 1 hour to complete. diff --git a/content/en/build-with-claude/prompt-engineering/claude-prompting-best-practices.md b/content/en/build-with-claude/prompt-engineering/claude-prompting-best-practices.md index 9403e2ebcc..1e7061353c 100644 --- a/content/en/build-with-claude/prompt-engineering/claude-prompting-best-practices.md +++ b/content/en/build-with-claude/prompt-engineering/claude-prompting-best-practices.md @@ -35,13 +35,13 @@ The techniques in this section and the sections that follow apply to current Cla ### Be clear and direct -Claude responds well to clear, explicit instructions. Being specific about your desired output can help enhance results. If you want "above and beyond" behavior, explicitly request it rather than relying on the model to infer this from vague prompts. +Claude responds well to clear, explicit instructions. Being specific about the output you want can help enhance results. If you want Claude to do more than the task strictly requires, explicitly request it rather than relying on the model to infer this from vague prompts. Think of Claude as a brilliant but new employee who lacks context on your norms and workflows. The more precisely you explain what you want, the better the result. -**Golden rule:** Show your prompt to a colleague with minimal context on the task and ask them to follow it. If they'd be confused, Claude will be too. +**Key test:** Show your prompt to a colleague with minimal context on the task and ask them to follow it. If they'd be confused, Claude will be too. -* Be specific about the desired output format and constraints. +* Be specific about the output format and constraints you want. * Provide instructions as sequential steps using numbered lists or bullet points when the order or completeness of steps matters. @@ -60,7 +60,7 @@ Think of Claude as a brilliant but new employee who lacks context on your norms ### Add context to improve performance -Providing context or motivation behind your instructions, such as explaining to Claude why such behavior is important, can help Claude better understand your goals and deliver more targeted responses. +Providing context or motivation behind your instructions, such as explaining to Claude why such behavior is important, can give Claude more information about your goals and help it deliver more targeted responses. **Less effective:** @@ -76,7 +76,7 @@ Providing context or motivation behind your instructions, such as explaining to ``` -Claude is smart enough to generalize from the explanation. +Claude can generalize from the explanation. ### Use examples effectively @@ -165,10 +165,7 @@ Setting a role in the system prompt focuses Claude's behavior and tone for your Model = Model.ClaudeOpus5_5, MaxTokens = 1024, System = "You are a helpful coding assistant specializing in Python.", - Messages = - [ - new() { Role = Role.User, Content = "How do I sort a list of dictionaries by key?" } - ] + Messages = [new UserMessageParam { Content = "How do I sort a list of dictionaries by key?" }] }; var message = await client.Messages.Create(parameters); @@ -243,7 +240,7 @@ Setting a role in the system prompt focuses Claude's behavior and tone for your When working with large documents or data-rich inputs (20k+ tokens), structure your prompt carefully to get the best results: -* **Put longform data at the top:** Place your long documents and inputs near the top of your prompt, above your query, instructions, and examples. This improves performance across all models. +* **Put long-form data at the top:** Place your long documents and inputs near the top of your prompt, above your query, instructions, and examples. This improves performance across all models. Queries at the end can improve response quality by up to 30 percent in tests, especially with complex, multidocument inputs. @@ -326,9 +323,9 @@ Claude's latest models have a more concise and natural communication style compa * **More direct and grounded:** Provides fact-based progress reports rather than self-celebratory updates * **More conversational:** Slightly more fluent and colloquial, less machine-like -* **Less verbose:** May skip detailed summaries for efficiency unless prompted otherwise +* **Less verbose:** Might skip detailed summaries for efficiency unless prompted otherwise -This means Claude may skip verbal summaries after tool calls, jumping directly to the next action. If you prefer more visibility into its work: +This means Claude might skip verbal summaries after tool calls, jumping directly to the next action. If you prefer more visibility into its work: ```text Sample prompt wrap After completing a task that involves tool use, provide a quick summary of the work you've done. @@ -349,9 +346,9 @@ There are a few particularly effective ways to steer output formatting: * Try: "Write the prose sections of your response in \ tags." -3. **Match your prompt style to the desired output** +3. **Match your prompt style to the output you want** - The formatting style used in your prompt may influence Claude's response style. If you are still experiencing steerability issues with output formatting, try matching your prompt style to your desired output style as closely as possible. For example, removing markdown from your prompt can reduce the volume of markdown in the output. + The formatting style used in your prompt might influence Claude's response style. If you are still experiencing steerability issues with output formatting, try matching your prompt style to the output style you want as closely as possible. For example, removing markdown from your prompt can reduce the volume of markdown in the output. 4. **Use detailed prompts for specific formatting preferences** @@ -409,13 +406,13 @@ Starting with Claude 4.6 models and [Claude Mythos Preview](https://anthropic.co Here are common prefill scenarios and how to migrate away from them: - Prefills have been used to force specific output formats like JSON/YAML, classification, and similar patterns where the prefill constrains Claude to a particular structure. + Prefills have been used to force specific output formats such as JSON/YAML, classification, and similar patterns where the prefill constrains Claude to a particular structure. - **Migration:** The [Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) feature is designed specifically to constrain Claude's responses to follow a given schema. Try asking the model to conform to your output structure first, as newer models can reliably match complex schemas when told to, especially if implemented with retries. For classification tasks, use either tools with an enum field containing your valid labels or structured outputs. + **Migration:** The [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) feature is designed specifically to constrain Claude's responses to follow a given schema. Try asking the model to conform to your output structure first, as newer models can reliably match complex schemas when told to, especially if implemented with retries. For classification tasks, use either tools with an enum field containing your valid labels or structured outputs. - Prefills like `Here is the requested summary:\n` were used to skip introductory text. + Prefills such as `Here is the requested summary:\n` were used to skip introductory text. **Migration:** Use direct instructions in the system prompt: "Respond directly without preamble. Do not start with phrases like 'Here is...', 'Based on...', etc." Alternatively, direct the model to output within XML tags, use structured outputs, or use tool calling. If the occasional preamble slips through, strip it in post-processing. @@ -427,7 +424,7 @@ Here are common prefill scenarios and how to migrate away from them: - Prefills were used to continue partial completions, resume interrupted responses, or pick up where a previous generation left off. + Prefills were used to continue partial completions, resume interrupted responses, or extend a previous generation from where it ended. **Migration:** Move the continuation to the user message, and include the final text from the interrupted response: "Your previous response was interrupted and ended with \`\[previous\_response]\`. Continue from where you left off." If this is part of error-handling or incomplete-response-handling and there is no UX penalty, retry the request. @@ -477,7 +474,7 @@ call (e.g., file edit or read) is intended or not, and act accordingly. ``` -On the other hand, if you want the model to be more hesitant by default, less prone to jumping straight into implementations, and only take action if requested, you can steer this behavior with a prompt like the following: +On the other hand, if you want the model to be more hesitant by default, less prone to starting implementations immediately, and only take action if requested, you can steer this behavior with a prompt such as the following: ```text Sample prompt for conservative action wrap @@ -488,17 +485,17 @@ edits, modifications, or implementations when the user explicitly requests them. ``` -Claude Opus 4.5 and Claude Opus 4.6 are also more responsive to the system prompt than previous models. If your prompts were designed to reduce undertriggering on tools or skills, these models may now overtrigger. The fix is to dial back any aggressive language. Where you might have said "CRITICAL: You MUST use this tool when...", you can use more normal prompting like "Use this tool when...". +Claude Opus 4.5 and Claude Opus 4.6 are also more responsive to the system prompt than previous models. If your prompts were designed to reduce undertriggering on tools or skills, these models might now overtrigger. The fix is to soften any aggressive language. Where you might have said "CRITICAL: You MUST use this tool when...", you can use more normal prompting such as "Use this tool when...". ### Optimize parallel tool calling -Claude's latest models run independent tool calls in parallel. These models will: +Claude's latest models run independent tool calls in parallel. These models: * Run multiple speculative searches during research * Read several files at once to build context faster * Run bash commands in parallel (which can even bottleneck system performance) -This behavior is steerable. While the model has a high success rate in parallel tool calling without prompting, you can boost this to \~100% or adjust the aggression level: +This behavior is steerable. Although the model has a high success rate in parallel tool calling without prompting, you can boost this to about 100 percent or adjust the aggression level: ```text Sample prompt for maximum parallel efficiency wrap @@ -524,13 +521,13 @@ On Claude Fable 5.1 in long agent loops, send the parallel-calls instruction as ### Overthinking and excessive thoroughness -Claude Opus 4.6 does more upfront exploration than previous models, especially at higher [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) settings. This initial work often helps to optimize the final results, but the model may gather extensive context or pursue multiple threads of research without being prompted. If your prompts previously encouraged the model to be more thorough, you should tune that guidance for Claude Opus 4.6: +Claude Opus 4.6 does more upfront exploration than previous models, especially at higher [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) settings. This initial work often helps to optimize the final results, but the model might gather extensive context or pursue multiple threads of research without being prompted. If your prompts previously encouraged the model to be more thorough, you should tune that guidance for Claude Opus 4.6: -* **Replace blanket defaults with more targeted instructions.** Instead of "Default to using \[tool]," add guidance like "Use \[tool] when it would enhance your understanding of the problem." -* **Remove over-prompting.** Tools that undertriggered in previous models are likely to trigger appropriately now. Instructions like "If in doubt, use \[tool]" will cause overtriggering. +* **Replace blanket defaults with more targeted instructions.** Instead of "Default to using \[tool]," add guidance such as "Use \[tool] when it would enhance your understanding of the problem." +* **Remove over-prompting.** Tools that undertriggered in previous models are likely to trigger appropriately now. Instructions such as "If in doubt, use \[tool]" cause overtriggering. * **Use effort as a fallback.** If Claude continues to be overly aggressive, use a lower setting for `effort`. -In some cases, Claude Opus 4.6 may think extensively, which can inflate thinking tokens and slow down responses. If this behavior is undesirable, you can add explicit instructions to constrain its reasoning, or you can lower the `effort` setting to reduce overall thinking and token usage. +In some cases, Claude Opus 4.6 might think extensively, which can inflate thinking tokens and slow down responses. If this behavior is undesirable, you can add explicit instructions to constrain its reasoning, or you can lower the `effort` setting to reduce overall thinking and token usage. ```text Sample prompt wrap When you're deciding how to approach a problem, choose an approach and commit to it. @@ -541,7 +538,7 @@ through. You can always course-correct later if the chosen approach fails. If you need a hard ceiling on thinking costs, extended thinking with a `budget_tokens` cap is still functional on Opus 4.6 and Sonnet 4.6 but is deprecated. On Claude 4.7 and later models, setting `budget_tokens` returns a 400 error. Prefer lowering the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) setting or using `max_tokens` as a hard limit with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). -### Leverage thinking & interleaved thinking capabilities +### Leverage thinking and interleaved thinking capabilities Claude's latest models offer thinking capabilities that can be especially helpful for tasks involving reflection after tool use or complex multistep reasoning. You can guide its initial or interleaved thinking for better results. @@ -557,7 +554,7 @@ next steps before proceeding. Use your thinking to plan and iterate based on thi information, and then take the best next action. ``` -The triggering behavior for adaptive thinking is promptable. If you find the model thinking more often than you'd like, which can happen with large or complex system prompts, add guidance to steer it: +The triggering behavior for adaptive thinking is promptable. If you find the model thinking more often than you'd like, which can occur with large or complex system prompts, add guidance to steer it: ```text Sample prompt wrap Thinking adds latency and should only be used when it will meaningfully improve @@ -671,7 +668,7 @@ If you are migrating from [extended thinking](https://platform.claude.com/docs/e Model = Model.ClaudeSonnet4_5_20250929, MaxTokens = 16000, Thinking = new ThinkingConfigEnabled(budgetTokens: 10000), - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }); // After: adaptive thinking with effort @@ -681,7 +678,7 @@ If you are migrating from [extended thinking](https://platform.claude.com/docs/e MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), OutputConfig = new OutputConfig { Effort = Effort.High }, - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }); ``` @@ -776,13 +773,13 @@ If you are migrating from [extended thinking](https://platform.claude.com/docs/e If you are not using extended thinking, you don't need to add a `thinking` parameter. On Claude Opus 4.6 through Claude Opus 4.8 and Claude Sonnet 4.6, thinking is off when you omit the `thinking` parameter. On Claude Opus 5, Claude Sonnet 5.5, Claude Sonnet 5, and Claude Haiku 5.5, thinking is on by default when you omit the `thinking` parameter, so a response can begin with `thinking` blocks. Select content blocks by `type` rather than by position, and leave room in `max_tokens` for thinking. On Claude Opus 5 and Claude Haiku 5.5, you can disable it only at effort `high` or lower. On Claude Sonnet 5.5, the lowest thinking setting is `between_tools`, accepted at effort `high` or lower. On Claude Fable 5.1, Claude Mythos 5.1, Claude Fable 5, Claude Mythos 5, and Claude Opus 5.5, thinking is always on, regardless of whether you set the `thinking` parameter. -* **Prefer general instructions over prescriptive steps.** A prompt like "think thoroughly" often produces better reasoning than a hand-written step-by-step plan. Claude's reasoning frequently exceeds what a human would prescribe. +* **Prefer general instructions over prescriptive steps.** A prompt such as "think thoroughly" often produces better reasoning than a hand-written step-by-step plan. Claude's reasoning frequently exceeds what a human would prescribe. * **Multishot examples work with thinking.** Worked examples in your prompt shape how Claude approaches similar problems in its own thinking blocks. Present each example as a problem, the method to apply, and the expected answer. * **Manual chain-of-thought (CoT) prompting as a fallback.** When thinking is off, you can still encourage step-by-step reasoning by asking Claude to think through the problem before it answers, and to put the final answer in `` tags so you can extract it. On Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, and Claude Sonnet 5.5, rely on thinking instead, at a lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level if cost or latency matters: a prompt that asks the model to write out its reasoning, for example in `` tags, may be declined. See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). * **Ask Claude to self-check.** Append something like "Before you finish, verify your answer against \[test criteria]." This catches errors reliably, especially for coding and math. Claude Opus 5 is the exception: it verifies its own work well without explicit instruction, and verification instructions carried over from prompts tuned for earlier models can cause over-verification, adding tokens and latency. On Claude Opus 5, remove these instructions rather than rewriting them. See [Task scope and over-verification](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#task-scope-and-over-verification). - When extended thinking is disabled, Claude Opus 4.5 is particularly sensitive to the word "think" and its variants. Consider using alternatives like "consider," "evaluate," or "reason through" in those cases. + When extended thinking is disabled, Claude Opus 4.5 is particularly sensitive to the word "think" and its variants. Consider using alternatives such as "consider," "evaluate," or "reason through" in those cases. @@ -797,11 +794,11 @@ Claude's latest models handle long-horizon reasoning tasks with strong state tra #### Context awareness and multiwindow workflows -Claude Sonnet 5, Claude Sonnet 4.6, Claude Sonnet 4.5 (deprecated), and Claude Haiku 4.5 feature [context awareness](https://platform.claude.com/docs/en/build-with-claude/context-windows#context-awareness), enabling the model to track its remaining context window (that is, its "token budget") throughout a conversation. This enables Claude to execute tasks and manage context more effectively by understanding how much space it has to work. +Claude Sonnet 5, Claude Sonnet 4.6, Claude Sonnet 4.5 (deprecated), and Claude Haiku 4.5 feature [context awareness](https://platform.claude.com/docs/en/build-with-claude/context-windows#context-awareness), which lets the model track its remaining context window (that is, its "token budget") throughout a conversation. This allows Claude to run tasks and manage context more effectively based on how much space it has to work. **Managing context limits:** -If you are using Claude in an agent harness that compacts context or allows saving context to external files (like in Claude Code), consider adding this information to your prompt so Claude can behave accordingly. Otherwise, Claude may sometimes naturally try to wrap up work as it approaches the context limit. The following is an example prompt: +If you are using Claude in an agent harness that compacts context or allows saving context to external files (as in Claude Code), consider adding this information to your prompt so Claude can behave accordingly. Otherwise, Claude might sometimes naturally attempt to bring its work to a close as it approaches the context limit. The following is an example prompt: ```text Sample prompt wrap Your context window will be automatically compacted as it approaches its limit, allowing @@ -823,9 +820,9 @@ For tasks spanning multiple context windows: 2. **Have the model write tests in a structured format:** Ask Claude to create tests before starting work and keep track of them in a structured format (for example, `tests.json`). This leads to better long-term ability to iterate. Remind Claude of the importance of tests: "It is unacceptable to remove or edit tests because this could lead to missing or buggy functionality." -3. **Set up quality of life tools:** Encourage Claude to create setup scripts (for example, `init.sh`) to gracefully start servers, run test suites, and linters. This prevents repeated work when continuing from a fresh context window. +3. **Set up convenience tools:** Encourage Claude to create setup scripts (for example, `init.sh`) to gracefully start servers and run test suites and linters. This prevents repeated work when continuing from a fresh context window. -4. **Starting fresh versus compacting:** When a context window is cleared, consider starting with a brand new context window rather than using compaction. Claude's latest models are extremely effective at discovering state from the local filesystem. In some cases, you may want to take advantage of this over compaction. Be prescriptive about how it should start: +4. **Starting fresh versus compacting:** When a context window is cleared, consider starting with a brand new context window rather than using compaction. Claude's latest models are extremely effective at discovering state from the local filesystem. In some cases, you might want to take advantage of this over compaction. Be prescriptive about how it should start: * "Call pwd; you can only read and write files in this directory." * "Review progress.txt, tests.json, and the git logs." @@ -844,7 +841,7 @@ systematically until you have completed this task. #### State management best practices -* **Use structured formats for state data:** When tracking structured information (like test results or task status), use JSON or other structured formats to help Claude understand schema requirements. +* **Use structured formats for state data:** When tracking structured information (such as test results or task status), use JSON or other structured formats to make schema requirements explicit to Claude. * **Use unstructured text for progress notes:** Freeform progress notes work well for tracking general progress and context. * **Use git for state tracking:** Git provides a log of what's been done and checkpoints that can be restored. Claude's latest models perform especially well in using git to track state across multiple sessions. * **Emphasize incremental progress:** Explicitly ask Claude to keep track of its progress and focus on incremental work. @@ -876,7 +873,7 @@ systematically until you have completed this task. ### Balancing autonomy and safety -Without guidance, Claude Opus 4.6 may take actions that are difficult to reverse or affect shared systems, such as deleting files, force-pushing, or posting to external services. If you want Claude Opus 4.6 to confirm before taking potentially risky actions, add guidance to your prompt: +Without guidance, Claude Opus 4.6 might take actions that are difficult to reverse or affect shared systems, such as deleting files, force-pushing, or posting to external services. If you want Claude Opus 4.6 to confirm before taking potentially risky actions, add guidance to your prompt: ```text Sample prompt wrap Consider the reversibility and potential impact of your actions. You are encouraged to @@ -922,8 +919,8 @@ Claude's latest models orchestrate subagents natively. These models can recogniz To take advantage of this behavior: 1. **Ensure well-defined subagent tools:** Have subagent tools available and described in tool definitions. -2. **Let Claude orchestrate naturally:** Claude will delegate appropriately without explicit instruction. -3. **Watch for overuse:** Claude Opus 4.6 has a strong predilection for subagents and may spawn them in situations where a simpler, direct approach would suffice. For example, the model may spawn subagents for code exploration when a direct grep call is faster and sufficient. Claude Opus 5 also delegates to subagents more readily than prior models; see [Controlling subagent spawning](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#controlling-subagent-spawning) for guidance and a sample damping prompt. +2. **Let Claude orchestrate naturally:** Claude delegates appropriately without explicit instruction. +3. **Watch for overuse:** Claude Opus 4.6 has a strong tendency to use subagents and might spawn them in situations where a simpler, direct approach would suffice. For example, the model might spawn subagents for code exploration when a direct grep call is faster and sufficient. Claude Opus 5 also delegates to subagents more readily than prior models; see [Controlling subagent spawning](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#controlling-subagent-spawning) for guidance and a sample damping prompt. If you're seeing excessive subagent use, add explicit guidance about when subagents are and aren't warranted: @@ -942,9 +939,9 @@ The most common chaining pattern is **self-correction:** generate a draft → ha ### Reduce file creation in agentic coding -Claude's latest models may sometimes create new files for testing and iteration purposes, particularly when working with code. This approach allows Claude to use files, especially Python scripts, as a 'temporary scratchpad' before saving its final output. Using temporary files can improve outcomes particularly for agentic coding use cases. +Claude's latest models might sometimes create new files for testing and iteration purposes, particularly when working with code. This approach allows Claude to use files, especially Python scripts, as a 'temporary scratchpad' before saving its final output. Using temporary files can improve outcomes particularly for agentic coding use cases. -If you'd prefer to minimize net new file creation, you can instruct Claude to clean up after itself: +If you'd prefer to minimize the number of new files left behind, you can instruct Claude to clean up after itself: ```text Sample prompt wrap If you create any temporary new files, scripts, or helper files for iteration, clean up @@ -979,7 +976,7 @@ complexity is the minimum needed for the current task. ### Avoid focusing on passing tests and hardcoding -Claude can sometimes focus too heavily on making tests pass at the expense of more general solutions, or may use workarounds like helper scripts for complex refactoring instead of using standard tools directly. To prevent this behavior and get solutions that generalize: +Claude can sometimes focus too heavily on making tests pass at the expense of more general solutions, or might use workarounds such as helper scripts for complex refactoring instead of using standard tools directly. To prevent this behavior and get solutions that generalize: ```text Sample prompt wrap Please write a high-quality, general-purpose solution using the standard tools @@ -1021,7 +1018,7 @@ One technique that has proven effective to further boost performance is to give ### Frontend design -Claude Opus 4.5 and Claude Opus 4.6 build complex, real-world web applications with strong frontend design. However, without guidance, models can default to generic patterns that create what users call the "AI slop" aesthetic. To create distinctive, creative frontends that surprise and delight: +Claude Opus 4.5 and Claude Opus 4.6 build complex, real-world web applications with strong frontend design. However, without guidance, models can default to generic patterns that create what users call the "AI slop" aesthetic. To create distinctive, creative front ends that surprise and delight: For a detailed guide on improving frontend design, see the blog post on [improving frontend design through skills](https://www.claude.com/blog/improving-frontend-design-through-skills). @@ -1116,17 +1113,17 @@ Claude shares what the label states for the child's age or weight: the dose, plu When migrating to current Claude models from earlier generations: -1. **Be specific about desired behavior:** Consider describing exactly what you'd like to see in the output. +1. **Be specific about the behavior you want:** Consider describing exactly what you'd like to see in the output. -2. **Frame your instructions with modifiers:** Adding modifiers that encourage Claude to increase the quality and detail of its output can help better shape Claude's performance. For example, instead of "Create an analytics dashboard", use "Create an analytics dashboard. Include as many relevant features and interactions as possible. Go beyond the basics to create a fully-featured implementation." +2. **Frame your instructions with modifiers:** Adding modifiers that encourage Claude to increase the quality and detail of its output can help better shape Claude's performance. For example, instead of "Create an analytics dashboard," use "Create an analytics dashboard. Include as many relevant features and interactions as possible. Go beyond the basics to create a fully-featured implementation." -3. **Request specific features explicitly:** Animations and interactive elements should be requested explicitly when desired. +3. **Request specific features explicitly:** Ask explicitly for animations and interactive elements when you want them. 4. **Update thinking configuration:** Claude 4.6 and later models use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) (`thinking: {type: "adaptive"}`) instead of manual thinking with `budget_tokens`. On Claude 4.7 and later models, setting `budget_tokens` returns a 400 error. Use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control thinking depth. 5. **Migrate away from prefilled responses:** Prefilled responses on the last assistant turn are no longer supported starting with Claude 4.6 models and Claude Mythos Preview. See [Migrating away from prefilled responses](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses) for detailed guidance on alternatives. -6. **Tune anti-laziness prompting:** If your prompts previously encouraged the model to be more thorough or use tools more aggressively, dial back that guidance. Claude 4.6 models are more proactive and may overtrigger on instructions that were needed for previous models. +6. **Tune anti-laziness prompting:** If your prompts previously encouraged the model to be more thorough or use tools more aggressively, reduce that guidance. Claude 4.6 models are more proactive and might overtrigger on instructions that were needed for previous models. 7. **Pass thinking blocks back unchanged and keep history append-only:** Append each assistant turn exactly as the API returned it, thinking blocks included. On Claude Fable 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, [modifying the conversation before a thinking block](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation) results in an error, or in the block being dropped if you opt into that: editing earlier messages, rebuilding `system` or `tools`, or summarizing older turns in place between requests invalidates every later thinking block, so move those changes to mid-conversation system messages and server-side context management. See [Keep the conversation history append-only](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#keep-the-conversation-history-append-only). diff --git a/content/en/build-with-claude/prompt-engineering/overview.md b/content/en/build-with-claude/prompt-engineering/overview.md index 81821a5e36..c38377ba8b 100644 --- a/content/en/build-with-claude/prompt-engineering/overview.md +++ b/content/en/build-with-claude/prompt-engineering/overview.md @@ -12,7 +12,7 @@ This guide assumes that you have: 2. Some ways to empirically test against those criteria 3. A first draft prompt you want to improve -If not, spend time establishing that first. Check out [Define success criteria and build evaluations](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) for tips and guidance. +If not, spend time establishing that first. See [Define success criteria and build evaluations](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) for tips and guidance. @@ -28,7 +28,7 @@ If not, spend time establishing that first. Check out [Define success criteria a ## When to prompt engineer -This guide focuses on success criteria that are controllable through prompt engineering. Not every success criteria or failing eval is best solved by prompt engineering. For example, you can sometimes improve latency and cost more easily by selecting a different model. +This guide focuses on success criteria that are controllable through prompt engineering. Not every success criterion or failing eval is best solved by prompt engineering. For example, you can sometimes improve latency and cost more easily by choosing a different model. *** diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1.md index 8c3a5e0c2f..49eb920ab5 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1.md @@ -10,7 +10,7 @@ Your existing Claude Fable 5 prompts should perform well on Claude Fable 5.1 wit * Unsure which effort level to run, or latency and cost are higher than the task warrants: [Consider all effort levels](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#consider-all-effort-levels) * Little or no text between tool calls: [Ask for user-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#ask-for-user-facing-progress-updates) -* One tool call per turn in agent loops: [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops) +* One tool call for each turn in agent loops: [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops) * Requests fail with `bound to a different conversation`, or your harness edits earlier turns between requests: [Keep the conversation history append-only](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#keep-the-conversation-history-append-only) * Prose runs long and dense: [Writing density](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#writing-density) * Chat replies carry less structure than the content needs: [Formatting in chat](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#formatting-in-chat) @@ -28,7 +28,7 @@ Your existing Claude Fable 5 prompts should perform well on Claude Fable 5.1 wit Claude Fable 5.1 runs safety classifiers and can return `stop_reason: "refusal"`. See [Refusals, fallback, and billing](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#refusals-fallback-and-billing) and [Reduce safeguard false positives](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#reduce-safeguard-false-positives). - Prompts, skills, and tool descriptions that ask the model to write out its thinking or reasoning may be declined with the `reasoning_extraction` category. Ask for a short explanation or a summary of the actions taken instead, or read the reasoning from [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks (`display: "summarized"`). See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). + Prompts, skills, and tool descriptions that ask the model to write its thinking or reasoning might be declined with the `reasoning_extraction` category. Ask for a short explanation or a summary of the actions taken instead, or read the reasoning from [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks (`display: "summarized"`). See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). ## Consider all effort levels @@ -43,9 +43,9 @@ Two effort-specific behaviors have their own sections: at `low`, Claude Fable 5. Claude Fable 5.1's default behavior is to write fewer user-facing updates during long tool-calling turns than Claude Fable 5 does. This becomes more pronounced at higher effort and in longer tool chains. Users see the agent go quiet for minutes at a time, or a final message that covers only the last step rather than the whole task. -First, check that your client receives progress updates at all. The model's short notes between tool calls, what it just found and what it's doing next, come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates), and those blocks are empty under the default `thinking.display` of `"omitted"`. Set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header) and render each non-empty `thinking` block as a status line, or set `"summarized"` to receive them along with summarized reasoning. If you aren't requesting them, the model's updates may simply not be reaching your users. +First, check that your client receives progress updates at all. The model's short notes between tool calls, what it just found and what it's doing next, come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates), and those blocks are empty under the default `thinking.display` of `"omitted"`. Set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header) and render each non-empty `thinking` block as a status line, or set `"summarized"` to receive them along with summarized reasoning. If you aren't requesting them, the model's updates might simply not be reaching your users. -Second, audit your prompt for instructions that suppress narration. Some earlier models were eager to give updates while working, which led to system prompt lines such as "hold all findings for the final response." Remove lines like that before adding anything. +Second, audit your prompt for instructions that suppress narration. Some earlier models gave frequent updates while working, which led to system prompt lines such as "hold all findings for the final response." Remove lines like that before adding anything. If you still want more updates, for example when pair programming or in other human-in-the-loop work, add a short system prompt line that says when you want user-facing text from the model and what each update should contain: @@ -53,7 +53,7 @@ If you still want more updates, for example when pair programming or in other hu Before you start, say in a line what you're about to do; brief updates while you work help the user follow along. Close with a short recap that stands on its own — what you found, what you did, and what's next — so a reader who only sees the last message has the full picture. ``` -If your product collapses or hides tool output, tell the model. Otherwise it may run commands to "show" the user output that your UI never displays. Deliver the note in a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`, beta): +If your product collapses or hides tool output, tell the model. Otherwise it may run commands to "show" the user output that your UI never displays. Each time you send back tool output that your UI hides, follow it with the note in a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`, beta): ```text wrap Only you see that command's output — the user's terminal shows at most a few lines of it. If the user needs to read any of it, put it in your reply. @@ -61,7 +61,7 @@ Only you see that command's output — the user's terminal shows at most a few l ## Batch independent tool calls in agent loops -Claude Fable 5.1 usually issues parallel tool calls as expected: when a request names several things to fetch, it issues those calls in parallel. The exception is coding and computer-use loops where the next independent calls are implied by the task rather than explicitly requested (custom coding agents, bash-and-editor harnesses, computer use): there it may issue them one per turn instead. This doesn't affect answer quality, but each extra turn costs tokens, a round trip, and wall-clock time. A one-sentence nudge at the end of the current request addresses it: +Claude Fable 5.1 usually issues parallel tool calls as expected: when a request names several things to fetch, it issues those calls in parallel. The exception is coding and computer-use loops where the next independent calls are implied by the task rather than explicitly requested (custom coding agents, bash-and-editor harnesses, computer use): there it might issue them one in each turn instead. This doesn't affect answer quality, but each extra turn costs tokens, a round trip, and wall-clock time. A one-sentence nudge at the end of the current request addresses it: ```text wrap First privately list what you need next; then request every item that doesn't depend on another's result in this one response. @@ -69,7 +69,7 @@ First privately list what you need next; then request every item that doesn't de Each time you send tool results back, append it after that user message as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages): a `role: "system"` entry in `messages` with `clear_at: "next_user_message"`. Once a later user message exists, the API clears the earlier copies, so the model reads only the newest one. Turn-scoped system messages are in beta and require the [beta header](https://platform.claude.com/docs/en/api/beta-headers) `mid-conversation-system-clear-at-2026-08-21`. Without the beta, place the sentence in a text block after the `tool_result` blocks in the same user message instead. -Append a fresh copy each turn and leave the earlier copies where they are, byte-for-byte. They stay in the array, but once cleared the model doesn't see them and they cost no input tokens. Deleting or rewriting them is an edit to earlier turns: it restarts the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) from that point and invalidates the thinking blocks that came after them (see [Keep the conversation history append-only](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#keep-the-conversation-history-append-only)). +Append a fresh copy each turn and leave the earlier copies where they are, byte-for-byte. They stay in the array, but once cleared the model doesn't see them and they cost no input tokens. Deleting or rewriting them is an edit to earlier turns: it invalidates the thinking blocks that came after them (see [Keep the conversation history append-only](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#keep-the-conversation-history-append-only)). The following loop shows this placement. Each assistant turn goes back exactly as returned, each user turn carries only the tool results, and a fresh turn-scoped copy of the nudge follows it. @@ -308,7 +308,7 @@ The following loop shows this placement. Each assistant turn goes back exactly a List messages = [ - new() { Role = Role.User, Content = "Summarize pyproject.toml and README.md." }, + new BetaUserMessageParam { Content = "Summarize pyproject.toml and README.md." }, ]; BetaMessage response; @@ -323,9 +323,8 @@ The following loop shows this placement. Each assistant turn goes back exactly a Messages = messages, }); // Append the assistant turn exactly as returned, thinking blocks included. - messages.Add(new() + messages.Add(new BetaAssistantMessageParam { - Role = Role.Assistant, Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList(), }); if (response.StopReason != BetaStopReason.ToolUse) @@ -359,10 +358,9 @@ The following loop shows this placement. Each assistant turn goes back exactly a // Send the tool results as the user turn, then a fresh copy of the nudge as a // turn-scoped system message. Leave earlier copies in place: the API clears them, // so the model sees only the newest one. - messages.Add(new() { Role = Role.User, Content = toolResults }); - messages.Add(new() + messages.Add(new BetaUserMessageParam { Content = toolResults }); + messages.Add(new BetaSystemMessageParam { - Role = Role.System, Content = BatchNudge, ClearAt = ClearAt.NextUserMessage, }); @@ -491,6 +489,7 @@ The following loop shows this placement. Each assistant turn goes back exactly a import com.anthropic.models.beta.messages.BetaMessage; import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaStopReason; + import com.anthropic.models.beta.messages.BetaSystemMessageParam; import com.anthropic.models.beta.messages.BetaTool; import com.anthropic.models.beta.messages.BetaTool.InputSchema; import com.anthropic.models.beta.messages.BetaToolResultBlockParam; @@ -528,10 +527,7 @@ The following loop shows this placement. Each assistant turn goes back exactly a .build()) .build(); List messages = new ArrayList<>(); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .content("Summarize pyproject.toml and README.md.") - .build()); + messages.add(BetaMessageParam.ofUser("Summarize pyproject.toml and README.md.")); BetaMessage response; while (true) { @@ -574,15 +570,11 @@ The following loop shows this placement. Each assistant turn goes back exactly a // Send the tool results as the user turn, then a fresh copy of the nudge as a // turn-scoped system message. Leave earlier copies in place: the API clears them, // so the model sees only the newest one. - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.USER) - .contentOfBetaContentBlockParams(toolResults) - .build()); - messages.add(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) + messages.add(BetaMessageParam.ofUserOfContentBlockParams(toolResults)); + messages.add(BetaMessageParam.ofSystem(BetaSystemMessageParam.builder() .content(BATCH_NUDGE) - .clearAt(BetaMessageParam.ClearAt.NEXT_USER_MESSAGE) - .build()); + .clearAt(BetaSystemMessageParam.ClearAt.NEXT_USER_MESSAGE) + .build())); } String finalText = response.content().stream() @@ -719,7 +711,7 @@ The following loop shows this placement. Each assistant turn goes back exactly a response = nil loop do response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16000, betas: ["mid-conversation-system-clear-at-2026-08-21"], tools: tools, @@ -759,7 +751,7 @@ The following loop shows this placement. Each assistant turn goes back exactly a Append each assistant turn to the history exactly as the API returned it, thinking blocks included, and don't edit earlier turns between requests. For new accounts created on or after August 31, 2026, Claude Fable 5.1's thinking blocks are valid [only in the exact conversation that produced them](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation): a request that replays a thinking block after its prefix (the system prompt, the tool list, or any earlier message) has changed returns a 400, or drops the affected blocks if you set `thinking.block_binding.prefix_mismatch_behavior: "drop_block"` (beta, `thinking-binding-controls-2026-08-01` header). Adopt the pattern even if the check isn't enforced for your account, so the same code works on every account. -The history edits that trip the check are the same ones that restart the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching): injecting and removing per-turn reminders, summarizing older turns in place, or changing the system prompt mid-session. Send per-turn reminders as [turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages), change instructions or tools with a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) instead of rewriting `system` or `tools`, and let server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) or [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) do any trimming. If you compact on the client, the simplest shape is to replace the whole history with one summary message plus the new user turn and replay nothing else: no thinking blocks carry over, so nothing fails, and the model thinks afresh on the compacted conversation (see [Custom compaction on the client](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client)). Because cache reads are now cheaper (see [Pricing](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing)), compacting early to save cost may no longer be the right cost-intelligence tradeoff on Claude Fable 5.1, so experiment with later compaction points. +Most history edits that trip the check also restart the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching): injecting and removing per-turn reminders, summarizing older turns in place, or changing the system prompt mid-session. Send per-turn reminders as [turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages), change instructions or tools with a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) instead of rewriting `system` or `tools`, and let server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) or [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) do any trimming. If you compact on the client, the simplest shape is to replace the whole history with one summary message plus the new user turn and replay nothing else: no thinking blocks carry over, so nothing fails, and the model thinks afresh on the compacted conversation (see [Custom compaction on the client](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client)). Because cache reads are now cheaper (see [Pricing](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing)), compacting early to save cost may no longer be the right cost-intelligence tradeoff on Claude Fable 5.1, so experiment with later compaction points. To find edits your harness already makes, run a session with `prefix_mismatch_behavior: "drop_block"` and log `input_transformations`, as described in [How to tell whether your integration is impacted](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-to-tell-whether-your-integration-is-impacted), or capture the exact requests it sends over a few normal turns and confirm that consecutive requests are byte-identical up to the appended turns. @@ -779,7 +771,7 @@ Please remove all mannered prose. ## Formatting in chat -Earlier models overused bullets and bold in chat, and many prompts carry anti-formatting rules written to hold that down. Claude Fable 5.1 leans the other way: it uses bold less and is less likely to reach for headers, lists, or quotation marks. If your prompt contains anti-formatting language, remove it or replace it with a rule that says when specific formatting is appropriate, such as the following: +Earlier models overused bullets and bold in chat, and many prompts carry anti-formatting rules written to reduce that. Claude Fable 5.1 tends toward the opposite: it uses bold less and is less likely to reach for headers, lists, or quotation marks. If your prompt contains anti-formatting language, remove it or replace it with a rule that says when specific formatting is appropriate, such as the following: ```text wrap Use lists and bullet points when asked to, or when the content is multifaceted enough that they help with clarity. If the person explicitly requests minimal formatting, always format your responses without bullet points, headers, lists, or bold emphasis, as requested. In conversational, personal, or emotional exchanges, keep to plain prose. @@ -805,7 +797,7 @@ Replace the two `[web_search: ...]` lines with your own tool's name, so the mode ## Finish the whole task -Claude Fable 5.1 can execute very long tasks without much guidance on methodology, especially when the goal is clear. On complex asynchronous workloads, though, nudge it not to end its turn before the work is done. Without the nudge, the model sometimes describes what it would do next instead of doing it ("Next, I'll …") or stops to ask permission for a step the original request already covered ("Shall I apply this?"). Users have to reply "continue" or "go ahead," which suits pair programming and other human-in-the-loop work but doesn't use the model's full long-horizon capability. +Claude Fable 5.1 can run very long tasks without much guidance on methodology, especially when the goal is clear. On complex asynchronous workloads, though, nudge it not to end its turn before the work is done. Without the nudge, the model sometimes describes what it would do next instead of doing it ("Next, I'll …") or stops to ask permission for a step the original request already covered ("Shall I apply this?"). Users have to reply "continue" or "go ahead," which suits pair programming and other human-in-the-loop work but doesn't use the model's full long-horizon capability. Two system prompt additions together mitigate this. Apply both. If you need to limit prompt length, use only the first, which keeps most of the effect. The first tells the model not to ask about work already requested and to carry out the next steps it has stated: @@ -842,7 +834,7 @@ Summarize the transcript inside tags. Include relevant infor ## Keep changes and tests to what the task asks for -When asked to implement an open-ended feature, Claude Fable 5.1 delivers what's asked for and sometimes more: it may fix nearby code, extend behavior the task didn't mention, or commit more test files than the change warrants. It responds well to explicit instructions about what to leave out. With the following instruction, unrequested additions and committed test code drop substantially with no measurable change in task success: +When asked to implement an open-ended feature, Claude Fable 5.1 delivers what's asked for and sometimes more: it might fix nearby code, extend behavior the task didn't mention, or commit more test files than the change warrants. It responds well to explicit instructions about what to leave out. With the following instruction, unrequested additions and committed test code drop substantially with no measurable change in task success: ```text wrap If, while working or testing, you find a pre-existing bug, a performance concern, or behavior the task doesn't mention, don't fix, optimize or extend it in this change unless the requested behavior cannot work without it; report it as a follow-up in your summary. Where the task is ambiguous, implement the reading its wording and the surrounding code most directly support, state that assumption in your summary, and don't build for the other readings as well. Verify your work however you like; scratch scripts and quick checks need not be kept. Commit tests only where the task asks for them or this repository already keeps tests for this kind of change, sized like the neighboring test files — roughly one focused test per stated behavior — and don't turn scratch checks into additional permanent test files. This is about extras only: implement every behavior the task asks for, completely. @@ -868,7 +860,7 @@ Claude Fable 5.1's safety classifiers produce fewer false positives than Claude ## Prefer targeted edits over whole-file rewrites -If Claude Fable 5.1 rewrites whole files for small changes, append the following instruction to the system prompt or the first user message. Claude Fable 5.1 is more likely than Claude Fable 5 to rewrite an entire text file rather than make a targeted edit. The resulting file is usually the same, but unless the file is short or most of it is changing, a rewrite costs more output tokens and time. The instruction brings Claude Fable 5.1 back in line with Claude Fable 5 for small and medium changes. +If Claude Fable 5.1 rewrites whole files for small changes, append the following instruction to the system prompt or the first user message. Claude Fable 5.1 is more likely than Claude Fable 5 to rewrite an entire text file rather than make a targeted edit. The resulting file is usually the same, but unless the file is short or most of it is changing, a rewrite costs more output tokens and time. With the instruction, Claude Fable 5.1 behaves like Claude Fable 5 on small and medium changes. ```text wrap The number of tokens used to edit files is best minimized, all else being equal. Therefore, when it will not affect the end result, try to surgically edit a file rather than rewrite the entire thing. @@ -876,7 +868,7 @@ The number of tokens used to edit files is best minimized, all else being equal. ## Leave room for long outputs at xhigh and max effort -At `xhigh` and especially `max` effort, Claude Fable 5.1 can think for longer before it starts writing its reply. When a single request asks for a long deliverable, such as a full rewrite of a long document, it may draft much of that deliverable in its thinking and then write it out again as the reply, which means a longer wait and more output tokens. The simplest approach is to run requests like these at `high`, the recommended starting point, and move to `xhigh` or `max` only where you've measured a quality gain (see [Consider all effort levels](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#consider-all-effort-levels)). If you do run them at `xhigh` or `max`: +At `xhigh` and especially `max` effort, Claude Fable 5.1 can think for longer before it starts writing its reply. When a single request asks for a long deliverable, such as a full rewrite of a long document, it might draft much of that deliverable in its thinking and then write it again as the reply, which means a longer wait and more output tokens. The simplest approach is to run requests like these at `high`, the recommended starting point, and move to `xhigh` or `max` only where you've measured a quality gain (see [Consider all effort levels](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#consider-all-effort-levels)). If you do run them at `xhigh` or `max`: * Set `max_tokens` to leave room for the thinking and the reply, not just the reply length you expect. * Append the following note to the end of the user message. It makes the thinking much shorter on prose and code requests. Replace `[max_tokens]` with the request's actual `max_tokens` value, for example 64,000. @@ -893,9 +885,9 @@ If your coding agent lets Claude Fable 5.1 delegate work to subagents, don't for * Have the tool that starts a subagent return immediately. * Pass each subagent's result back to the lead in a later `user` message once it's ready. -* Give the lead a separate tool it can call when it wants to wait for a result. +* Give the lead a separate tool it can call to wait for a result. -The model still often chooses to wait. The time savings come from the runs where it carries on with other work. +The model still often waits. The time savings come from the runs where it carries on with other work. ## Give vision work tools to crop and zoom diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5.md index ecedec205f..8518742a2e 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-fable-5.md @@ -8,12 +8,12 @@ This guide covers the prompting and scaffolding patterns specific to Claude Fabl Claude Fable 5 takes on problems that were previously too complex, long-running, or ambiguous for prior models, and is particularly effective at end-to-end work that takes a person hours, days, or weeks to complete. The teams seeing the best outcomes apply Claude Fable 5 to their hardest unsolved problems; testing it only on simpler workloads tends to undersell its capability range. It also performs reliably on more straightforward tasks. -Claude Fable 5 has several behavioral differences from Claude Opus 4.8 that may require prompt or scaffolding updates. Capability improvements at this level are also a good prompt to re-evaluate which instructions, tools, and guardrails are still needed. The patterns below cover the behaviors that most often require tuning. +Claude Fable 5 has several behavioral differences from Claude Opus 4.8 that might require prompt or scaffolding updates. Capability improvements at this level are also a good prompt to re-evaluate which instructions, tools, and guardrails are still needed. The following patterns cover the behaviors that most often require tuning. For how thinking works on Claude Fable 5 and Claude Mythos 5 (adaptive thinking only, summarized-only thinking output, no extended thinking budgets), see [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#configuring-thinking). For the `refusal` stop reason and fallback handling, see [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback). - Claude Fable 5 runs safety classifiers that target offensive cybersecurity techniques (such as building exploits, malware, or attack tooling), biology and life sciences content (such as lab methods or molecular mechanisms), and extraction of the model's summarized thinking. Benign cybersecurity work and beneficial life sciences tasks may also trigger these safeguards. To re-route declined requests automatically, configure [server-side or client-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) to Claude Opus 4.8. + Claude Fable 5 runs safety classifiers that target offensive cybersecurity techniques (such as building exploits, malware, or attack tooling), biology and life sciences content (such as lab methods or molecular mechanisms), and extraction of the model's summarized thinking. Benign cybersecurity work and beneficial life sciences tasks might also trigger these safeguards. To re-route declined requests automatically, configure [server-side or client-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) to Claude Opus 4.8. ## Capability improvements @@ -24,7 +24,7 @@ Compared with Claude Opus 4.8, Claude Fable 5 shows improvement in: * **First-shot correctness on complex, well-specified problems.** Early testers reported single-pass implementations of systems that previously took days of iteration. * **Vision.** Claude Fable 5 interprets dense technical images, web applications, and detailed screenshots with substantially higher accuracy, often while using fewer output tokens, and is trained to use bash and crop tools to handle flipped, blurry, or noisy images. * **Enterprise workflows.** Claude Fable 5 follows instructions, stays in scope, and produces professional-grade output on financial analysis, spreadsheets, slides, and documents. -* **Code review and debugging.** Bug-finding recall (outside the cybersecurity domains the safety classifiers cover) is noticeably higher than Claude Opus 4.8, including search across codebases and repository history. +* **Code review and debugging.** Bug-finding recall (outside the cybersecurity domains the safety classifiers cover) is noticeably higher than Claude Opus 4.8, including search across code bases and repository history. * **Navigating ambiguity.** Claude Fable 5 performs well when given complex, multithreaded requests and asked to determine next steps. * **Delegation and collaboration.** Claude Fable 5 is significantly more dependable at dispatching and sustaining parallel subagents, and reliably manages ongoing communication with long-running subagents and peer agents. @@ -50,7 +50,7 @@ Don't add features, refactor, or introduce abstractions beyond what the task req ## Strong instruction following -Instruction-following is improved enough that you can steer most behaviors with a brief instruction rather than enumerating each behavior by name. For example, when un-steered, Claude Fable 5 can elaborate beyond what the task needs, especially at higher effort settings: surveying options it won't pursue, explaining root causes at length, producing heavily-structured PR descriptions, or writing comments that narrate what the next line does. A short brevity instruction is as effective as listing each pattern: +Instruction-following is improved enough that you can steer most behaviors with a brief instruction rather than enumerating each behavior by name. For example, when un-steered, Claude Fable 5 can elaborate beyond what the task needs, especially at higher effort settings: surveying options it won't pursue, explaining root causes at length, producing heavily structured PR descriptions, or writing comments that narrate what the next line does. A short brevity instruction is as effective as listing each pattern: ```text wrap Lead with the outcome. Your first sentence after finishing should answer "what happened" or "what did you find": the thing the user would ask for if they said "just give me the TLDR." Supporting detail and reasoning come after. Being readable and being concise are different things, and readability matters more. @@ -120,7 +120,7 @@ You have ample context remaining. Do not stop, summarize, or suggest a new sessi ## Give the reason, not only the request -Claude Fable 5 tends to perform better when it understands the intent behind a request: context lets it connect the task to relevant information rather than inferring intent on its own. Provide context about why you're asking, especially for long-running agents drawing on multiple workstreams: +Claude Fable 5 tends to perform better when the prompt states the intent behind a request: context lets it connect the task to relevant information rather than inferring intent on its own. Provide context about why you're asking, especially for long-running agents drawing on multiple workstreams: ```text wrap I'm working on [the larger task] for [who it's for]. They need [what the output enables]. With that in mind: [request]. @@ -169,8 +169,8 @@ Do not route narration or internal reasoning through `send_to_user`; over-callin ## Recommended scaffolding changes -* **Start at the top of your difficulty range.** Pick a task harder than what you'd assign to prior models, and have Claude Fable 5 scope it, ask clarifying questions, and execute. +* **Start at the top of your difficulty range.** Pick a task harder than what you'd assign to prior models, and have Claude Fable 5 scope it, ask clarifying questions, and carry it out. * **Make self-verification explicit in long-run prompts.** Separate, fresh-context verifier subagents tend to outperform self-critique. For long-running tasks, instruct: `Establish a method for checking your own work at an interval of [X] as you build. Run this every [X interval], verifying your work with subagents against the specification.` * **Refactor existing prompts and skills.** Skills developed for prior models are often too prescriptive for Claude Fable 5 and can degrade output quality. Review and consider removing older instructions if default performance is better. Claude Fable 5 also does a good job of updating skills on the fly based on what it learns from the task at hand. -* **Don't instruct Claude to reproduce its reasoning in the response.** Prompts, skills, or harness instructions that tell the model to echo, transcribe, or explain its internal reasoning as response text may trigger the [`reasoning_extraction` refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) on Claude Fable 5. Server-side fallback with `fallbacks: "default"` doesn't retry requests declined with `reasoning_extraction`; that refusal is returned to you. Audit existing skills and system prompts for reflection or show-your-thinking instructions when migrating. If your application needs reasoning visibility, read the structured `thinking` blocks from [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) instead, and use a [send-to-user tool](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5#create-a-send-to-user-tool) to surface progress during long runs. You can still ask for a short explanation of the answer or a summary of the actions taken; see [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). +* **Don't instruct Claude to reproduce its reasoning in the response.** Prompts, skills, or harness instructions that tell the model to echo, transcribe, or explain its internal reasoning as response text might trigger the [`reasoning_extraction` refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) on Claude Fable 5. Server-side fallback with `fallbacks: "default"` doesn't retry requests declined with `reasoning_extraction`; that refusal is returned to you. Audit existing skills and system prompts for reflection or show-your-thinking instructions when migrating. If your application needs reasoning visibility, read the structured `thinking` blocks from [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) instead, and use a [send-to-user tool](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5#create-a-send-to-user-tool) to surface progress during long runs. You can still ask for a short explanation of the answer or a summary of the actions taken; see [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). * **Create a send-to-user tool.** For long, asynchronous agents, a client-side tool delivers messages to the user verbatim without ending the turn. See [Create a send-to-user tool](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5#create-a-send-to-user-tool). diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5.md index 5577fb2819..9c03c6e431 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5.md @@ -50,7 +50,7 @@ The current date is {{current_date}}. Render the date once, when the conversation starts, and send the same `system` and `tools` on every later request in that conversation (see [Keep earlier turns unchanged](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#keep-earlier-turns-unchanged)). When a conversation continues on a later day, [give the new date in the newest turn](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#changing-context) instead. -The model also sometimes needs an extra nudge to search. This happens most at `low` effort and with long system prompts. To fix it, add this text directly after the date: +The model also sometimes needs an extra nudge to search. This occurs most at `low` effort and with long system prompts. To fix it, add this text directly after the date: ```text wrap Your training data ends well before today's date. Records, office holders, prices, versions, rules and anything "latest" may have changed since then, so search for those before you answer, even when you feel sure. Facts that can't change need no search. When the answer depends on where the user is, put the user's country or region in the search query. @@ -121,16 +121,16 @@ When instruction following matters most, also use `high` effort. ## Keep reasoning out of user-facing text -Claude Haiku 5.5 sometimes writes reasoning-like text in the reply that users see. This happens more often with thinking off or at `low` effort. If you see this behavior, switch to adaptive thinking and `medium` effort. +Claude Haiku 5.5 sometimes writes reasoning-like text in the reply that users see. This occurs more often with thinking off or at `low` effort. If you see this behavior, switch to adaptive thinking and `medium` effort. ## Safeguard refusals Claude Haiku 5.5 runs safety classifiers that can decline a request. A declined request returns a response with `stop_reason: "refusal"`, and `stop_details.category` names the [refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response): * `cyber`: the request could enable cyber harm, such as malware or exploit development. Finding vulnerabilities in source code is allowed. High-risk dual-use cybersecurity work isn't allowed. Benign cybersecurity work can also trigger this category. If the `cyber` classifier blocks your organization's legitimate security work, you can apply to the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). -* `frontier_llm`: the request could assist the development of competing AI models. +* `frontier_llm`: the request could help with the development of competing AI models. * `bio`: the request could enable biological harm, such as dangerous lab methods. Everyday health and educational questions aren't affected. If the `bio` classifier blocks your organization's life sciences work, you can apply to the [Life Sciences Verification Program](https://www.anthropic.com/news/life-sciences-verification-program). -* `general_harms`: the request falls under a usage-policy area other than the three above. Benign work can also trigger this category. +* `general_harms`: the request falls under a usage-policy area other than the previous three. Benign work can also trigger this category. If you're moving from Claude Haiku 4.5, these refusals are new. diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8.md index 1e605d4a66..dbdd98191b 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-4-8.md @@ -14,9 +14,9 @@ Claude Opus 4.8 has particular strengths in long-horizon agentic work, knowledge ## Response length and verbosity -Claude Opus 4.8 calibrates response length to how complex it judges the task to be, rather than defaulting to a fixed verbosity. This usually means shorter answers on simple lookups and much longer ones on open-ended analysis. +Claude Opus 4.8 calibrates response length to the complexity of the task, rather than defaulting to a fixed verbosity. This usually means shorter answers on simple lookups and much longer ones on open-ended analysis. -If your product depends on a certain style or verbosity of output, you may need to tune your prompts. As an example, to decrease verbosity, you might add: +If your product depends on a certain style or verbosity of output, you might need to tune your prompts. As an example, to decrease verbosity, you might add: ```text wrap Provide concise, focused responses. Skip non-essential context, and keep examples minimal. @@ -28,13 +28,13 @@ If you see specific examples of kinds of verbosity (such as over-explaining), yo The [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) allows you to tune Claude's intelligence versus token spend, trading off capability for faster speed and lower costs. Start with the `xhigh` effort level for coding and agentic use cases, and use a minimum of `high` effort for most intelligence-sensitive use cases. Experiment with other effort levels to further tune token usage and intelligence: -* **`max`:** Max effort can deliver performance gains in some use cases, but may show diminishing returns from increased token usage. This setting can also sometimes be prone to overthinking. Test max effort for intelligence-demanding tasks. +* **`max`:** Max effort can deliver performance gains in some use cases, but might show diminishing returns from increased token usage. This setting can also sometimes be prone to overthinking. Test max effort for intelligence-demanding tasks. * **`xhigh`:** Extra high effort is the best setting for most coding and agentic use cases. * **`high`:** This setting balances token usage and intelligence. For most intelligence-sensitive use cases, use a minimum of `high` effort. * **`medium`:** Good for cost-sensitive use cases that need to reduce token usage while trading off intelligence. * **`low`:** Reserve for short, scoped tasks and latency-sensitive workloads that are not intelligence-sensitive. -Claude Opus 4.8 respects effort levels strictly, especially at the low end. At `low` and `medium`, the model scopes its work to what was asked rather than going above and beyond. This is good for latency and cost, but on moderately complex tasks running at `low` effort there is some risk of under-thinking. +Claude Opus 4.8 respects effort levels strictly, especially at the low end. At `low` and `medium`, the model scopes its work to what was asked rather than going beyond the request. This is good for latency and cost, but on moderately complex tasks running at `low` effort there is some risk of under-thinking. If you observe shallow reasoning on complex problems, raise effort to `high` or `xhigh` rather than prompting around it. If you need to keep effort at `low` for latency, add targeted guidance: @@ -44,7 +44,7 @@ This task involves multistep reasoning. Think carefully through the problem befo Effort is likely to be more important for this model than for any prior Opus, so experiment with it actively when you upgrade. -On Claude Opus 4.8, thinking is off unless you explicitly set `thinking: {type: "adaptive"}`. The triggering behavior for [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is steerable. If you find the model thinking more often than you'd like, which can happen with large or complex system prompts, add guidance to steer it. As always, measure the effect of any prompting changes on performance. Example: +On Claude Opus 4.8, thinking is off unless you explicitly set `thinking: {type: "adaptive"}`. The triggering behavior for [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is steerable. If you find the model thinking more often than you'd like, which can occur with large or complex system prompts, add guidance to steer it. As always, measure the effect of any prompting changes on performance. Example: ```text wrap Thinking adds latency and should only be used when it will meaningfully improve answer quality — typically for problems that require multistep reasoning. When in doubt, respond directly. @@ -70,7 +70,7 @@ Claude Opus 4.8 interprets prompts literally and explicitly, particularly at low ## Tone and writing style -As with any new model, prose style on long-form writing may shift. Claude Opus 4.8 tends toward a direct, opinionated style with minimal validation-forward phrasing and sparing emoji use. If your product relies on a specific voice, re-evaluate style prompts against the new baseline. +As with any new model, prose style on long-form writing might shift. Claude Opus 4.8 tends toward a direct, opinionated style with minimal validation-forward phrasing and sparing emoji use. If your product relies on a specific voice, re-evaluate style prompts against the new baseline. For instance, if your product voice is warmer or more conversational, add: @@ -90,7 +90,7 @@ Spawn multiple subagents in the same turn when fanning out across items or readi ## Design and frontend defaults -Claude Opus 4.8 has strong design instincts, with a consistent default house style: warm cream/off-white backgrounds (\~`#F4F1EA`), serif display type (Georgia, Fraunces, Playfair), italic word-accents, and a terracotta/amber accent. This reads well for editorial, hospitality, and portfolio briefs, but will feel off for dashboards, dev tools, fintech, healthcare, or enterprise apps. The default appears in slide decks and web UIs. +Claude Opus 4.8 has strong design instincts, with a consistent default house style: warm cream/off-white backgrounds (\~`#F4F1EA`), serif display type (Georgia, Fraunces, Playfair), italic word-accents, and a terracotta/amber accent. This reads well for editorial, hospitality, and portfolio briefs, but feels off for dashboards, dev tools, fintech, healthcare, or enterprise apps. The default appears in slide decks and web UIs. This default is persistent. Generic instructions ("don't use cream," "make it clean and minimal") tend to shift the model to a different fixed palette rather than producing variety. Two approaches work reliably: @@ -125,7 +125,7 @@ Color palette should stay within this range: Before building, propose 4 distinct visual directions tailored to this brief (each as: bg hex / accent hex / typeface — one-line rationale). Ask the user to pick one, then implement only that direction. ``` -Additionally, Claude Opus 4.8 requires less frontend design prompting than previous models to avoid generic patterns that users call the "AI slop" aesthetic. With earlier models, Anthropic recommended a lengthier prompt snippet in the [frontend-design skill](https://github.com/anthropics/claude-code/blob/main/plugins/frontend-design/skills/frontend-design/SKILL.md). However, Claude Opus 4.8 generates distinctive, creative frontends with more minimal prompting guidance. This prompt snippet works well with the preceding prompting advice for variety: +Additionally, Claude Opus 4.8 requires less frontend design prompting than previous models to avoid generic patterns that users call the "AI slop" aesthetic. With earlier models, Anthropic recommended a lengthier prompt snippet in the [frontend-design skill](https://github.com/anthropics/claude-code/blob/main/plugins/frontend-design/skills/frontend-design/SKILL.md). However, Claude Opus 4.8 generates distinctive, creative front ends with more minimal prompting guidance. This prompt snippet works well with the preceding prompting advice for variety: ```text wrap @@ -135,13 +135,13 @@ NEVER use generic AI-generated aesthetics like overused font families (Inter, Ro ## Interactive coding products -Claude Opus 4.8's token usage and behavior can differ between autonomous, asynchronous coding agents with a single user turn and interactive, synchronous coding agents with multiple user turns. Specifically, it tends to use more tokens in interactive settings, primarily because it reasons more after user turns. This can improve long-horizon coherence, instruction following, and coding capabilities in long, interactive coding sessions, but also comes with more token usage. To maximize both performance and token efficiency in coding products, use `xhigh` or `high` effort, add autonomous features like an auto mode, and reduce the number of human interactions required from your users. +Claude Opus 4.8's token usage and behavior can differ between autonomous, asynchronous coding agents with a single user turn and interactive, synchronous coding agents with multiple user turns. Specifically, it tends to use more tokens in interactive settings, primarily because it reasons more after user turns. This can improve long-horizon coherence, instruction following, and coding capabilities in long, interactive coding sessions, but also comes with more token usage. To maximize both performance and token efficiency in coding products, use `xhigh` or `high` effort, add autonomous features such as an auto mode, and reduce the number of human interactions required from your users. Of course, when limiting the number of required user interactions, it's important to specify the task, intent, and relevant constraints upfront in the first human turn. Providing well-specified, clear, and accurate task descriptions upfront can help maximize autonomy and intelligence while minimizing extra token usage after user turns. Because Claude Opus 4.8 is more autonomous than prior models, this usage pattern helps to maximize performance. In contrast, ambiguous or underspecified prompts conveyed progressively over multiple user turns tend to relatively reduce token efficiency and sometimes performance. ## Code review harnesses -Claude Opus 4.8 is meaningfully better at finding bugs than prior models, and has both higher recall and precision in internal evals. However, if your code-review harness was tuned for an earlier model, you may initially see lower recall. This is likely a harness effect, not a capability regression. When a review prompt says things like "only report high-severity issues," "be conservative," or "don't nitpick," Claude Opus 4.8 may follow that instruction more faithfully than earlier models did: it may investigate the code just as thoroughly, identify the bugs, and then not report findings it judges to be below your stated bar. This can show up as the model doing the same depth of investigation but converting fewer investigations into reported findings, especially on lower-severity bugs. Precision typically rises, but measured recall can fall even though the model's underlying bug-finding ability has improved. +Claude Opus 4.8 is meaningfully better at finding bugs than prior models, and has both higher recall and precision in internal evals. However, if your code-review harness was tuned for an earlier model, you may initially see lower recall. This is likely a harness effect, not a capability regression. When a review prompt says things like "only report high-severity issues," "be conservative," or "don't nitpick," Claude Opus 4.8 may follow that instruction more faithfully than earlier models did: it may investigate the code just as thoroughly, identify the bugs, and then not report findings it determines to be below your stated bar. This can show up as the model doing the same depth of investigation but converting fewer investigations into reported findings, especially on lower-severity bugs. Precision typically rises, but measured recall can fall even though the model's underlying bug-finding ability has improved. Some recommended prompt language: @@ -151,7 +151,7 @@ Report every issue you find, including ones you are uncertain about or consider This prompt can be used without having an actual second step, but moving confidence filtering out of the finding step often helps. If your harness has a separate verification, deduplication, or ranking stage, tell the model explicitly that its job at the finding stage is coverage rather than filtering. -If you do want the model to self-filter in a single pass, be concrete about where the bar is rather than using qualitative terms like "important": for example, "report any bugs that could cause incorrect behavior, a test failure, or a misleading result; only omit nits like pure style or naming preferences." +If you do want the model to self-filter in a single pass, be concrete about where the bar is rather than using qualitative terms such as "important": for example, "report any bugs that could cause incorrect behavior, a test failure, or a misleading result; only omit nits like pure style or naming preferences." Iterate on prompts against a subset of your evals or test cases to validate recall or F1 score gains. diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5.md index 69230adb20..690173c0de 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5.md @@ -1,19 +1,19 @@ --- title: Prompting Claude Opus 5.5 url: https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5 -description: "Behavioral differences from Claude Opus 5 and the prompting and harness patterns that address them: effort calibration, thinking behavior in API integrations and chat, progress updates, unattended and multiagent tasks, safeguard refusals, frontend design, complex visual inputs, multi-app workflows, and pasted text in user messages." +description: "Behavioral differences from Claude Opus 5 and the prompting and harness patterns that address them: effort calibration, thinking behavior in API integrations and chat, progress updates, unattended and multiagent tasks, safeguard refusals, frontend design, complex visual inputs, multiapp workflows, and pasted text in user messages." --- This guide covers the prompting patterns specific to Claude Opus 5.5. For the model's capabilities and API changes, see [What's new in Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5). For techniques that apply across all current Claude models, see [Prompting best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices). -Claude Opus 5.5 generates output tokens more than 30 percent faster than Claude Opus 5 and tends to finish the same task with fewer tokens. Existing Claude Opus 5 prompts should perform well without changes, and the patterns in [Prompting Claude Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5) remain a reasonable starting point. Start with the section that matches what you observe: +Claude Opus 5.5 generates output tokens more than 30 percent faster than Claude Opus 5 and tends to complete the same task with fewer tokens. Existing Claude Opus 5 prompts should perform well without changes, and the patterns in [Prompting Claude Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5) remain a reasonable starting point. Start with the section that matches what you observe: -* Unsure which effort level to run, or turns run longer and cost more than they did on Claude Opus 5: [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort) +* You're unsure which effort level to run, or turns run longer and cost more than they did on Claude Opus 5: [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort) * Your Claude Opus 5 integration ran with thinking disabled: [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled) * An unattended agent stops partway through a long task after reporting progress: [Unattended agentic runs](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#unattended-agentic-runs) * Requests return `stop_reason: "refusal"`: [Safeguard refusals](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#safeguard-refusals) * Long agentic turns look silent, or you want updates at predictable points: [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates) -* An agent that works across several connected apps misses information the task didn't point to: [Explore context in multi-app workflows](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#explore-context-in-multi-app-workflows) +* An agent that works across several connected apps misses information the task didn't point to: [Explore context in multiapp workflows](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#explore-context-in-multi-app-workflows) * You run a team of agents and want it to finish sooner: [Time signals for multiagent harnesses](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#time-signals-for-multi-agent-harnesses) * Replies in a chat application start slowly because the model thinks at length first: [Thinking instructions in chat system prompts](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#thinking-instructions-in-chat-system-prompts) * The model follows instructions that arrived inside text a user pasted: [Mark pasted text in user messages](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#mark-pasted-text-in-user-messages) @@ -28,7 +28,7 @@ Claude Opus 5.5 generates output tokens more than 30 percent faster than Claude The capabilities that matter most for prompting are: -* **Agentic coding and code review:** The model is strongest on multistep work in a real repository, such as carrying a change through a large code base until its tests pass. In Anthropic's testing, at its default `medium` effort the model matched or beat Claude Opus 5 at `high` effort on such tasks, in fewer steps and with fewer tokens. It also sustains long-running autonomous work better than Claude Opus 5, such as multi-hour audits and migrations of large code bases run end to end with parallel subagents and little oversight. Early testers also reported stronger code review, with more bugs caught than on Claude Opus 5 and fewer false alarms, and it explains its changes in plain language. +* **Agentic coding and code review:** The model is strongest on multistep work in a real repository, such as carrying a change through a large code base until its tests pass. In Anthropic's testing, at its default `medium` effort the model matched or beat Claude Opus 5 at `high` effort on such tasks, in fewer steps and with fewer tokens. It also sustains long-running autonomous work better than Claude Opus 5, such as multihour audits and migrations of large code bases run end to end with parallel subagents and little oversight. Early testers also reported stronger code review, with more bugs caught than on Claude Opus 5 and fewer false alarms, and it explains its changes in plain language. * **Knowledge work:** The model is much less likely to state an incorrect figure or cite the wrong source. It's better at financial modeling tasks, such as building a financial model and one-page summary for a transaction or finding and fixing errors in a valuation workbook, and it catches details that are easy to miss in large inputs, such as a date in a long planning thread that falls on the wrong weekday or a chart in a slide deck that doesn't match the underlying figures. The spreadsheets, slides, and documents it produces need less editing before you share them. * **Communication:** Its reports on agentic work, both the updates while it works and the summary when it finishes, say plainly what it did, what it found, and what it needs from you. See [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates). * **Charts, diagrams, screenshots, and computer use:** The model reads visual material more accurately than Claude Opus 5 without extra tooling: in Anthropic's testing, even at its lowest effort setting it read values off dense charts more accurately than Claude Opus 5 did at its highest, using a small fraction of the output tokens. It is better, too, where meaning depends on position rather than text: which boxes an arrow connects in a flowchart, what changed between two versions of a diagram, or exactly when a meeting starts and ends in a calendar screenshot. It's also more reliable at computer use, where it operates applications from screenshots over many steps: at its default effort it matched the success rate that Claude Opus 5 reached only at a much higher effort setting. See [Tools for complex visual inputs](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#tools-for-complex-visual-inputs). @@ -50,15 +50,15 @@ Changing the top-level `effort` value between requests invalidates the prompt ca Claude Opus 5 accepts `thinking: {"type": "disabled"}` at `high` effort or below; Claude Opus 5.5 doesn't, and the [migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-5) covers the request change. If your Claude Opus 5 integration ran with thinking disabled, four changes go with it: * **Start at `low` effort and measure.** At `low` the model keeps its thinking short. How often it skips thinking altogether depends on your prompts, so measure latency and quality on your own traffic and move to `medium` if quality drops. If time to first token still matters after that, a system prompt line such as "Answer directly without deliberating." can reduce thinking further; measure quality when you add it, because less thinking can lower it. -* **Remove instructions that stood in for thinking.** If your prompt asked the model to write out its reasoning in the response as a substitute for thinking, remove that instruction and read the reasoning from [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks instead (`display: "summarized"`); a prompt that pushes the model to reproduce its reasoning in the response text may be declined with the `reasoning_extraction` [refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). +* **Remove instructions that stood in for thinking.** If your prompt asked the model to write its reasoning in the response as a substitute for thinking, remove that instruction and read the reasoning from [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks instead (`display: "summarized"`); a prompt that pushes the model to reproduce its reasoning in the response text might be declined with the `reasoning_extraction` [refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). * **Re-test the thinking-disabled mitigations.** [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) recommends a combined instruction (permission to speak before a tool call, what to do when no tool fits, no internal tags) and removing any rule that tells the model not to think. Both address artifacts that appear on Claude Opus 5 only when thinking is disabled. With thinking always on, check whether you still need the instruction, and remove the no-thinking rule either way. -* **Read the response by block type.** Check each block's type instead of assuming the first content block is text: a response may or may not begin with a `thinking` block, whose `thinking` field is empty under the default `display: "omitted"`. +* **Read the response by block type.** Check each block's type instead of assuming the first content block is text: a response might or might not start with a `thinking` block, whose `thinking` field is empty under the default `display: "omitted"`. ## Unattended agentic runs On long tasks with several parts, Claude Opus 5.5 keeps the user updated as it works, and some of those updates end the turn with text rather than a tool call ([`stop_reason: "end_turn"`](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons#end-turn)). An unattended agent loop that treats such a turn as the end of the task stops running there. A few harness and prompt changes help it keep running. -Treat a text-only end of turn as a report rather than as proof the task is done. Keep the task's parts in a checklist the model updates, such as a to-do tool or a file. If a turn ends with items still open and no blocker stated, send a short user message naming them, like the following one. You can also state the completion condition up front and have a separate, smaller model check the conversation against it at each end of turn, returning its reason as the next user message when the condition isn't met. Either way, stop after two or three automatic continuations on the same task rather than repeating them indefinitely, so that a run that is genuinely stuck ends and can be reviewed. +Treat a text-only end of turn as a report rather than as proof the task is done. Keep the task's parts in a checklist the model updates, such as a to-do tool or a file. If a turn ends with items still open and no blocker stated, send a short user message naming them, such as the following one. You can also state the completion condition up front and have a separate, smaller model check the conversation against it at each end of turn, returning its reason as the next user message when the condition isn't met. Either way, stop after two or three automatic continuations on the same task rather than repeating them indefinitely, so that a run that is genuinely stuck ends and can be reviewed. ```text wrap Your task list still has open items: migrate the remaining two endpoints and update their tests. Continue with them. If one is blocked, say what is blocking it. @@ -68,7 +68,7 @@ If something the model started is still running, such as a background command or A system prompt addition can also make these early stops less frequent. Claude Opus 5.5 is responsive to instructions that name the specific kinds of early stop you want it to avoid, such as ending the turn with a summary that announces the next step instead of taking it. It also helps to name the stops you do want, for example when no work can advance without the user's input. -The following paragraph is one example of such an addition, written for agents that run fully unattended, where you want the model to keep working rather than stop to report. Treat it as a starting point: you might need to adapt it for your own application. Add it at the end of your system prompt from the first request of the session: adding it partway through changes the `system` prompt and invalidates the conversation's earlier thinking blocks (see [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions)). Because it tells the model to put status notes in the same message as its next tool call, those notes arrive between tool calls as progress updates, whose text comes back empty at the default `thinking.display`; set `display: "updates"` to receive a summary of each (see [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates)). With this addition the model carries on where it would otherwise have stopped to check in, so keep your own confirmation step for risky or irreversible actions, and leave the addition out of human-in-the-loop applications, where someone is there to answer. Expect somewhat more tool calls and output tokens per task. +The following paragraph is one example of such an addition, written for agents that run fully unattended, where you want the model to keep working rather than stop to report. Treat it as a starting point: you might need to adapt it for your own application. Add it at the end of your system prompt from the first request of the session: adding it partway through changes the `system` prompt and invalidates the conversation's earlier thinking blocks (see [Add instructions with a mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#new-instructions)). Because it tells the model to put status notes in the same message as its next tool call, those notes arrive between tool calls as progress updates, whose text comes back empty at the default `thinking.display`; set `display: "updates"` to receive a summary of each (see [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates)). With this addition the model carries on where it would otherwise have stopped to check in, so keep your own confirmation step for risky or irreversible actions, and leave the addition out of human-in-the-loop applications, where someone is there to answer. Expect somewhat more tool calls and output tokens per task. ```text wrap A standing instruction from the user, the person you are working for. It is about how your turns end. A message with no tool call in it ends your turn, and the work stops there until you are asked to continue. The user has seen you end turns in four ways while work they asked for was still owed, and does not want any of them. One: a long summary of what was done that closes by announcing the next step and has no tool call, so the next thing never starts. Two: an offer to carry on with something unless the user would prefer otherwise, which stops to wait for an answer the user was not going to give. Three: a list of decisions for the user when, by your own account, none of them blocks the rest of the work. Four: deciding that this is a good place to report, because the turn has been long or a milestone is done. Status notes are welcome, and so are your recommendations on open decisions, but put them in the same message as your next tool call and carry on with whatever does not depend on the user's answer. If you notice yourself inviting the user to redirect you or offering to wait, delete it and do the next thing. The stops the user does want are the ones where nothing can move without them, or where the thing blocking you is deliberately protected from you. This does not override the need for confirmation on risky or destructive actions. @@ -80,7 +80,7 @@ Claude Opus 5.5 runs safety classifiers, including for biology, cybersecurity, a * **Biology:** The biology safeguards are the same as Claude Fable 5.1's and are new if you're coming from Claude Opus 5. Everyday health and educational questions are unaffected. If the biology classifier gets in the way of your organization's life sciences work, apply to the [Life Sciences Verification Program](https://www.anthropic.com/news/life-sciences-verification-program). * **Cybersecurity:** Finding vulnerabilities in source code is allowed. High-risk dual-use cybersecurity activities are not. If the cybersecurity classifier gets in the way of your organization's legitimate security work, apply to the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). -* **Reasoning extraction:** Requests that push the model to reproduce its internal reasoning in the response text may be declined with the `reasoning_extraction` category. If your prompts ask the model to write out its reasoning in the response, remove those instructions, set `display: "summarized"`, and read the summarized reasoning from the thinking blocks instead; see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled). You can still ask for a short explanation of the answer or a summary of the actions taken; see [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). +* **Reasoning extraction:** Requests that push the model to reproduce its internal reasoning in the response text might be declined with the `reasoning_extraction` category. If your prompts ask the model to write its reasoning in the response, remove those instructions, set `display: "summarized"`, and read the summarized reasoning from the thinking blocks instead; see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled). You can still ask for a short explanation of the answer or a summary of the actions taken; see [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). A classifier decline arrives as a normal response with `stop_reason: "refusal"` and a `stop_details` object naming the category. You can have the request retried automatically on a fallback model, except for `reasoning_extraction` declines, which server-side fallback returns to you instead of retrying; see [Refusals and fallback](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#refusals-and-fallback). @@ -88,19 +88,19 @@ A classifier decline arrives as a normal response with `stop_reason: "refusal"` Between tool calls, Claude Opus 5.5 writes short user-facing progress updates: what it just found and what it's doing next. Four levers control what your users see. -First, check that your client receives them: on Claude Opus 5.5 these notes come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) rather than `text` blocks, and their text is empty at the default `thinking.display`, so a client that renders only `text` blocks can look silent during a long agentic turn. Set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header) to receive a short summary of each note; the [migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#text-between-tool-calls) shows how to render them. +First, check that your client receives them: on Claude Opus 5.5 these notes come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) rather than `text` blocks, and their text is empty at the default `thinking.display`, so a client that renders only `text` blocks can look silent during a long agentic turn. Set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header) to receive a short summary of each note; see [Text between tool calls is returned in thinking blocks](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#text-between-tool-calls) for how to render them. -Second, if the model may need to hand the user something verbatim partway through a long turn, such as a code snippet, give it a simple tool for sending the user a message and tell it to reserve the tool for that content. Declare the tool in `tools` from the first request of the session: adding it to `tools` later edits the conversation's prefix and invalidates earlier thinking blocks (see [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#tool-changes)). +Second, if the model might need to hand the user something verbatim partway through a long turn, such as a code snippet, give it a simple tool for sending the user a message and tell it to reserve the tool for that content. Declare the tool in `tools` from the first request of the session: adding it to `tools` later edits the conversation's prefix and invalidates earlier thinking blocks (see [tool changes in Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#tool-changes)). Third, if you want more frequent or predictable updates, such as a one-line statement of intent before the first tool call and a short recap at the end, say so in the system prompt; the model is responsive to such instructions. This helps most in human-in-the-loop work. -Fourth, if long tool-calling turns still go quiet for longer than you want, have your harness ask for an update. With `display: "updates"` set (the first lever), count consecutive tool-calling steps that give the user nothing to read: no `text` block and no progress-update text. After several in a row (five, for example), append a reminder like the following one after the latest tool results, as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`; beta, `mid-conversation-system-clear-at-2026-08-21` header). If the turn stays quiet, stop after two or three reminders rather than sending more. Because each reminder is appended and left in place, rather than inserted for one request and deleted on the next, the prompt cache keeps matching and the [thinking blocks](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) that follow it stay valid. In Anthropic's testing on agentic coding tasks, this roughly halved the share of tasks with a long silent stretch, with no measurable change in cost. +Fourth, if long tool-calling turns still go quiet for longer than you want, have your harness ask for an update. With `display: "updates"` set (the first lever), count consecutive tool-calling steps that give the user nothing to read: no `text` block and no progress-update text. After several in a row (five, for example), append a reminder such as the following one after the latest tool results, as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`, in beta with the `mid-conversation-system-clear-at-2026-08-21` header). If the turn stays quiet, stop after two or three reminders rather than sending more. Because each reminder is appended and left in place, rather than inserted for one request and deleted on the next, the prompt cache keeps matching and the [thinking blocks](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#per-turn-reminders) that follow it stay valid. In Anthropic's testing on agentic coding tasks, this roughly halved the share of tasks with a long silent stretch, with no measurable change in cost. ```text wrap The user hasn't heard from you in a while — say in a few words what you're doing, then continue. ``` -## Explore context in multi-app workflows +## Explore context in multiapp workflows In workflow automation across several connected apps, such as email, documents, spreadsheets, and CRM records, the information a task depends on often sits somewhere the request doesn't explicitly mention: for example, a policy in an old email thread, a rule on another spreadsheet tab, or a note on a customer record. Claude Opus 5.5 tends to get to work quickly, and on loosely specified tasks it helps to tell the model to look through the relevant sources before acting. If your agent works across several apps on tasks like these, one sentence in the system prompt makes it look around before it changes anything: @@ -108,11 +108,11 @@ In workflow automation across several connected apps, such as email, documents, Before taking any action, explore broadly with tool calls: list and open the emails, documents, spreadsheet tabs and records across the available apps that could be relevant to this task, including ones the task does not explicitly mention, and use what you find. ``` -In Anthropic's testing on multi-app automation tasks, Claude Opus 5.5 completed noticeably more of them correctly with this instruction, at both `medium` and `max` effort, at the cost of slightly more tool calls and tokens. Because it tells the model to act on what it finds, keep untrusted content out of the records it searches. +In Anthropic's testing on multiapp automation tasks, Claude Opus 5.5 completed noticeably more of them correctly with this instruction, at both `medium` and `max` effort, at the cost of slightly more tool calls and tokens. Because it tells the model to act on what it finds, keep untrusted content out of the records it searches. ## Time signals for multiagent harnesses -Claude Opus 5.5 pays close attention to information about elapsed time, and in a multiagent setup, for example a lead agent that delegates to subagents, you can use that to speed up the work through better parallelization. If you can estimate how long the task should take, give the model a time budget: have your harness add a short line at the end of each message it sends back to the model giving the elapsed time against that budget, in seconds, for example `elapsed 340s / 1200s`. The model paces its work to finish inside the budget and usually finishes well before it, so set the budget somewhat above the time you actually want spent and tune it on a sample of your own tasks. If you can't predict a sensible budget, show the elapsed time alone and add one sentence to the system prompt: +Claude Opus 5.5 is highly responsive to information about elapsed time, and in a multiagent setup, for example a lead agent that delegates to subagents, you can use that to speed up the work through better parallelization. If you can estimate how long the task should take, give the model a time budget: have your harness add a short line at the end of each message it sends back to the model giving the elapsed time against that budget, in seconds, for example `elapsed 340s / 1200s`. The model paces its work to finish inside the budget and usually finishes well before it, so set the budget somewhat above the time you actually want spent and tune it on a sample of your own tasks. If you can't predict a sensible budget, show the elapsed time alone and add one sentence to the system prompt: ```text wrap Time matters here: do not spend time that can be avoided, and the earlier a correct result is obtained, the better. @@ -122,7 +122,7 @@ In Anthropic's evaluations of small agent teams on research tasks, both signals ## Thinking instructions in chat system prompts -In chat applications, if your system prompt contains instructions that tell Claude to think carefully before answering, consider removing them for Claude Opus 5.5. The model determines how much to think, and [effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort) is the main control. In Anthropic's testing in a chat product, removing such a line made replies start sooner, with no clear decline in the quality of the reply. +In chat applications, if your system prompt contains instructions that tell Claude to think carefully before answering, consider removing them for Claude Opus 5.5. The model determines how much to think, and the [effort level](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort) is the main control. In Anthropic's testing in a chat product, removing such a line made replies start sooner, with no clear decline in the quality of the reply. In multi-turn chat, Claude Opus 5.5 sometimes goes back over an earlier answer while it thinks about a new message, even a short follow-up, which adds thinking and latency on later turns. If you would rather the model treat earlier answers as settled, add two sentences at the end of the system prompt: @@ -130,11 +130,11 @@ In multi-turn chat, Claude Opus 5.5 sometimes goes back over an earlier answer w Once you have answered something, treat that answer as done. On later turns, focus your thinking on what the user is asking now, and don't go back over an earlier answer unless the user asks about it or points out a problem with it. ``` -In Anthropic's testing this reduced thinking on follow-up turns and made replies start sooner without affecting quality. Leave it out where you want the model to keep re-examining its earlier work, for example in long analyses, or in agentic tasks where a later step can reveal a mistake in an earlier one. The instruction may also make the model less likely to point out a mistake in an earlier answer on its own, so if that matters for your application, test for it before adopting the instruction. +In Anthropic's testing this reduced thinking on follow-up turns and made replies start sooner without affecting quality. Leave it out where you want the model to keep re-examining its earlier work, for example in long analyses, or in agentic tasks where a later step can reveal a mistake in an earlier one. The instruction might also make the model less likely to point out a mistake in an earlier answer on its own, so if that matters for your application, test for it before adopting the instruction. ## Mark pasted text in user messages -Claude Opus 5.5 resists indirect prompt injection, meaning instructions that arrive through tool results, web pages, and on-screen or browser content, better than any earlier Opus model. With the right context it is also robust against instructions inside content a user copied into their message from elsewhere, such as an email or a web page. To get that behavior, mark which text is the user's own and which was pasted from somewhere else. Wrap each pasted block in an opening and a closing tag that both carry the same short random ID, generated by your application, with each tag on its own line: +Claude Opus 5.5 resists indirect prompt injection, meaning instructions that arrive through tool results, webpages, and on-screen or browser content, better than any earlier Opus model. With the right context it is also robust against instructions inside content a user copied into their message from elsewhere, such as an email or a webpage. To get that behavior, mark which text is the user's own and which was pasted from somewhere else. Wrap each pasted block in an opening and a closing tag that both carry the same short random ID, generated by your application, with each tag on its own line: ```text wrap Summarize the main complaints in this thread. @@ -154,7 +154,7 @@ This can make the model slightly more cautious at times, so measure the effect o ## Tools for complex visual inputs -Because Claude Opus 5.5 reads charts, diagrams, and screenshots considerably more precisely than Claude Opus 5 without tools (see [Capabilities relevant to prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#capability-improvements)), re-test whether you still need scaffolding you built for visual inputs on earlier models. For the densest inputs, two things still add accuracy. Higher-resolution images help, most of all for inputs like technical drawings. So do image-processing tools: run the model as an agent with access to a container that holds the raw images and has libraries such as PIL and OpenCV installed, so that it can crop, zoom, measure, and verify its work. If a container is too much overhead, a cropping tool alone still helps; the [crop tool recipe](https://platform.claude.com/cookbook/multimodal-crop-tool) has a working definition. The model uses these tools more effectively at higher effort levels. Without tools, raising effort improves its reading of technical drawings but does little for charts. +Because Claude Opus 5.5 reads charts, diagrams, and screenshots considerably more precisely than Claude Opus 5 without tools (see [Capabilities relevant to prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#capability-improvements)), re-test whether you still need scaffolding you built for visual inputs on earlier models. For the densest inputs, two things still add accuracy. Higher-resolution images help, most of all for inputs such as technical drawings. So do image-processing tools: run the model as an agent with access to a container that holds the raw images and has libraries such as PIL and OpenCV installed, so that it can crop, zoom, measure, and verify its work. If a container is too much overhead, a cropping tool alone still helps; the [crop tool recipe](https://platform.claude.com/cookbook/multimodal-crop-tool) has a working definition. The model uses these tools more effectively at higher effort levels. Without tools, raising effort improves its reading of technical drawings but does little for charts. ## Frontend design defaults diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5.md index 415b1bfd56..edf45adee7 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-opus-5.md @@ -12,13 +12,13 @@ Claude Opus 5 is built for complex agentic coding and enterprise work, with part Compared with Claude Opus 4.8, the improvements most relevant to prompting are: -* **Agentic coding:** Claude Opus 5 is strongest on difficult coding tasks: multi-file features, larger refactors, and end-to-end feature work. It completes full tasks rather than leaving stubs or placeholders, and it performs best when given the complete task specification up front and left to run. It also performs well on easier tasks like single-turn edits, where the difference from prior models is smaller. -* **Code review and bug-finding:** Claude Opus 5 reviews code with high precision and recall: it finds real bugs at a high rate per pass, and its additional findings are mostly real issues rather than false positives. Accuracy holds at lower effort settings, which supports a fast pass at review time and a more thorough pass later. If your review prompt says "only report high-severity issues" or "be conservative," the model may follow that instruction literally and report less; ask it to report everything and filter in a separate pass instead. +* **Agentic coding:** Claude Opus 5 is strongest on difficult coding tasks: multifile features, larger refactors, and end-to-end feature work. It completes full tasks rather than leaving stubs or placeholders, and it performs best when given the complete task specification up front and left to run. It also performs well on easier tasks such as single-turn edits, where the difference from prior models is smaller. +* **Code review and bug-finding:** Claude Opus 5 reviews code with high precision and recall: it finds real bugs at a high rate per pass, and its additional findings are mostly real issues rather than false positives. Accuracy holds at lower effort settings, which supports a fast pass at review time and a more thorough pass later. If your review prompt says "only report high-severity issues" or "be conservative," the model might follow that instruction literally and report less; ask it to report everything and filter in a separate pass instead. * **Efficiency at lower effort:** `low` and `medium` [effort](https://platform.claude.com/docs/en/build-with-claude/effort) produce strong quality at a fraction of the tokens and latency of higher settings. Start with the default (`high`) and adjust based on your evals: use `low` and `medium` liberally as your primary control for token cost and response time wherever quality holds, and step up to `xhigh` for demanding coding and agentic work. If you carried effort defaults over from a prior model, re-run an effort sweep on your own evals. See [Effort](https://platform.claude.com/docs/en/build-with-claude/effort#recommended-effort-levels-for-claude-opus-5) for the full recommendations. -* **Vision:** Claude Opus 5 is strong on chart, document, and diagram understanding, and on UI and frontend visual replication. Re-validate any prompt-side vision workarounds you tuned for prior models; they may no longer be needed. Vision performance is strongest when the model has tools to iteratively analyze, crop, and visually verify its work, and tool use is a more cost-effective lever than thinking alone. +* **Vision:** Claude Opus 5 is strong on chart, document, and diagram understanding, and on UI and frontend visual replication. Re-validate any prompt-side vision workarounds you tuned for prior models; they might no longer be needed. Vision performance is strongest when the model has tools to iteratively analyze, crop, and visually verify its work, and tool use is a more cost-effective lever than thinking alone. * **Long-context work:** Claude Opus 5 has a [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) as both the default and the maximum, and its instruction following, tool calling, and reasoning stay consistent throughout the window. -* **Office and document tasks:** Claude Opus 5 generates and works with complex, multi-sheet spreadsheets with non-trivial formulas, and it produces well-structured slide decks. Prompt it with any specific styles or templates it needs to follow. -* **Multi-agent coordination:** Claude Opus 5 coordinates teams of subagents well, with effective writer-verifier patterns and few cases of agents overwriting each other's work. For cost-sensitive workloads, cap delegation; see [Controlling subagent spawning](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#controlling-subagent-spawning). +* **Office and document tasks:** Claude Opus 5 generates and works with complex, multisheet spreadsheets with non-trivial formulas, and it produces well-structured slide decks. Prompt it with any specific styles or templates it needs to follow. +* **Multiagent coordination:** Claude Opus 5 coordinates teams of subagents well, with effective writer-verifier patterns and few cases of agents overwriting each other's work. For cost-sensitive workloads, cap delegation; see [Controlling subagent spawning](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#controlling-subagent-spawning). ## Response length and verbosity @@ -68,13 +68,13 @@ Deliver what was asked, at the scope intended. Make routine judgment calls yours ## Controlling subagent spawning -Claude Opus 5 delegates to subagents more readily than prior models. Delegation pays off on genuinely independent, sizeable tracks of work, but it multiplies cost and time when applied to small tasks. If your harness supports subagents, give explicit guidance on which scenarios warrant delegation, or set deterministic caps on how many agents can be launched. For example: +Claude Opus 5 delegates to subagents more readily than prior models. Delegation is worthwhile for genuinely independent, sizeable tracks of work, but it multiplies cost and time when applied to small tasks. If your harness supports subagents, give explicit guidance on which scenarios warrant delegation, or set deterministic caps on how many agents can be launched. For example: ```text wrap Delegate to a subagent only for large tasks that are genuinely independent and parallelizable, such as a wide multi-file investigation. Do not delegate work you can finish yourself in a handful of tool calls, and do not use subagents to verify or double-check your own work. If one subagent can complete the task, use one rather than several, and keep spawn counts low. ``` -If your harness is Claude Code or the Claude Agent SDK, the deterministic caps are the `CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH` and `CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS` environment variables and the SDK's `max_budget_usd` (typescript: `maxBudgetUsd`) option. They require Claude Code 2.1.217 or later, so update a pinned SDK before pointing it at Claude Opus 5. Claude Code adds a delegation instruction of its own on Claude Opus 5 only when you use its `claude_code` system prompt preset; with a custom or omitted system prompt, add a delegation instruction such as the example in this section yourself. See [Cap subagent depth, concurrency, and spend](https://code.claude.com/docs/en/agent-sdk/subagents#cap-subagent-depth-concurrency-and-spend) in the Agent SDK docs. +If your harness is Claude Code or the Claude Agent SDK, the deterministic caps are the `CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH` and `CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS` environment variables and the SDK's `max_budget_usd` (typescript: `maxBudgetUsd`) option. Older versions of Claude Code don't have them, so use the latest version and update a pinned SDK before pointing it at Claude Opus 5. Claude Code adds a delegation instruction of its own on Claude Opus 5 only when you use its `claude_code` system prompt preset; with a custom or omitted system prompt, add a delegation instruction such as the example in this section yourself. See [Cap subagent depth, concurrency, and spend](https://code.claude.com/docs/en/agent-sdk/subagents#cap-subagent-depth-concurrency-and-spend) in the Agent SDK docs. ## Self-correction @@ -104,4 +104,4 @@ Instructions that call out thinking tags by name are less effective than the gen ## Reasoning in the response -Prompts, skills, and tool descriptions that ask Claude Opus 5 to write out its thinking or reasoning, verbatim or in a fixed format, may be declined with the `reasoning_extraction` [refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). Ask for a short explanation of the answer or a summary of the actions taken instead, and, if you need the reasoning, keep thinking on and read the [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks (`display: "summarized"`). See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). +Prompts, skills, and tool descriptions that ask Claude Opus 5 to write its thinking or reasoning, verbatim or in a fixed format, might be declined with the `reasoning_extraction` [refusal category](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). Ask for a short explanation of the answer or a summary of the actions taken instead, and, if you need the reasoning, keep thinking on and read the [summarized thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking) blocks (`display: "summarized"`). See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5.md index 793e54ac3a..09a6673c8c 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5.md @@ -28,7 +28,7 @@ Existing Claude Sonnet 5 prompts should perform well without changes, and the pa [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) is the main control for how much Claude Sonnet 5.5 thinks, and with it quality, latency, and cost. Its levels are recalibrated: a level doesn't produce the same amount of thinking as the same level on Claude Sonnet 5. Run a fresh sweep against your own evals rather than carrying over the setting you used on Claude Sonnet 5. Start at `high`, the default on the Claude API, unless your workload is agentic or latency-sensitive. For agentic coding and multistep tool use, start at `medium` for well-specified tasks and move to `high` for harder or longer ones. For chat and other latency-sensitive work, start at `medium` or `low`, because higher effort means a longer wait before the reply starts. Raise effort if quality needs it. -Lower effort also changes how the model finishes agentic work. At `low`, it keeps its thinking short and can skip verifying a change. See [Verification on coding tasks](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#verification-on-coding-tasks). At `low` and `medium`, on long agentic tasks, it's more likely to stop and check in with the user before it finishes. See [Steer initiative and scope](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#steer-initiative-and-scope). +Lower effort also changes how the model completes agentic work. At `low`, it keeps its thinking short and can skip verifying a change. See [Verification on coding tasks](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#verification-on-coding-tasks). At `low` and `medium`, on long agentic tasks, it's more likely to stop and check in with the user before it completes its work. See [Steer initiative and scope](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#steer-initiative-and-scope). Three adjustments help: @@ -52,9 +52,9 @@ When the work the user asked for is done and checked, stop and report. Don't add With this prompt, the model carries more of the work through at `low` and `medium` effort, so sessions at those levels run longer and cost more. The prompt doesn't replace your own rules about risky or irreversible actions. Keep those rules in your system prompt. -**Unrequested additions when coding.** The model tends to add tests, documentation, and small supporting files that fit your repository's conventions, even when you don't ask for them. It does this at every effort level, and more at higher effort. The requested change itself stays close to what was asked. Most teams will welcome this. If you prefer changes limited to what was explicitly requested, add only the second paragraph of that prompt, which starts "When the work the user asked for is done". At `xhigh` and `max` effort, that paragraph reduces these additions and makes changes smaller overall. +**Unrequested additions when coding.** The model tends to add tests, documentation, and small supporting files that fit your repository's conventions, even when you don't ask for them. It does this at every effort level, and more at higher effort. The requested change itself stays close to what was asked. Most teams will welcome this. If you prefer changes limited to what was explicitly requested, add only the second paragraph of that prompt, which starts "When the work the user asked for is done." At `xhigh` and `max` effort, that paragraph reduces these additions and makes changes smaller overall. -**Thoroughness at `xhigh` and `max` effort.** At these levels the model is especially thorough. After it finishes a task, it can start its own rounds of review and verification, sometimes with subagents if your harness provides them. It can also make related fixes it noticed along the way. This takes more time and tokens, so run routine work at `high` or below, where it's rare. If you do want that extra thoroughness of these effort levels, but want to direct it to the task itself, add this to your system prompt: +**Thoroughness at `xhigh` and `max` effort.** At these levels the model is especially thorough. After it completes a task, it can start its own rounds of review and verification, sometimes with subagents if your harness provides them. It can also make related fixes it noticed along the way. This takes more time and tokens, so run routine work at `high` or below, where it's rare. If you do want that extra thoroughness of these effort levels, but want to direct it to the task itself, add this to your system prompt: ```text wrap When the work the user asked for is done and its checks pass, stop and report. Don't start extra rounds of review or hardening on your own, and don't launch reviewer sub-agents unless the user asked for a review. If you think a deeper review is worth doing, say so at the end. @@ -62,7 +62,7 @@ When the work the user asked for is done and its checks pass, stop and report. D In testing on coding tasks at `max` effort, this stopped the model from launching reviewer subagents and cut session cost by about a third, with no change in quality. It makes self-started review rounds by the main agent less frequent but doesn't remove them entirely. -**Open-ended requests.** When a request is open-ended, for example "show me what you can do with this", the model can start building a presentation, report, or video when you only wanted ideas. If you want ideas or a plan first, say so in the request, or add this to your system prompt: +**Open-ended requests.** When a request is open-ended, for example "show me what you can do with this," the model can start building a presentation, report, or video when you only wanted ideas. If you want ideas or a plan first, say so in the request, or add this to your system prompt: ```text wrap When the user asks for ideas, options or a plan, give them that and stop. Don't start building or changing anything until they say to go ahead. @@ -72,8 +72,8 @@ When the user asks for ideas, options or a plan, give them that and stop. Don't To run Claude Sonnet 5.5 without up-front thinking, send `thinking: {"type": "between_tools"}`. It's the lowest thinking setting on this model, and it's accepted at `high` effort or below. If your integration runs with thinking off today, switch it to `between_tools` and check these points: -* **Send `between_tools` at `high` effort or below.** At `xhigh` or `max` effort, a request with `between_tools` returns a 400 error. With `between_tools`, effort also can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort per turn, use adaptive thinking. With `between_tools`, remove any instruction that tells the model not to think. Such instructions make it more likely that the model writes internal XML tags in its visible output. -* **Read the response by block type.** With adaptive thinking, a response can begin with a `thinking` block, whose `thinking` field is empty under the default `display: "omitted"`. With `between_tools`, a response can begin with a progress-update `thinking` block. Don't assume the first content block is text. +* **Send `between_tools` at `high` effort or below.** At `xhigh` or `max` effort, a request with `between_tools` returns a 400 error. With `between_tools`, effort also can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort for each turn, use adaptive thinking. With `between_tools`, remove any instruction that tells the model not to think. Such instructions make it more likely that the model writes internal XML tags in its visible output. +* **Read the response by block type.** With adaptive thinking, a response can start with a `thinking` block, whose `thinking` field is empty under the default `display: "omitted"`. With `between_tools`, a response can start with a progress-update `thinking` block. Don't assume the first content block is text. * **Pass back the `thinking` blocks unchanged.** With `between_tools`, notes the model writes between tool calls still come back as `thinking` blocks when they run longer than a sentence or two. Each block carries a summary of the note. Pass them back unchanged with the rest of the assistant turn. A block you send back gives the model the full note it wrote, not the summary. * **Use adaptive thinking for reasoning tasks without tools.** In a request without tools, `between_tools` means the model answers without thinking first. For tasks that need a few steps of working out, use adaptive thinking instead. See [Reasoning tasks with JSON output](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#reasoning-tasks-with-json-output). @@ -95,20 +95,20 @@ With this line, the model more often thinks before it answers. At `high` effort, **Use adaptive thinking rather than `between_tools`.** In a request without tools, the model doesn't think before it answers under `between_tools`. The line has no effect there, and accuracy on these tasks is lower. Use adaptive thinking for these requests, with the steps in this section. In testing, splitting the request in two, one request for the answer and one for the JSON, led to high answer accuracy and JSON compliance, but at very high cost and latency. -With structured outputs at `low` and `medium` effort, the model occasionally keeps thinking until it reaches `max_tokens`. At `high` effort and above, this almost never happens. Treat any response whose `stop_reason` is `"max_tokens"` as failed, even if its text holds valid JSON, and retry. Set `max_tokens` high enough for the thinking and the JSON, as [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#calibrate-effort) describes, but no higher than you're willing to spend on one attempt. +With structured outputs at `low` and `medium` effort, the model occasionally keeps thinking until it reaches `max_tokens`. At `high` effort and above, this almost never occurs. Treat any response whose `stop_reason` is `"max_tokens"` as failed, even if its text holds valid JSON, and retry. Set `max_tokens` high enough for the thinking and the JSON, as [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#calibrate-effort) describes, but no higher than you're willing to spend on one attempt. If you can't use structured outputs, ask for JSON in the prompt instead. The model then often works the problem out in the response text and writes the JSON at the end. The JSON usually holds the right answer, but a parser that expects the whole response to be JSON fails. Two things help: -* **Parse the last JSON value in the response.** Read only the `text` blocks, and treat a response whose `stop_reason` is `"max_tokens"` as failed. Starting at each `{` or `[`, try to parse a JSON value. When one parses, continue from the end of that value, so values nested inside it aren't counted on their own. Keep the last value found. Don't take everything from the first `{` to the last `}`. The model occasionally writes a draft before its final JSON, and that range would include both. If your answer is several JSON values in a row, such as one record per line, keep the last run of values separated only by spaces, commas, or line breaks. Check that the result has the fields you expect, and retry once if it doesn't. In testing, this made nearly every response usable without changing its accuracy. +* **Parse the last JSON value in the response.** Read only the `text` blocks, and treat a response whose `stop_reason` is `"max_tokens"` as failed. Starting at each `{` or `[`, try to parse a JSON value. When one parses, continue from the end of that value, so values nested inside it aren't counted on their own. Keep the last value found. Don't take everything from the first `{` to the last `}`. The model occasionally writes a draft before its final JSON, and that range would include both. If your answer is several JSON values in a row, such as one record on each line, keep the last run of values separated only by spaces, commas, or line breaks. Check that the result has the fields you expect, and retry once if it doesn't. In testing, this made nearly every response usable without changing its accuracy. * **Also consider `xhigh` effort with adaptive thinking.** The model then works the problem out in its thinking and nearly always returns the JSON alone. Total output tokens stay about the same as at `high`, because the working moves from the response text into the thinking. ## User-facing progress updates Between tool calls, Claude Sonnet 5.5 writes user-facing notes about what it just found and what it's doing next. Notes longer than a sentence or two come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). Shorter remarks stay `text`. At the default `thinking.display`, a progress-update block's text is empty, so a client that renders only `text` blocks can look silent during a long agentic turn. This matters most in chat interfaces and other products where the user follows the model's work in real time. -To show these notes, set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header). With `between_tools`, the notes come back with their summary text, so no `display` field is needed. `between_tools` takes no other field: `display`, `budget_tokens`, or `block_binding` sent with it returns a 400 error. The [migration guide](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#text-between-tool-calls) shows how to render the notes. Sometimes the model needs to show the user exact text partway through a long turn, such as a code snippet or a question it needs answered. For that case, give it a simple tool for sending the user a message. Tell the model to use that tool only for such content. Declare the tool in the first request of the session, so the `tools` list doesn't change later. +To show these notes, set `display: "updates"` (beta, `thinking-display-updates-2026-08-18` header). With `between_tools`, the notes come back with their summary text, so no `display` field is needed. `between_tools` takes no other field: `display`, `budget_tokens`, or `block_binding` sent with it returns a 400 error. The migration guide's section on [text between tool calls](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#text-between-tool-calls) shows how to render the notes. Sometimes the model needs to show the user exact text partway through a long turn, such as a code snippet or a question it needs answered. For that case, give it a simple tool for sending the user a message. Tell the model to use that tool only for such content. Declare the tool in the first request of the session, so the `tools` list doesn't change later. -Next, remove older instructions such as "hold all findings for the final response". If you then want updates at predictable points, for example a line on what the model is about to do before its first tool call and a short recap at the end, say so in the system prompt. The model follows instructions like this. Updates at set points help most in human-in-the-loop work. +Next, remove older instructions such as "hold all findings for the final response." If you then want updates at predictable points, for example a line on what the model is about to do before its first tool call and a short recap at the end, say so in the system prompt. The model follows instructions like this. Updates at set points help most in human-in-the-loop work. If long tool-calling turns still go quiet for longer than you want, your harness can prompt an update. Have it count consecutive tool-calling steps that send the user no text or progress update. After several in a row, for example five, append a one-turn reminder after the latest tool results. Send it as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (beta), with text like this: @@ -116,13 +116,13 @@ If long tool-calling turns still go quiet for longer than you want, your harness The user hasn't heard from you in a while — say in a few words what you're doing, then continue. ``` -If the turn stays quiet, stop sending reminders after the second or third. Frequent harness text after tool results can make the model suspect a prompt injection, as [Mid-turn user messages](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#mid-turn-user-messages-and-task-budgets) explains. Leave each reminder in `messages` on later requests. Because the reminder is appended rather than inserted and later deleted, the prompt cache and [preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) stay intact. At `high` effort, with a tool for sending the user a message available, the reminder leads the model to update the user more often and shortens its longest silent stretches, with no measurable change in task quality. +If the turn stays quiet, stop sending reminders after the second or third. Frequent harness text after tool results can lead the model to treat that text as a possible prompt injection, as [Mid-turn user messages](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#mid-turn-user-messages-and-task-budgets) explains. Leave each reminder in `messages` on later requests. Because the reminder is appended rather than inserted and later deleted, the prompt cache and [preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) stay intact. At `high` effort, with a tool for sending the user a message available, the reminder leads the model to update the user more often and shortens its longest silent stretches, with no measurable change in task quality. ## Tool use in chat and knowledge work On chat and knowledge-work tasks, Claude Sonnet 5.5 sometimes answers from its training knowledge when a web search would catch details that have changed. Examples include what is allowed, required, or charged. -First, check your prompt for language that discourages tool use, such as "only use tools when strictly necessary" or "minimize tool calls", and remove it. Then, if your product gives the model a search tool, add this to your system prompt: +First, check your prompt for language that discourages tool use, such as "only use tools when strictly necessary" or "minimize tool calls," and remove it. Then, if your product gives the model a search tool, add this to your system prompt: ```text wrap Use the search tool to check specifics that may have changed since your training, such as what is allowed, required or charged, even when you feel confident. For researched work such as a report or a comparison, gather current sources rather than writing from your training knowledge. @@ -134,7 +134,7 @@ This matters most for research and support products, where answers depend on cur Claude Sonnet 5.5 is trained to resist indirect prompt injection, meaning malicious instructions that arrive through tool results and other content it reads during a task. Sometimes it treats a genuine user message as a possible injection. Suppose a message the user typed mid-task reaches the model as a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) placed directly after a tool result, or inside a `tool_result` block. The model can then tell the user that the tool result contained text posing as a message from them, and ignore the message or ask the user to confirm it. -A token countdown that your harness adds after every tool result can cause this. So can letting users send messages while the model is partway through a multistep turn, or having your harness add instructions or context after the tool results on every step. In each case, text arrives right after the tool results. With a countdown or per-step instructions, that can happen on every tool call. An occasional one-turn reminder, like the one in [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#user-facing-progress-updates), arrives far less often. If you see this reaction to a reminder of your own, send the reminder less often. To avoid the misread: +A token countdown that your harness adds after every tool result can cause this. So can letting users send messages while the model is partway through a multistep turn, or having your harness add instructions or context after the tool results on every step. In each case, text arrives right after the tool results. With a countdown or per-step instructions, that can occur on every tool call. An occasional one-turn reminder, like the one in [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#user-facing-progress-updates), arrives far less often. If you see this reaction to a reminder of your own, send the reminder less often. To avoid the misread: * Never put user text inside a `tool_result` block. The model misreads that placement most often. * Deliver mid-turn user input as a user turn. Append the user's words as a text block in the user message that carries the `tool_result` blocks, after the last `tool_result`. @@ -168,7 +168,7 @@ Claude Sonnet 5.5 runs safety classifiers that can decline a request. A decline * `cyber`: the request could enable cyber harm, such as malware or exploit development. Finding vulnerabilities in source code is allowed. High-risk dual-use cybersecurity work isn't allowed. * `bio`: the request could enable biological harm, such as dangerous lab methods. Everyday health and educational questions aren't affected. -* `frontier_llm`: the request could assist the development of competing AI models. +* `frontier_llm`: the request could help with the development of competing AI models. * `reasoning_extraction`: the request asks the model to reproduce its internal reasoning in the response text. * `general_harms`: the request falls under another usage-policy area. Benign work can also trigger this category. diff --git a/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5.md b/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5.md index ed84d0fd0a..09a1142661 100644 --- a/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5.md +++ b/content/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5.md @@ -12,7 +12,7 @@ Claude Sonnet 5 has particular strengths in coding and agentic tasks. It perform Claude Sonnet 5 calibrates response length to the complexity of the task rather than defaulting to a fixed verbosity. This usually means shorter answers on simple lookups and longer ones on open-ended analysis. -If your product depends on a certain style or verbosity of output, you may need to tune your prompts. As an example, to decrease verbosity, you might add: +If your product depends on a certain style or verbosity of output, you might need to tune your prompts. As an example, to decrease verbosity, you might add: ```text wrap Provide concise, focused responses. Skip non-essential context, and keep examples minimal. @@ -32,7 +32,7 @@ The [effort parameter](https://platform.claude.com/docs/en/build-with-claude/eff As a rough cross-model mapping when migrating: Claude Sonnet 5 at medium is comparable in intelligence to Claude Sonnet 4.6 at high, and Claude Sonnet 5 at high is comparable to Claude Sonnet 4.6 at max. When benchmarking, match by observed thinking length rather than effort name. -Claude Sonnet 5 respects effort levels strictly, especially at the low end. At `low` and `medium`, the model scopes its work to what was asked rather than going above and beyond. This is good for latency and cost, but on moderately complex tasks running at `low` effort there is some risk of under-thinking. +Claude Sonnet 5 respects effort levels strictly, especially at the low end. At `low` and `medium`, the model scopes its work to what was asked rather than going beyond the request. This is good for latency and cost, but on moderately complex tasks running at `low` effort there is some risk of under-thinking. If you observe shallow reasoning on complex problems, raise effort to `high` or `xhigh` rather than prompting around it. If you need to keep effort at `low` for latency, add targeted guidance: @@ -42,7 +42,7 @@ This task involves multistep reasoning. Think carefully through the problem befo On Claude Sonnet 5, [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is on by default. Requests without a `thinking` field run with adaptive thinking. This is a change from Claude Sonnet 4.6, where the same requests ran without thinking. To turn thinking off entirely, pass `thinking: {type: "disabled"}`. Because `max_tokens` is a hard limit on total output (thinking plus response text), revisit it for workloads that ran without thinking on Claude Sonnet 4.6. If you were previously using thinking off with Claude Sonnet 4.6, try thinking on with lower effort levels for Claude Sonnet 5. -The triggering behavior for adaptive thinking is steerable. If you find the model emitting thinking blocks more often than you'd like, which can happen with large or complex system prompts, add guidance to steer it. As always, measure the effect of any prompting changes on performance. Example: +The triggering behavior for adaptive thinking is steerable. If you find the model emitting thinking blocks more often than you'd like, which can occur with large or complex system prompts, add guidance to steer it. As always, measure the effect of any prompting changes on performance. Example: ```text wrap Thinking adds latency and should only be used when it will meaningfully improve answer quality, typically for problems that require multistep reasoning. When in doubt, respond directly. @@ -53,12 +53,12 @@ Conversely, if you're running hard workloads at `medium` and seeing under-thinki Manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) is not supported on Claude Sonnet 5 and returns a 400 error. It was deprecated on Claude Sonnet 4.6 and is now removed. Use adaptive thinking with the effort parameter instead. - If you are running Claude Sonnet 5 at `high`, `xhigh`, or `max` effort, leave headroom in `max_tokens` so the model has room for thinking and tool calls. On long tasks, adaptive thinking can use a large share of the budget; if the budget is tight, you may see a response that is almost entirely thinking followed by a truncated answer and `stop_reason: "max_tokens"`. Raising `max_tokens` or dropping to `medium` effort resolves this. Because Claude Sonnet 5 uses a new tokenizer that produces approximately 30% more tokens for the same text, `max_tokens` limits tuned for Claude Sonnet 4.6 may truncate equivalent output. The exact increase depends on the content and workload shape. + If you are running Claude Sonnet 5 at `high`, `xhigh`, or `max` effort, leave headroom in `max_tokens` so the model has room for thinking and tool calls. On long tasks, adaptive thinking can use a large share of the budget; if the budget is tight, you might see a response that is almost entirely thinking followed by a truncated answer and `stop_reason: "max_tokens"`. Raising `max_tokens` or dropping to `medium` effort resolves this. Because Claude Sonnet 5 uses a new tokenizer that produces approximately 30 percent more tokens for the same text, `max_tokens` limits tuned for Claude Sonnet 4.6 might truncate equivalent output. The exact increase depends on the content and workload shape. ## Tool use triggering -Claude Sonnet 5 is more agentic than Claude Sonnet 4.6 by default and will reach for tools and run self-verification loops more readily. With thinking disabled, the model is less likely to reach for tools or consider searching; if you rely on tool calls with thinking off, add an explicit nudge in the system prompt. Effort is also a lever for tool usage: `high` or `xhigh` effort settings show substantially more tool usage in agentic search and coding. For scenarios where you want more tool use, you can also adjust your prompt to explicitly instruct the model about when and how to properly use its tools. For instance, if you find that the model is not using your web search tools, clearly describe why and how it should. +Claude Sonnet 5 is more agentic than Claude Sonnet 4.6 by default and reaches for tools and runs self-verification loops more readily. With thinking disabled, the model is less likely to reach for tools or consider searching; if you rely on tool calls with thinking off, add an explicit nudge in the system prompt. Effort is also a lever for tool usage: `high` or `xhigh` effort settings show substantially more tool usage in agentic search and coding. For scenarios where you want more tool use, you can also adjust your prompt to explicitly instruct the model about when and how to properly use its tools. For instance, if you find that the model is not using your web search tools, clearly describe why and how it should. ## User-facing progress updates @@ -70,7 +70,7 @@ Claude Sonnet 5 interprets prompts literally and explicitly, particularly at low ## Tone and writing style -As with any new model, prose style on long-form writing may shift. If your product relies on a specific voice, re-evaluate style prompts against the new baseline. +As with any new model, prose style on long-form writing might shift. If your product relies on a specific voice, re-evaluate style prompts against the new baseline. For instance, if your product voice is warmer or more conversational, add: @@ -78,11 +78,11 @@ For instance, if your product voice is warmer or more conversational, add: Use a warm, collaborative tone. Acknowledge the user's framing before answering. ``` -If you previously relied on `temperature` for stylistic variety, note that setting `temperature`, `top_p`, or `top_k` to a non-default value returns a 400 error on Claude Sonnet 5. This constraint is new for Sonnet-class models. Remove these parameters when migrating, and use system-prompt instructions to guide tone and variety instead. +If you previously relied on `temperature` for stylistic variety, note that setting `temperature`, `top_p`, or `top_k` returns a 400 error on Claude Sonnet 5. This constraint is new for Sonnet-class models. Remove these parameters when migrating, and use system-prompt instructions to guide tone and variety instead. ## Design and frontend defaults -Claude Sonnet 5 may settle into a consistent default visual style on open-ended frontend and design briefs. A default house style can read well for some briefs but feel off for dashboards, dev tools, fintech, healthcare, or enterprise apps. +Claude Sonnet 5 might settle into a consistent default visual style on open-ended frontend and design briefs. A default house style can read well for some briefs but feel off for dashboards, dev tools, fintech, healthcare, or enterprise apps. Generic instructions ("don't use that color," "make it clean and minimal") tend to shift the model to a different fixed palette rather than producing variety. Two approaches work reliably: @@ -127,13 +127,13 @@ NEVER use generic AI-generated aesthetics like overused font families (Inter, Ro ## Interactive coding products -Token usage and behavior can differ between autonomous, asynchronous coding agents with a single user turn and interactive, synchronous coding agents with multiple user turns. To maximize both performance and token efficiency in coding products, use `xhigh` or `high` effort, add autonomous features like an auto mode, and reduce the number of human interactions required from your users. +Token usage and behavior can differ between autonomous, asynchronous coding agents with a single user turn and interactive, synchronous coding agents with multiple user turns. To maximize both performance and token efficiency in coding products, use `xhigh` or `high` effort, add autonomous features such as an auto mode, and reduce the number of human interactions required from your users. When limiting the number of required user interactions, it's important to specify the task, intent, and relevant constraints upfront in the first human turn. Providing well-specified, clear, and accurate task descriptions upfront can help maximize autonomy and intelligence while minimizing extra token usage after user turns. In contrast, ambiguous or underspecified prompts conveyed progressively over multiple user turns tend to relatively reduce token efficiency and sometimes performance. ## Code review harnesses -If your code-review harness was tuned for an earlier model, you may initially see lower recall on Claude Sonnet 5. This is likely a harness effect, not a capability regression. When a review prompt says things like "only report high-severity issues," "be conservative," or "don't nitpick," Claude Sonnet 5 may follow that instruction more faithfully than earlier models did: it may investigate the code just as thoroughly, identify the bugs, and then not report findings it judges to be below your stated bar. This can show up as the model doing the same depth of investigation but converting fewer investigations into reported findings, especially on lower-severity bugs. Precision typically rises, but measured recall can fall even though the model's underlying bug-finding ability has improved. +If your code-review harness was tuned for an earlier model, you may initially see lower recall on Claude Sonnet 5. This is likely a harness effect, not a capability regression. When a review prompt says things like "only report high-severity issues," "be conservative," or "don't nitpick," Claude Sonnet 5 may follow that instruction more faithfully than earlier models did: it may investigate the code just as thoroughly, identify the bugs, and then not report findings it determines to be below your stated bar. This can show up as the model doing the same depth of investigation but converting fewer investigations into reported findings, especially on lower-severity bugs. Precision typically rises, but measured recall can fall even though the model's underlying bug-finding ability has improved. Some recommended prompt language: @@ -143,7 +143,7 @@ Report every issue you find, including ones you are uncertain about or consider This prompt can be used without having an actual second step, but moving confidence filtering out of the finding step often helps. If your harness has a separate verification, deduplication, or ranking stage, tell the model explicitly that its job at the finding stage is coverage rather than filtering. -If you do want the model to self-filter in a single pass, be concrete about where the bar is rather than using qualitative terms like "important": for example, "report any bugs that could cause incorrect behavior, a test failure, or a misleading result; only omit nits like pure style or naming preferences." +If you do want the model to self-filter in a single pass, be concrete about where the bar is rather than using qualitative terms such as "important": for example, "report any bugs that could cause incorrect behavior, a test failure, or a misleading result; only omit nits like pure style or naming preferences." Iterate on prompts against a subset of your evals or test cases to validate recall or F1 score gains. diff --git a/content/en/build-with-claude/refusals-and-fallback.md b/content/en/build-with-claude/refusals-and-fallback.md index 6a5c7cf67f..a9c66057db 100644 --- a/content/en/build-with-claude/refusals-and-fallback.md +++ b/content/en/build-with-claude/refusals-and-fallback.md @@ -10,10 +10,10 @@ Read this page when you build on any of these models and want declined requests Related pages: -* [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons): the full list of `stop_reason` values. -* [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit): how to avoid paying the prompt-cache cost twice when you build the retry yourself. -* [SDK middleware](https://platform.claude.com/docs/en/cli-sdks-libraries/middleware): the SDK helper that wraps all of this. -* [Fallback and billing cookbook](https://platform.claude.com/cookbook/fable-5-fallback-billing-guide): a worked end-to-end example. +* [Stop reasons and fallback](https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons): the full list of `stop_reason` values +* [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit): how to avoid paying the prompt-cache cost twice when you build the retry yourself +* [SDK middleware](https://platform.claude.com/docs/en/cli-sdks-libraries/middleware): the SDK helper that wraps all of this +* [Fallback and billing recipe](https://platform.claude.com/cookbook/fable-5-fallback-billing-guide): a worked end-to-end example The simplest setup, in beta on the Claude API: set `fallbacks` to `"default"`, and the API retries a declined request on the fallback model Anthropic recommends for its refusal category. For categories with no recommended fallback, the refusal stands. Claude Haiku 5.5 has no server-side fallback, so for it use [client-side fallback with the SDK middleware](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#client-side-fallback) or [write the retry yourself](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#manual-retry). @@ -75,7 +75,7 @@ The simplest setup, in beta on the Claude API: set `fallbacks` to `"default"`, a { Model = Messages::Model.ClaudeFable5, MaxTokens = 1024, - Messages = [new() { Content = "Hello, Claude", Role = Role.User }], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], Fallbacks = new Default(), Betas = [AnthropicBeta.ServerSideFallback2026_07_01], } @@ -135,7 +135,7 @@ The simplest setup, in beta on the Claude API: set `fallbacks` to `"default"`, a client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5", + model: Anthropic::Model::CLAUDE_FABLE_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], fallbacks: :default, @@ -330,10 +330,7 @@ Default routing never draws the up-front [oversized-image rejection](https://pla { Model = Messages::Model.ClaudeFable5, MaxTokens = 1024, - Messages = - [ - new() { Content = "Hello, Claude", Role = Role.User }, - ], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], Fallbacks = new Default(), Betas = [AnthropicBeta.ServerSideFallback2026_07_01], } @@ -454,7 +451,7 @@ Default routing never draws the up-front [oversized-image rejection](https://pla client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5", + model: Anthropic::Model::CLAUDE_FABLE_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], fallbacks: :default, @@ -473,9 +470,9 @@ Default routing never draws the up-front [oversized-image rejection](https://pla ``` -Anthropic sets safeguards for each model individually and for each policy category, in line with the model's capability: depending on the category, a flagged request may fall back to a less capable model or be declined. The `"default"` mode encodes these per-model, per-category recommendations for you, so a refused request is retried on the model Anthropic recommends for that category. Fallbacks are visible either way: the response names the model that served it, and the `fallback` content block marks the handoff. +Anthropic sets safeguards for each model individually and for each policy category, in line with the model's capability: depending on the category, a flagged request might fall back to a less capable model or be declined. The `"default"` mode encodes these per-model, per-category recommendations for you, so a refused request is retried on the model Anthropic recommends for that category. Fallbacks are visible either way: the response names the model that served it, and the `fallback` content block marks the handoff. -The routing is applied server-side and is not published per model on the [Models API](https://platform.claude.com/docs/en/api/models/list). To see which model served a refused request, check the response's top-level `model` field and look for a `fallback_message` entry in `usage.iterations`, as this page's samples do. +The routing is applied server-side and is not published for each model on the [Models API](https://platform.claude.com/docs/en/api/models/list). To see which model served a refused request, check the response's top-level `model` field and look for a `fallback_message` entry in `usage.iterations`, as this page's samples do. Only a safety classifier decline triggers the fallback. A rate limit, overload, or server error on the requested model is returned to you as-is. @@ -549,7 +546,7 @@ The highlighted lines are the only difference from the default-routing request. { Model = Messages::Model.ClaudeFable5, MaxTokens = 1024, - Messages = [new() { Content = "Hello, Claude", Role = Role.User }], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], Fallbacks = new([new(Messages::Model.ClaudeOpus4_8)]), Betas = [AnthropicBeta.ServerSideFallback2026_07_01], } @@ -613,10 +610,10 @@ The highlighted lines are the only difference from the default-routing request. client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5", + model: Anthropic::Model::CLAUDE_FABLE_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], - fallbacks: [{model: "claude-opus-4-8"}], + fallbacks: [{model: Anthropic::Model::CLAUDE_OPUS_4_8}], betas: ["server-side-fallback-2026-07-01"] ) @@ -627,7 +624,7 @@ The highlighted lines are the only difference from the default-routing request. A few rules apply to the `fallbacks` list: * Entries are tried in order. Each must be distinct from the other entries and from the requested model. -* Each entry must be one of the requested model's permitted targets. With the beta header set, that list is published as `allowed_fallback_models` on the model's entry in the [Models API](https://platform.claude.com/docs/en/api/beta/models/list). +* Each entry must be one of the requested model's permitted targets. With the beta header set, that list is published as `allowed_fallback_models` on the [model's entry in the Models API](https://platform.claude.com/docs/en/api/beta/models/list). * Each entry names a `model` and can override `max_tokens`, `thinking`, `output_config`, and `speed` for that attempt only. * The request must be valid as a direct request to every model named. If a fallback model does not support a feature the request uses, the API rejects the request up front. Under the `2026-07-01` header, `thinking: {"type": "between_tools"}` is the exception: when a Claude Sonnet 5.5 request falls back to Claude Sonnet 5, the fallback attempt runs with `thinking: {"type": "disabled"}` and `display: "omitted"`. Under `2026-06-01`, set `thinking` on the Claude Sonnet 5 entry, or the request is rejected up front. * As with the default mode, only a safety classifier decline triggers the fallback. A rate limit, overload, or server error on the requested model is returned to you as-is. @@ -714,14 +711,14 @@ On the next turn, send the assistant content back as you received it. After a mi ### Streaming -On a streaming request, the retry happens on the same stream, and nothing you have already received is invalidated. What you see depends on when the decline happens. +On a streaming request, the retry occurs on the same stream, and nothing you have already received is invalidated. What you see depends on when the decline occurs. -**When the decline happens before any output:** +**When the decline occurs before any output:** * `message_start` names the fallback model, and the `fallback` block is the first content block. * Because `message_start` waits for the fallback attempt to start, time to first byte includes the declined attempt. -**When the decline happens mid-output:** +**When the decline occurs mid-output:** * The open content block closes, and the `fallback` block (an ordinary `content_block_start` and `content_block_stop` pair with no deltas) marks the boundary. * The fallback model continues from the partial output. Only the partial output's `text` blocks are passed to the fallback model as context. Other block types remain in `content`. @@ -729,7 +726,7 @@ On a streaming request, the retry happens on the same stream, and nothing you ha ### Non-streaming responses -On a non-streaming request, a mid-output decline behaves differently: the response omits the declined model's partial output, and the fallback model answers from scratch. The result looks like a decline before any output, with the `fallback` block first. The declined attempt and its output tokens still appear in `usage.iterations`. +On a non-streaming request, a mid-output decline behaves differently: the response omits the declined model's partial output, and the fallback model answers from the beginning. The result looks like a decline before any output, with the `fallback` block first. The declined attempt and its output tokens still appear in `usage.iterations`. **Declines during tool use:** completed tool work does not block fallback. When a decline fires after server tools (for example, web search or code execution) have finished executing within a request, the fallback attempt proceeds: the completed tool results carry over, and the fallback model can keep invoking server tools. The one case that does not retry is a streaming decline that fires while a tool-use block of any type (a client tool, a server tool, or an MCP tool call) is still open on the stream: that refusal is returned directly, and if the `fallback-credit-2026-07-01` header is set it still carries a credit token redeemable by continuing the partial response. Non-streaming requests are unaffected; the API clears the partial work and retries before responding. @@ -870,7 +867,7 @@ Pass `BetaRefusalFallbackMiddleware` (typescript: `betaRefusalFallbackMiddleware { Model = Messages::Model.ClaudeFable5, MaxTokens = 1024, - Messages = [new() { Content = "Hello, Claude", Role = Role.User }], + Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }], }; // Streaming: if the stream ends in a refusal, the handler splices the fallback @@ -1080,7 +1077,7 @@ Pass `BetaRefusalFallbackMiddleware` (typescript: `betaRefusalFallbackMiddleware # Streaming: on a refusal the middleware splices the fallback model's # events onto the still-open stream. stream = client.beta.messages.stream( - model: "claude-fable-5", + model: Anthropic::Model::CLAUDE_FABLE_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], request_options: {fallback_state: state} @@ -1090,7 +1087,7 @@ Pass `BetaRefusalFallbackMiddleware` (typescript: `betaRefusalFallbackMiddleware # Non-streaming: reusing the state keeps the conversation pinned to the model that accepted. message = client.beta.messages.create( - model: "claude-fable-5", + model: Anthropic::Model::CLAUDE_FABLE_5, max_tokens: 1024, messages: [{role: "user", content: "Hello, Claude"}], request_options: {fallback_state: state} @@ -1132,7 +1129,7 @@ Over raw HTTP or with custom retry logic, implement the pattern the middleware w -A manual retry writes the fallback model's prompt cache from scratch, which costs more than reading an existing cache. [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) refunds that cost; redeem it on every retry you build yourself. A Claude Haiku 5.5 refusal carries no fallback credit, so a retry after one pays the full cost of writing the fallback model's prompt cache. +A manual retry writes the fallback model's prompt cache in full, which costs more than reading an existing cache. [Fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) refunds that cost; redeem it on every retry you build yourself. A Claude Haiku 5.5 refusal carries no fallback credit, so a retry after one pays the full cost of writing the fallback model's prompt cache. ## Refusals in Message Batches @@ -1148,11 +1145,11 @@ Server-side fallback is not available for batches (a batch request that includes ## Common pitfalls * **Retry on a different model.** Re-sending a refused request to the same model usually earns another refusal. Point the retry at the fallback model. -* **Budget retries per request, not per turn or per session.** A single turn can produce several refusals, for example an agent plus its sub-agents. +* **Budget retries for each request, not for each turn or session.** A single turn can produce several refusals, for example an agent plus its subagents. * **Configure fallback on every request path.** Retry handlers, error-recovery branches, and background workers all need it. A handler that re-issues a request without fallback loses the protection on exactly the requests most likely to need it. -* **Give sub-agent calls their own fallback.** The `fallbacks` parameter does not propagate into model calls made from inside tool execution. +* **Give subagent calls their own fallback.** The `fallbacks` parameter does not carry over to model calls made from inside tool execution. * **Make fallback a property of the request, not of ambient state.** A shared flag, cached config value, or global toggle can drift out of sync and silently leave a request unprotected. When you cannot confirm fallback is active, configure it rather than assume it is on. -* **Instrument refusals as their own signal.** A refusal is an HTTP 200, so monitoring built on error rates or 5xx responses never sees it. Emit one event per refusal and one per fallback-served response (the `fallback_message` entry in `usage.iterations` marks the latter), then alert on the gap between the two counts. +* **Instrument refusals as their own signal.** A refusal is an HTTP 200, so monitoring built on error rates or 5xx responses never sees it. Emit one event for each refusal and one for each fallback-served response (the `fallback_message` entry in `usage.iterations` marks the latter), then alert on the gap between the two counts. * **Branch on `stop_reason` or `stop_details.type`, not on `content` or the inner `stop_details` fields.** The `stop_details` object is always present on a refusal, but its `category` and `explanation` fields can be `null`. Check for `stop_reason` equal to `"refusal"` directly. ## Next steps diff --git a/content/en/build-with-claude/search-results.md b/content/en/build-with-claude/search-results.md index 583f6345bd..f0eaff93de 100644 --- a/content/en/build-with-claude/search-results.md +++ b/content/en/build-with-claude/search-results.md @@ -1,7 +1,7 @@ --- title: Search results url: https://platform.claude.com/docs/en/build-with-claude/search-results -description: Enable natural citations for RAG applications by providing search results with source attribution +description: Get natural citations for RAG applications by providing search results with source attribution --- @@ -16,8 +16,8 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support Search results can be provided in two ways: -1. **From tool calls:** Your custom tools return search results, enabling dynamic RAG applications -2. **As top-level content:** You provide search results directly in user messages for pre-fetched or cached content +1. **From tool calls:** Your custom tools return search results, which lets you build dynamic RAG applications. +2. **As top-level content:** You provide search results directly in user messages for pre-fetched or cached content. In both cases, Claude cites the search results automatically when citations are enabled. No special prompting is needed: ask your question, and citations appear on the text blocks that draw on your content. @@ -69,17 +69,17 @@ Search results hold text only. Images and other media are not supported inside t ## Method 1: Search results from tool calls -Returning search results from your custom tools enables dynamic RAG applications: tools fetch content at runtime, and Claude cites it in the response. The following example forces the tool call with [`tool_choice`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools#forcing-tool-use), so the retrieval step runs every time. +Returning search results from your custom tools lets you build dynamic RAG applications: tools fetch content at runtime, and Claude cites it in the response. The following example forces the tool call with [`tool_choice`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools#forcing-tool-use), so the retrieval step runs every time. ### Example: Knowledge base tool - The tool-calling flow needs search logic in your application, which needs more than a single shell command. Use the Claude SDK for the full flow. For the raw request shape of a tool conversation with search results, see [Combining both methods](https://platform.claude.com/docs/en/build-with-claude/search-results#combining-both-methods). For search results as top-level content, see [Method 2](https://platform.claude.com/docs/en/build-with-claude/search-results#method-2-search-results-as-top-level-content). + The tool-calling flow needs search logic in your application, which needs more than a single shell command. Use the Claude SDK for the full flow. For the raw request shape of a tool conversation with search results, see [Combining both methods](https://platform.claude.com/docs/en/build-with-claude/search-results#combining-both-methods). To provide search results directly in user messages, see [Method 2: Search results as top-level content](https://platform.claude.com/docs/en/build-with-claude/search-results#method-2-search-results-as-top-level-content). - The tool-calling flow needs search logic in your application, which needs more than a single shell command. Use the Claude SDK for the full flow. For the raw request shape of a tool conversation with search results, see [Combining both methods](https://platform.claude.com/docs/en/build-with-claude/search-results#combining-both-methods). For search results as top-level content, see [Method 2](https://platform.claude.com/docs/en/build-with-claude/search-results#method-2-search-results-as-top-level-content). + The tool-calling flow needs search logic in your application, which needs more than a single shell command. Use the Claude SDK for the full flow. For the raw request shape of a tool conversation with search results, see [Combining both methods](https://platform.claude.com/docs/en/build-with-claude/search-results#combining-both-methods). To provide search results directly in user messages, see [Method 2: Search results as top-level content](https://platform.claude.com/docs/en/build-with-claude/search-results#method-2-search-results-as-top-level-content). ```python Python @@ -320,7 +320,7 @@ Returning search results from your custom tools enables dynamic RAG applications } // Build up the conversation in a list, starting with the user's question - List messages = [new() { Role = Role.User, Content = "How do I configure the timeout settings?" }]; + List messages = [new UserMessageParam { Content = "How do I configure the timeout settings?" }]; // Create a message with the tool var response = await client.Messages.Create(new() @@ -342,11 +342,10 @@ Returning search results from your custom tools enables dynamic RAG applications var toolResults = SearchKnowledgeBase(query); // Append Claude's turn, then the tool result, to the running conversation - messages.Add(new() { Role = Role.Assistant, Content = response.Content.Select(contentBlock => new ContentBlockParam(contentBlock.Json)).ToList() }); - messages.Add(new() + messages.Add(new AssistantMessageParam { Content = response.Content.Select(contentBlock => new ContentBlockParam(contentBlock.Json)).ToList() }); + messages.Add(new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent( + Content = new MessageContentParam( [new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = toolUse.ID, Content = new ToolResultBlockParamContent(toolResults) })] ), }); @@ -494,10 +493,7 @@ Returning search results from your custom tools enables dynamic RAG applications // Build up the conversation in a list, starting with the user's question List messages = new ArrayList<>(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content("How do I configure the timeout settings?") - .build()); + messages.add(MessageParam.ofUser("How do I configure the timeout settings?")); MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5) @@ -526,25 +522,15 @@ Returning search results from your custom tools enables dynamic RAG applications // Rebuilding only the tool_use block would drop any other content blocks Claude // returned (e.g. leading text when the tool call is not forced) — append the // full turn, as the other language tabs do. - messages.add(MessageParam.builder() - .role(MessageParam.Role.ASSISTANT) - .contentOfBlockParams( - response.content().stream() - .map(block -> block.toParam()) - .toList() + messages.add(response.toParam()); + messages.add(MessageParam.ofUserOfContentBlockParams(List.of( + ContentBlockParam.ofToolResult( + ToolResultBlockParam.builder() + .toolUseId(toolUse.id()) + .contentOfBlocks(toolResult) + .build() ) - .build()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(List.of( - ContentBlockParam.ofToolResult( - ToolResultBlockParam.builder() - .toolUseId(toolUse.id()) - .contentOfBlocks(toolResult) - .build() - ) - )) - .build()); + ))); // Send the tool result back MessageCreateParams finalParams = MessageCreateParams.builder() @@ -975,10 +961,9 @@ You can also provide search results directly in user messages. This is useful fo MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent( + Content = new MessageContentParam( [ new ContentBlockParam(new SearchResultBlockParam { @@ -1051,7 +1036,7 @@ You can also provide search results directly in user messages. This is useful fo MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024L) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofSearchResult( SearchResultBlockParam.builder() .source("https://docs.company.com/api-reference") @@ -1139,7 +1124,7 @@ You can also provide search results directly in user messages. This is useful fo client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { @@ -1639,10 +1624,9 @@ The following example replays a complete conversation. The first user message ca ], Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent( + Content = new MessageContentParam( [ new ContentBlockParam(new SearchResultBlockParam { @@ -1654,10 +1638,9 @@ The following example replays a complete conversation. The first user message ca new ContentBlockParam(new TextBlockParam { Text = "What does Acme Dashboard do, and what plans is it available on?" }), ]), }, - new() + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent( + Content = new MessageContentParam( [ new ContentBlockParam(new TextBlockParam { Text = "Let me check the pricing information." }), new ContentBlockParam(new ToolUseBlockParam @@ -1671,10 +1654,9 @@ The following example replays a complete conversation. The first user message ca }), ]), }, - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent( + Content = new MessageContentParam( [ new ContentBlockParam(new ToolResultBlockParam() { @@ -1795,7 +1777,7 @@ The following example replays a complete conversation. The first user message ca .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024L) .addTool(knowledgeBaseTool) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofSearchResult(SearchResultBlockParam.builder() .source("https://docs.company.com/overview") .title("Product Overview") @@ -1808,7 +1790,7 @@ The following example replays a complete conversation. The first user message ca .text("What does Acme Dashboard do, and what plans is it available on?") .build()) )) - .addAssistantMessageOfBlockParams(List.of( + .addAssistantMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text("Let me check the pricing information.") .build()), @@ -1818,7 +1800,7 @@ The following example replays a complete conversation. The first user message ca .input(JsonValue.from(Map.of("query", "Acme Dashboard pricing plans"))) .build()) )) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofToolResult(ToolResultBlockParam.builder() .toolUseId("toolu_01A09q90qw90lq917835lq9") .contentOfBlocks(List.of( @@ -1942,7 +1924,7 @@ The following example replays a complete conversation. The first user message ca # Replay a conversation that provides search results both ways: the first # user message carries a pre-fetched result, the tool result returns another response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, tools: [knowledge_base_tool], messages: [ @@ -2113,8 +2095,8 @@ When `citations.enabled` is set to `true`, Claude attaches citation references t ### For top-level search (Method 2) * **Pre-fetched content:** Use when you already have search results -* **Batch processing:** Ideal for processing multiple search results at once -* **Testing:** Great for testing citation behavior with known content +* **Batch processing:** Use for processing multiple search results at once +* **Testing:** Use for testing citation behavior with known content ### General best practices diff --git a/content/en/build-with-claude/skills-guide.md b/content/en/build-with-claude/skills-guide.md index c8c9e39f3b..ef13f07f56 100644 --- a/content/en/build-with-claude/skills-guide.md +++ b/content/en/build-with-claude/skills-guide.md @@ -9,8 +9,8 @@ Agent Skills extend Claude's capabilities through organized folders of instructi For complete API reference including request/response schemas and all parameters, see: - * [Skill Management API Reference](https://platform.claude.com/docs/en/api/skills/list) - CRUD operations for Skills - * [Skill Versions API Reference](https://platform.claude.com/docs/en/api/skills/versions/list) - Version management + * [Skill management API reference](https://platform.claude.com/docs/en/api/skills/list) - CRUD operations for Skills + * [Skill versions API reference](https://platform.claude.com/docs/en/api/skills/versions/list) - Version management @@ -184,7 +184,7 @@ The structure is identical for both Anthropic and custom Skills. Specify the req }, ], }, - Messages = [new() { Role = Role.User, Content = "Create a presentation about renewable energy" }], + Messages = [new UserMessageParam { Content = "Create a presentation about renewable energy" }], Tools = [new CodeExecutionTool20250825()], }; @@ -432,7 +432,7 @@ To provide input files for Skills to work on, [upload them with the Files API](h }, ], }, - Messages = [new() { Role = Role.User, Content = "Create an Excel file with a simple budget spreadsheet" }], + Messages = [new UserMessageParam { Content = "Create an Excel file with a simple budget spreadsheet" }], Tools = [new CodeExecutionTool20250825()], }; @@ -977,7 +977,7 @@ The response's `container` object carries the container's `id` and `expires_at` }, ], }, - Messages = [new() { Role = Role.User, Content = "Create a sample sales dataset and analyze it" }], + Messages = [new UserMessageParam { Content = "Create a sample sales dataset and analyze it" }], Tools = [new CodeExecutionTool20250825()], }; @@ -1009,9 +1009,9 @@ The response's `container` object carries the container's `id` and `expires_at` }, Messages = [ - new() { Role = Role.User, Content = "Create a sample sales dataset and analyze it" }, - new() { Role = Role.Assistant, Content = assistantText }, - new() { Role = Role.User, Content = "What was the total revenue?" }, + new UserMessageParam { Content = "Create a sample sales dataset and analyze it" }, + new AssistantMessageParam { Content = assistantText }, + new UserMessageParam { Content = "What was the total revenue?" }, ], Tools = [new CodeExecutionTool20250825()], }; @@ -1237,7 +1237,7 @@ The response's `container` object carries the container's `id` and `expires_at` ### Long-running operations -Skills may perform operations that require multiple turns. Handle `pause_turn` stop reasons: +Skills might perform operations that require multiple turns. Handle `pause_turn` stop reasons: @@ -1343,7 +1343,7 @@ Skills may perform operations that require multiple turns. Handle `pause_turn` s List messages = [ - new() { Role = Role.User, Content = "Generate and process a large sample dataset" }, + new UserMessageParam { Content = "Generate and process a large sample dataset" }, ]; var maxRetries = 10; @@ -1398,7 +1398,7 @@ Skills may perform operations that require multiple turns. Handle `pause_turn` s var assistantContent = JsonSerializer.SerializeToElement( response.Content.Select(block => block.Json).ToArray() ); - messages.Add(new() { Role = Role.Assistant, Content = new MessageParamContent(assistantContent) }); + messages.Add(new AssistantMessageParam { Content = new MessageContentParam(assistantContent) }); } ``` @@ -1478,12 +1478,7 @@ Skills may perform operations that require multiple turns. Handle `pause_turn` s AnthropicClient client = AnthropicOkHttpClient.fromEnv(); List messages = new ArrayList<>(); - messages.add( - MessageParam.builder() - .role(MessageParam.Role.USER) - .content("Generate and process a large sample dataset") - .build() - ); + messages.add(MessageParam.ofUser("Generate and process a large sample dataset")); int maxRetries = 10; Message response = client.messages().create( @@ -1628,7 +1623,7 @@ Skills may perform operations that require multiple turns. Handle `pause_turn` s - The response may include a `pause_turn` stop reason, which indicates that the API paused a long-running Skill operation. You can provide the response back as-is in a subsequent request to let Claude continue its turn, or modify the content if you want to interrupt the conversation and provide additional guidance. + The response might include a `pause_turn` stop reason, which indicates that the API paused a long-running Skill operation. You can provide the response back as-is in a subsequent request to let Claude continue its turn, or modify the content if you want to interrupt the conversation and provide additional guidance. ### Using multiple Skills @@ -1793,7 +1788,7 @@ Combine multiple Skills in a single request to handle complex workflows: }, ], }, - Messages = [new() { Role = Role.User, Content = "Analyze sales data and create a presentation" }], + Messages = [new UserMessageParam { Content = "Analyze sales data and create a presentation" }], Tools = [new CodeExecutionTool20250825()], }; @@ -1957,9 +1952,9 @@ Combine multiple Skills in a single request to handle complex workflows: ## Managing custom Skills - **Custom Skills are accessible to your entire workspace, not scoped to an end user, conversation, or session.** Any API key with access to a workspace can read, invoke, and delete every custom Skill uploaded to that workspace. Every service account, and every user whose organization role allows API access, can use the Default Workspace in addition to any workspace you add them to, so keep Skills that must stay separate in their own [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#api-keys-and-resource-scoping) and access them only with keys scoped to that workspace. + **Custom Skills are accessible to your entire workspace, not scoped to an end user, conversation, or session.** Any API key with access to a workspace can read, use, and delete every custom Skill uploaded to that workspace. Every service account, and every user whose organization role allows API access, can use the Default Workspace in addition to any workspace you add them to, so keep Skills that must stay separate in their own workspace and access them only with [keys scoped to that workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#api-keys-and-resource-scoping). - If you are building a multi-tenant platform on the Skills API, create a separate [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) for each tenant. The workspace is the isolation boundary for custom Skills, so a workspace per tenant gives each tenant's Skills hard isolation from every other tenant. Each organization can have up to 100 workspaces by default (see [How workspaces work](https://platform.claude.com/docs/en/manage-claude/workspaces#how-workspaces-work)); if you need more for tenant isolation, contact your account team. + If you are building a multitenant platform on the Skills API, create a separate [workspace](https://platform.claude.com/docs/en/manage-claude/workspaces) for each tenant. The workspace is the isolation boundary for custom Skills, so a workspace for each tenant gives that tenant's Skills hard isolation from every other tenant. Each organization can have up to 100 workspaces by default (see [How workspaces work](https://platform.claude.com/docs/en/manage-claude/workspaces#how-workspaces-work)); if you need more for tenant isolation, contact your account team. ### Creating a Skill @@ -1968,7 +1963,7 @@ A Skill bundle is a directory containing a `SKILL.md` file at the top level with Upload your custom Skill to make it available in your workspace. You can upload a zip archive or individual file objects. The Python SDK also provides a `files_from_dir` helper that accepts a directory path, and the CLI's `ant apply` uploads the directory itself. -Files are identified by the filename you attach (the `;filename=` suffix in the cURL example and the filename arguments in the SDK examples). For the walkthrough's skill, create a zip with `zip -r financial_skill.zip financial_skill/` and substitute it for the `example_skill.zip` placeholder in the zip-upload options. +Files are identified by the file name you attach (the `;filename=` suffix in the cURL example and the file name arguments in the SDK examples). For the walkthrough's skill, create a zip with `zip -r financial_skill.zip financial_skill/` and substitute it for the `example_skill.zip` placeholder in the zip-upload options. ```bash cURL @@ -2266,9 +2261,9 @@ Files are identified by the filename you attach (the `;filename=` suffix in the * YAML frontmatter requirements: * `name`: Maximum 64 characters, lowercase letters/numbers/hyphens only, no XML tags, no reserved words ("anthropic", "claude") - * `description`: Maximum 1024 characters, non-empty, no XML tags + * `description`: Maximum 1,024 characters, non-empty, no XML tags -For complete request/response schemas, see the [Create Skill API reference](https://platform.claude.com/docs/en/api/skills/create). +For complete request/response schemas, see the [Create Skill](https://platform.claude.com/docs/en/api/skills/create) API reference. ### Listing Skills @@ -2822,7 +2817,7 @@ A new version is a complete snapshot, not a delta: upload the Skill's full file }, ], }, - Messages = [new() { Role = Role.User, Content = "Use updated Skill" }], + Messages = [new UserMessageParam { Content = "Use updated Skill" }], Tools = [new CodeExecutionTool20250825()], }; @@ -2846,7 +2841,7 @@ A new version is a complete snapshot, not a delta: upload the Skill's full file }, ], }, - Messages = [new() { Role = Role.User, Content = "Use latest Skill version" }], + Messages = [new UserMessageParam { Content = "Use latest Skill version" }], Tools = [new CodeExecutionTool20250825()], }; @@ -3121,7 +3116,7 @@ See the [Create Skill Version API reference](https://platform.claude.com/docs/en When you specify Skills in a container: -1. **Metadata discovery:** Claude sees metadata for each Skill (name, description) in the system prompt. +1. **Metadata discovery:** Claude receives metadata for each Skill (name, description) in the system prompt. 2. **File loading:** Skill files are copied into the container at `/skills/{skill-name}/`. The directory is the Skill's name (`pptx` for an Anthropic Skill, the `SKILL.md` `name` for a custom Skill), not its `skill_01...` ID. 3. **Automatic use:** Claude automatically loads and uses Skills when relevant to your request. 4. **Composition:** Multiple Skills compose together for complex workflows. @@ -3406,7 +3401,7 @@ Then use it with the Excel Skill to create a financial model. Pass the ID of the }, ], }, - Messages = [new() { Role = Role.User, Content = "Build a DCF valuation model for a SaaS company" }], + Messages = [new UserMessageParam { Content = "Build a DCF valuation model for a SaaS company" }], Tools = [new CodeExecutionTool20250825()], }; @@ -3555,7 +3550,7 @@ Then use it with the Excel Skill to create a financial model. Pass the ID of the * **YAML frontmatter requirements:** * `name`: Maximum 64 characters, lowercase letters/numbers/hyphens only, no XML tags, no reserved words ("anthropic", "claude") - * `description`: Maximum 1024 characters, non-empty, no XML tags + * `description`: Maximum 1,024 characters, non-empty, no XML tags ### Environment constraints @@ -3589,7 +3584,7 @@ Combine Skills when tasks involve multiple document types or domains: The SDK tabs in this section show the `container` value to include in a Messages request. The cURL and CLI tabs show the full request. -**For production:** pin a specific version, so Skill updates never change your deployed behavior. If you omit `version` or set it to `"latest"`, requests use the newest version of the Skill, so a version uploaded by anyone in the [workspace](https://platform.claude.com/docs/en/build-with-claude/skills-guide#workspace-scoped-access) immediately changes what your production agents run. The version ID comes from the create-version response in [Versioning](https://platform.claude.com/docs/en/build-with-claude/skills-guide#versioning) or from the [List Skill Versions API](https://platform.claude.com/docs/en/api/skills/versions/list). The ID is always a string, so quote it in JSON or YAML even when it looks numeric. +**For production:** pin a specific version, so Skill updates never change your deployed behavior. If you omit `version` or set it to `"latest"`, requests use the newest version of the Skill, so a version uploaded by [anyone in the workspace](https://platform.claude.com/docs/en/build-with-claude/skills-guide#workspace-scoped-access) immediately changes what your production agents run. The version ID comes from the create-version response in [Versioning](https://platform.claude.com/docs/en/build-with-claude/skills-guide#versioning) or from the [List Skill Versions API](https://platform.claude.com/docs/en/api/skills/versions/list). The ID is always a string, so quote it in JSON or YAML even when it looks numeric. ```bash cURL @@ -4034,7 +4029,7 @@ If you use [Prompt caching](https://platform.claude.com/docs/en/build-with-claud }, ], }, - Messages = [new() { Role = Role.User, Content = "Analyze sales data" }], + Messages = [new UserMessageParam { Content = "Analyze sales data" }], Tools = [new CodeExecutionTool20250825()], }; @@ -4064,7 +4059,7 @@ If you use [Prompt caching](https://platform.claude.com/docs/en/build-with-claud }, ], }, - Messages = [new() { Role = Role.User, Content = "Create a presentation" }], + Messages = [new UserMessageParam { Content = "Create a presentation" }], Tools = [new CodeExecutionTool20250825()], }; @@ -4354,7 +4349,7 @@ Handle Skill-related errors gracefully: }, ], }, - Messages = [new() { Role = Role.User, Content = "Process data" }], + Messages = [new UserMessageParam { Content = "Process data" }], Tools = [new CodeExecutionTool20250825()], }; @@ -4527,20 +4522,20 @@ The Skills API is out of beta and needs no beta header. Migrating off `skills-20 To migrate: -1. **Remove the beta header.** Drop `anthropic-beta: skills-2025-10-02` from your requests. In the SDKs, call `client.skills` instead of `client.beta.skills`; keeping `client.beta.skills` works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/skills-guide#sdk-beta-namespace). Earlier releases send it from `client.beta.skills` even with no `betas` argument. +1. **Remove the beta header.** Drop `anthropic-beta: skills-2025-10-02` from your requests. With the SDK, call `client.skills` (csharp, go: `client.Skills`; java: `client.skills()`; php: `$client->skills`) instead of `client.beta.skills` (csharp, go: `client.Beta.Skills`; java: `client.beta().skills()`; php: `$client->beta->skills`); keeping `client.beta.skills` (csharp, go: `client.Beta.Skills`; java: `client.beta().skills()`; php: `$client->beta->skills`) works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/skills-guide#sdk-beta-namespace). Earlier releases send it from `client.beta.skills` (csharp, go: `client.Beta.Skills`; java: `client.beta().skills()`; php: `$client->beta->skills`) even when you pass no beta names. 2. **Rename fields** in your code: `display_title` to `display_name`, `latest_version` to `latest_version_id`, and read `source.type` instead of comparing `source` to a string. 3. **Use version IDs.** Wherever you stored an epoch-microsecond version, store the version's `id` instead, or use `latest`. Skill references in Messages requests accept a version ID, `latest`, or (for Anthropic Skills) the catalog version. -4. **Review delete calls.** `DELETE /v1/skills/{skill_id}` now removes every version with the Skill. If you relied on the beta's refusal as a safeguard, add your own check. +4. **Review delete calls.** `DELETE /v1/skills/{skill_id}` now deletes every version with the Skill. If you relied on the beta's refusal as a safeguard, add your own check. - After migrating, `client.skills.delete(skill_id)` and `client.beta.skills.delete(skill_id)` delete the Skill together with all of its versions in one call. + After migrating, deleting a Skill through `client.skills` (csharp, go: `client.Skills`; java: `client.skills()`; php: `$client->skills`) or `client.beta.skills` (csharp, go: `client.Beta.Skills`; java: `client.beta().skills()`; php: `$client->beta->skills`) removes the Skill together with all of its versions in one call. A Skill whose versions were all deleted under the beta has no current version to return: `GET /v1/skills/{skill_id}` returns a 400 error and the Skill is omitted from list responses until you upload a version to it. You can still delete it. ### SDK beta namespace -Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.skills` no longer sends `skills-2025-10-02` and returns the same shapes as `client.skills`, with `Beta`-prefixed type names (`BetaSkill`, `BetaSkillVersion`, `BetaDeletedSkill`, `BetaDeletedSkillVersion`). It accepts a `betas` argument for Skills features that are still in beta. In the beta Messages types, the container Skill reference type is renamed from `BetaSkill` to `BetaContainerSkill` (same fields: `type`, `skill_id`, `version`); `BetaSkill` now names the Skill resource, matching `Skill` and `ContainerSkill` in the non-beta types. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. +Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, PHP SDK 0.45.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.skills` (csharp, go: `client.Beta.Skills`; java: `client.beta().skills()`; php: `$client->beta->skills`) no longer sends `skills-2025-10-02` and returns the same shapes as `client.skills` (csharp, go: `client.Skills`; java: `client.skills()`; php: `$client->skills`), with beta type names (`BetaSkill`, `BetaSkillVersion` (php: `SkillVersion`), `BetaDeletedSkill`, `BetaDeletedSkillVersion` (php: `DeletedSkillVersion`)). It takes beta names through `betas` (csharp, go: `Betas`; java: `.addBeta()`) for Skills features that are in beta. In the beta Messages types, the container Skill reference type is renamed from `BetaSkill` to `BetaContainerSkill` (same fields: `type`, `skill_id`, `version`); `BetaSkill` now names the Skill resource, matching `Skill` and `ContainerSkill` in the non-beta types. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. ## Data retention @@ -4564,6 +4559,6 @@ If your organization has the [Compliance API](https://platform.claude.com/docs/e - Run Python and bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. + Run Python and Bash code in a sandboxed container to analyze data, generate files, and iterate on solutions. diff --git a/content/en/build-with-claude/streaming.md b/content/en/build-with-claude/streaming.md index 6d8c88a721..6ebc16e100 100644 --- a/content/en/build-with-claude/streaming.md +++ b/content/en/build-with-claude/streaming.md @@ -51,7 +51,7 @@ The [Python SDK](https://github.com/anthropics/anthropic-sdk-python) and [TypeSc { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello" }] + Messages = [new UserMessageParam { Content = "Hello" }] }; await foreach (var msg in client.Messages.CreateStreaming(parameters)) @@ -191,7 +191,7 @@ If you don't need to process text as it arrives, the SDK provides a way to use s { Model = Model.ClaudeOpus5_5, MaxTokens = 128000, - Messages = [new() { Role = Role.User, Content = "Write a detailed analysis..." }] + Messages = [new UserMessageParam { Content = "Write a detailed analysis..." }] }; // To handle events as they arrive as well, pass a MessageContentAggregator to CollectAsync() instead. @@ -284,7 +284,7 @@ If you don't need to process text as it arrives, the SDK provides a way to use s ``` -The `.stream()` (java: `.createStreaming()`; csharp: `.CreateStreaming()`; go: `.NewStreaming()`; php: `->createStream()`) call keeps the HTTP connection alive with server-sent events, then the SDK's message-accumulation helper, `stream.get_final_message()` (typescript: `stream.finalMessage()`; ruby: `stream.accumulated_message`; csharp: `.Aggregate()`; go: `message.Accumulate(event)`; java, php: `MessageAccumulator`), collects all events into the complete `Message` object. +The `.stream()` (java: `.createStreaming()`; csharp: `.CreateStreaming()`; go: `.NewStreaming()`; php: `->createStream()`) call keeps the HTTP connection alive with server-sent events, and then the SDK's message-accumulation helper, `stream.get_final_message()` (typescript: `stream.finalMessage()`; ruby: `stream.accumulated_message`; csharp: `.Aggregate()`; go: `message.Accumulate(event)`; java, php: `MessageAccumulator`), collects all events into the complete `Message` object. ## Event types @@ -303,11 +303,11 @@ Each stream uses the following event flow: ### Ping events -Event streams may also include any number of `ping` events. +Event streams might also include any number of `ping` events. ### Error events -The API may occasionally send [errors](https://platform.claude.com/docs/en/api/errors) in the event stream. For example, during periods of high usage, you may receive an `overloaded_error`, which would normally correspond to an HTTP 529 in a non-streaming context: +The API might occasionally send [errors](https://platform.claude.com/docs/en/api/errors) in the event stream. For example, during periods of high usage, you might receive an `overloaded_error`, which would normally correspond to an HTTP 529 in a non-streaming context: ```sse Example error event: error @@ -335,7 +335,7 @@ data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", The deltas for `tool_use` content blocks correspond to updates for the `input` field of the block. To support maximum granularity, the deltas are *partial JSON strings*, whereas the final `tool_use.input` is always an *object*. -You can accumulate the string deltas and parse the JSON once you receive a `content_block_stop` event, by using a library like [Pydantic](https://docs.pydantic.dev/latest/concepts/json/#partial-json-parsing) to do partial JSON parsing, or by using the SDK's [streaming helpers](https://platform.claude.com/docs/en/build-with-claude/streaming#streaming-with-sdks). In the Python and TypeScript SDKs, these helpers also give you access to the parsed `input` incrementally, as it streams. +You can accumulate the string deltas and parse the JSON once you receive a `content_block_stop` event, by using a library such as [Pydantic](https://docs.pydantic.dev/latest/concepts/json/#partial-json-parsing) to do partial JSON parsing, or by using the SDK's [streaming helpers](https://platform.claude.com/docs/en/build-with-claude/streaming#streaming-with-sdks). In the Python and TypeScript SDKs, these helpers also give you access to the parsed `input` incrementally, as it streams. A `tool_use` content block delta looks like: @@ -344,7 +344,7 @@ event: content_block_delta data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}} ``` -Note: Current models only support emitting one complete key and value property from `input` at a time. As such, when using tools, there may be delays between streaming events while the model is working. Once an `input` key and value are accumulated, they are emitted as multiple `content_block_delta` events with chunked partial JSON so that the format can automatically support finer granularity in future models. +Note: Current models only support emitting one complete key and value property from `input` at a time. As such, when using tools, there might be delays between streaming events while the model is working. Once an `input` key and value are accumulated, they are emitted as multiple `content_block_delta` events with chunked partial JSON so that the format can automatically support finer granularity in future models. ### Thinking delta @@ -386,7 +386,7 @@ A stream response consists of: 4. A `message_stop` event -There may be `ping` events dispersed throughout the response as well. See [Event types](https://platform.claude.com/docs/en/build-with-claude/streaming#event-types) for more details on the format. +There might be `ping` events dispersed throughout the response as well. See [Event types](https://platform.claude.com/docs/en/build-with-claude/streaming#event-types) for more details on the format. ### Basic streaming request @@ -446,7 +446,7 @@ There may be `ping` events dispersed throughout the response as well. See [Event { Model = Model.ClaudeOpus5_5, MaxTokens = 256, - Messages = [new() { Role = Role.User, Content = "Hello" }] + Messages = [new UserMessageParam { Content = "Hello" }] }; await foreach (var msg in client.Messages.CreateStreaming(parameters)) @@ -560,45 +560,45 @@ data: {"type": "message_stop"} ### Streaming request with tool use - Tool use supports [fine-grained streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming) for parameter values. Enable it per tool with `eager_input_streaming`. + Tool use supports [fine-grained streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming) for parameter values. Enable it on individual tools with `eager_input_streaming`. This request asks Claude to use a tool to report the weather. ```bash cURL - curl https://api.anthropic.com/v1/messages \ - -H "content-type: application/json" \ - -H "x-api-key: $ANTHROPIC_API_KEY" \ - -H "anthropic-version: 2023-06-01" \ - -d '{ - "model": "claude-opus-5", - "max_tokens": 1024, - "tools": [ - { - "name": "get_weather", - "description": "Get the current weather in a given location", - "input_schema": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA" - } - }, - "required": ["location"] - } - } - ], - "tool_choice": {"type": "any"}, - "messages": [ - { - "role": "user", - "content": "What is the weather like in San Francisco?" + curl https://api.anthropic.com/v1/messages \ + -H "content-type: application/json" \ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "anthropic-version: 2023-06-01" \ + -d '{ + "model": "claude-opus-5", + "max_tokens": 1024, + "tools": [ + { + "name": "get_weather", + "description": "Get the current weather in a given location", + "input_schema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + } + }, + "required": ["location"] } - ], - "stream": true - }' + } + ], + "tool_choice": {"type": "any"}, + "messages": [ + { + "role": "user", + "content": "What is the weather like in San Francisco?" + } + ], + "stream": true + }' ``` ```bash CLI @@ -720,9 +720,7 @@ This request asks Claude to use a tool to report the weather. }), ], ToolChoice = new ToolChoiceAny(), - Messages = [ - new() { Role = Role.User, Content = "What is the weather like in San Francisco?" } - ] + Messages = [new UserMessageParam { Content = "What is the weather like in San Francisco?" }] }; await foreach (var msg in client.Messages.CreateStreaming(parameters)) @@ -1056,7 +1054,7 @@ This request enables thinking with streaming. The `display: "summarized"` settin Model = Model.ClaudeOpus5_5, MaxTokens = 20000, Thinking = new ThinkingConfigAdaptive { Display = Display.Summarized }, - Messages = [new() { Role = Role.User, Content = "What is the greatest common divisor of 1071 and 462?" }] + Messages = [new UserMessageParam { Content = "What is the greatest common divisor of 1071 and 462?" }] }; await foreach (var msg in client.Messages.CreateStreaming(parameters)) @@ -1289,7 +1287,7 @@ This request asks Claude to search the web for current weather information. Model = Model.ClaudeOpus5_5, MaxTokens = 1024, Tools = [new ToolUnion(new WebSearchTool20250305() { MaxUses = 5 })], - Messages = [new() { Role = Role.User, Content = "What is the weather like in New York City today?" }] + Messages = [new UserMessageParam { Content = "What is the weather like in New York City today?" }] }; await foreach (var msg in client.Messages.CreateStreaming(parameters)) @@ -1505,7 +1503,7 @@ For Claude 4.6 and later models, the same capture-and-resume strategy applies, b ### Error recovery best practices -1. **Use SDK features:** Leverage the SDK's built-in message accumulation and error handling capabilities. +1. **Use SDK features:** Rely on the SDK's built-in message accumulation and error handling capabilities. 2. **Handle content types:** Be aware that messages can contain multiple content blocks (`text`, `tool_use`, `thinking`). Tool use and thinking blocks cannot be partially recovered. You can resume streaming from the most recent text block. ## Next steps diff --git a/content/en/build-with-claude/structured-outputs.md b/content/en/build-with-claude/structured-outputs.md index 990c75dfcb..cf846eefdb 100644 --- a/content/en/build-with-claude/structured-outputs.md +++ b/content/en/build-with-claude/structured-outputs.md @@ -42,7 +42,7 @@ You can use these features independently or [together in the same request](https ## Why use structured outputs -Without structured outputs, Claude can generate malformed JSON responses or invalid tool inputs that break your applications. Even with careful prompting, you may encounter: +Without structured outputs, Claude can generate malformed JSON responses or invalid tool inputs that break your applications. Even with careful prompting, you might encounter: * Parsing errors from invalid JSON syntax * Missing required fields @@ -194,7 +194,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco Pass a [Pydantic](https://docs.pydantic.dev/) model to `client.messages.parse()`, the recommended method, as `output_format`. The SDK transforms the model's schema, sends it as `output_config.format`, validates the response, and returns the parsed model in `parsed_output`. - The example above outputs: + The previous example outputs: ```text Output wrap name='John Smith' email='john@example.com' plan_interest='Enterprise' demo_requested=True @@ -236,7 +236,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco Wrap a [Zod](https://zod.dev/) schema in `zodOutputFormat()` and pass it to `client.messages.parse()` as `output_config.format`. `zodOutputFormat()` transforms the schema, and `parse()` validates the response and returns the parsed result in `parsed_output`, typed to match the schema. - The example above outputs: + The previous example outputs: ```javascript Output { @@ -260,8 +260,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { - Role = Role.User, + Messages = [new UserMessageParam { Content = "Extract the key information from this email: " + "John Smith (john@example.com) is interested in our Enterprise plan " + "and wants to schedule a demo for next Tuesday at 2pm." @@ -284,7 +283,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco Pass a plain C# class or record to the generic `Create()` overload. The SDK derives a JSON schema from the type, transforms it, and parses each text block back into it. - The example above outputs: + The previous example outputs: ```text Output wrap ContactInfo { Name = John Smith, Email = john@example.com, PlanInterest = Enterprise, DemoRequested = True } @@ -332,7 +331,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco The SDK generates and transforms the JSON schema from the struct and unmarshals the response into it. - The example above outputs: + The previous example outputs: ```text Output wrap main.ContactInfo{Name:"John Smith", Email:"john@example.com", PlanInterest:"Enterprise", DemoRequested:true} @@ -370,7 +369,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco When you pass a Java class to `outputConfig()`, the SDK derives a JSON schema from it and validates the schema. The builder then produces a `StructuredMessageCreateParams`. Rather than transforming the schema, the SDK's local validation rejects [constraints not supported by the API](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#json-schema-limitations). Read the parsed result with `response.content().stream().flatMap(block -> block.text().stream()).findFirst().orElseThrow().text()`. - The example above outputs: + The previous example outputs: ```text Output wrap {"name":"John Smith","email":"john@example.com","plan_interest":"Enterprise","demo_requested":true} @@ -381,9 +380,9 @@ Structured outputs guarantee schema-compliant responses through constrained deco - Java retains generic type information for fields in the class's metadata, but generic type erasure applies in other scopes. While a JSON schema can be derived from a `BookList.books` field with type `List`, a valid JSON schema cannot be derived from a local variable of that same type. + Java retains generic type information for fields in the class's metadata, but generic type erasure applies in other scopes. Although a JSON schema can be derived from a `BookList.books` field with type `List`, a valid JSON schema cannot be derived from a local variable of that same type. - If an error occurs while converting a JSON response to a Java class instance, the error message includes the JSON response to assist in diagnosis. If your JSON response may contain sensitive information, avoid logging it directly, or ensure that you redact any sensitive details from the error message. + If an error occurs while converting a JSON response to a Java class instance, the error message includes the JSON response to help with diagnosis. If your JSON response might contain sensitive information, avoid logging it directly, or ensure that you redact any sensitive details from the error message. @@ -393,7 +392,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco * **Local validation** occurs without sending requests to the remote AI model. * **Remote validation** is also performed by the AI model upon receiving the JSON schema. - * **Version compatibility:** Local validation may fail while remote validation succeeds if the SDK version is outdated. + * **Version compatibility:** Local validation might fail while remote validation succeeds if the SDK version is outdated. * **Disabling local validation:** Pass `JsonSchemaLocalValidation.NO` if you encounter compatibility issues: ```java @@ -426,8 +425,8 @@ Structured outputs guarantee schema-compliant responses through constrained deco You can control visibility with annotations: - * `@JsonIgnore` excludes a `public` field or getter method - * `@JsonProperty` includes a non-`public` field or getter method + * `@JsonIgnore` excludes a `public` field or getter method. + * `@JsonProperty` includes a non-`public` field or getter method. If you define `private` fields with `public` getter methods, the SDK derives the property name from the getter (for example, `private` field `myValue` with `public` method `getMyValue()` produces a `"myValue"` property). To use a non-conventional getter name, annotate the method with `@JsonProperty`. @@ -556,7 +555,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco } ``` - Local validation checks that you haven't used any unsupported constraint keywords, but constraint values aren't validated locally. For example, an unsupported `"format"` value may pass local validation but cause a remote error. + Local validation checks that you haven't used any unsupported constraint keywords, but constraint values aren't validated locally. For example, an unsupported `"format"` value might pass local validation but cause a remote error. If you use both Jackson and Swagger annotations to set the same schema field, the Jackson annotation takes precedence. @@ -603,7 +602,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco `parsedOutput()` returns your model instance on success, or `null` (or an error array) if parsing fails. Use `instanceof` to narrow the type before accessing fields. - The example above outputs: + The previous example outputs: ```text Output wrap object(ContactInfo)#42 (4) { @@ -696,7 +695,7 @@ Structured outputs guarantee schema-compliant responses through constrained deco Define a class that extends `Anthropic::BaseModel` and pass it to `messages.create()` as `output_config: {format: Model}`. The SDK derives a JSON schema from the class, transforms it, and assigns the parsed result to the response's `parsed_output` attribute as a typed Ruby object. - The example above outputs: + The previous example outputs: ```text Output wrap {name: "John Smith", email: "john@example.com", plan_interest: "Enterprise", demo_requested: true} @@ -741,7 +740,7 @@ Most SDK helpers transform schemas that use unsupported features. The transforma 1. **Remove unsupported constraints** (for example, `minimum`, `maximum`, `minLength`, `maxLength`) 2. **Update descriptions** by adding each unsupported constraint to the field's description (for example, `{minimum: 100}`) 3. **Add `additionalProperties: false`** to all objects -4. **Filter string formats** to supported list only +4. **Filter string formats** to the supported list only 5. **Validate responses** against your original schema and all its constraints, if the helper validates responses Claude receives a simplified schema, but a helper that validates responses still enforces every constraint in your code. @@ -876,7 +875,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run print(contact) ``` - The example above outputs: + The previous example outputs: ```text Output wrap {'name': 'John Smith', 'email': 'john@example.com', 'plan_interest': 'Enterprise', 'demo_requested': True} @@ -918,11 +917,11 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run console.log(response.parsed_output); ``` - Use `jsonSchemaOutputFormat()` to pass a plain JSON schema to `parse()`, without installing Zod. The API returns a response that conforms to the schema, and if you declare the schema with `as const`, the type for `parsed_output` is automatically inferred by TypeScript according to your schema. For an imported or generated schema, `parsed_output` is typed as `unknown`. + Use `jsonSchemaOutputFormat()` to pass a plain JSON schema to `parse()`, without installing Zod. The API returns a response that conforms to the schema, and if you declare the schema with `as const`, TypeScript automatically infers the type for `parsed_output` according to your schema. For an imported or generated schema, `parsed_output` is typed as `unknown`. - By default, the helper [transforms the schema](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#how-sdk-transformation-works) the same way `zodOutputFormat()` does. Pass `{ transform: false }` as the second argument to send it unchanged. Unlike `zodOutputFormat()`, it doesn't validate the response, so it won't catch violations of [constraints not supported by the API](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#json-schema-limitations), such as `minimum`. + By default, the helper [transforms the schema](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#how-sdk-transformation-works) the same way `zodOutputFormat()` does. Pass `{ transform: false }` as the second argument to send it unchanged. Unlike `zodOutputFormat()`, it doesn't validate the response, so it doesn't catch violations of [constraints not supported by the API](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#json-schema-limitations), such as `minimum`. - The example above outputs: + The previous example outputs: ```javascript Output { name: 'John Smith', email: 'john@example.com', planInterest: 'Pro' } @@ -941,8 +940,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { - Role = Role.User, + Messages = [new UserMessageParam { Content = "Extract the key information from this email: " + "John Smith (john@example.com) is interested in our Enterprise plan " + "and wants to schedule a demo for next Tuesday at 2pm." @@ -1034,7 +1032,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run } ``` - The example above outputs: + The previous example outputs: ```text Output wrap main.ContactInfo{Name:"John Smith", Email:"john@example.com", PlanInterest:"Enterprise", DemoRequested:true} @@ -1089,7 +1087,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run } ``` - The example above outputs: + The previous example outputs: ```text Output wrap {"name":"John Smith","email":"john@example.com","plan_interest":"Enterprise"} @@ -1134,7 +1132,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run Pass the schema as an associative array to `OutputConfig::with()`, and decode the response with `json_decode()`. - The example above outputs: + The previous example outputs: ```text Output wrap array(3) { @@ -1186,7 +1184,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run p contact ``` - The example above outputs: + The previous example outputs: ```text Output wrap {"name" => "John Smith", "email" => "john@example.com", "plan_interest" => "Enterprise", "demo_requested" => true} @@ -1351,7 +1349,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run }, }, }, - Messages = [new() { Role = Role.User, Content = $"Extract invoice data from: {invoiceText}" }] + Messages = [new UserMessageParam { Content = $"Extract invoice data from: {invoiceText}" }] }; var message = await client.Messages.Create(parameters); @@ -1653,7 +1651,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = $"Classify this feedback: {feedbackText}" }], + Messages = [new UserMessageParam { Content = $"Classify this feedback: {feedbackText}" }], OutputConfig = new OutputConfig { Format = new JsonOutputFormat @@ -1939,7 +1937,7 @@ To use a JSON schema from a file, an OpenAPI spec, or code that builds it at run { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Process this request: ..." }], + Messages = [new UserMessageParam { Content = "Process this request: ..." }], OutputConfig = new OutputConfig { Format = new JsonOutputFormat @@ -2162,8 +2160,8 @@ To enforce JSON Schema compliance on tool inputs with grammar-constrained sampli JSON outputs and strict tool use solve different problems and work together: -* **JSON outputs** control Claude's response format (what Claude says) -* **Strict tool use** validates tool parameters (how Claude calls your functions) +* **JSON outputs** control Claude's response format (what Claude says). +* **Strict tool use** validates tool parameters (how Claude calls your functions). When combined, Claude can call tools with guaranteed-valid parameters AND return structured JSON responses. This is useful for agentic workflows where you need both reliable tool calls and structured final outputs. @@ -2254,6 +2252,8 @@ When combined, Claude can call tools with guaranteed-valid parameters AND return ``` ```python Python + client = anthropic.Anthropic() + response = client.messages.create( model="claude-opus-5-5", max_tokens=1024, @@ -2300,6 +2300,8 @@ When combined, Claude can call tools with guaranteed-valid parameters AND return ``` ```typescript TypeScript + const client = new Anthropic(); + const response = await client.messages.create({ model: "claude-opus-5-5", max_tokens: 1024, @@ -2357,7 +2359,7 @@ When combined, Claude can call tools with guaranteed-valid parameters AND return { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Help me plan a trip to Paris departing May 15, 2026" }], + Messages = [new UserMessageParam { Content = "Help me plan a trip to Paris departing May 15, 2026" }], // JSON outputs: structured response format OutputConfig = new OutputConfig { @@ -2591,9 +2593,9 @@ When combined, Claude can call tools with guaranteed-valid parameters AND return Structured outputs use constrained sampling with compiled grammar artifacts. This introduces some performance characteristics to be aware of: -* **First request latency:** The first time you use a specific schema, there is additional latency while the grammar compiles +* **First request latency:** The first time you use a specific schema, there is additional latency while the grammar compiles. -* **Automatic caching:** Compiled grammars are cached for 24 hours from last use, making subsequent requests much faster +* **Automatic caching:** Compiled grammars are cached for 24 hours from last use, making subsequent requests much faster. * **Cache invalidation:** The cache is invalidated if you change: @@ -2605,9 +2607,9 @@ Structured outputs use constrained sampling with compiled grammar artifacts. Thi When using structured outputs, Claude automatically receives an additional system prompt explaining the expected output format. This means: -* Your input token count is slightly higher -* The injected prompt costs you tokens like any other system prompt -* Changing the `output_config.format` parameter will invalidate any [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for that conversation thread +* Your input token count is slightly higher. +* The injected prompt costs you tokens like any other system prompt. +* Changing the `output_config.format` parameter will invalidate any [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) for that conversation thread. ### JSON Schema limitations @@ -2615,9 +2617,9 @@ Structured outputs support standard JSON Schema with some limitations. Both JSON * All basic types: object, array, string, integer, number, boolean, null - * `enum` (strings, numbers, bools, or nulls only - no complex types). For a capitalization caveat, see [Invalid outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#invalid-outputs). + * `enum` (strings, numbers, Booleans, or nulls only, no complex types). For a capitalization caveat, see [Invalid outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#invalid-outputs). * `const` - * `anyOf` and `allOf` (with limitations - `allOf` with `$ref` not supported) + * `anyOf` and `allOf` (with limitations: `allOf` with `$ref` not supported) * `$ref`, `$def`, and `definitions` (external `$ref` not supported) * `default` property for all supported types * `required` and `additionalProperties` (must be set to `false` for objects) @@ -2652,7 +2654,7 @@ Structured outputs support standard JSON Schema with some limitations. Both JSON * Word boundaries: `\b`, `\B` * Complex `{n,m}` quantifiers with large ranges - Simple regex patterns work well. Complex patterns may result in 400 errors. + Simple regex patterns work well. Complex patterns might result in 400 errors. @@ -2701,7 +2703,7 @@ If property order in the output is important to your application, mark all prope ### Invalid outputs -While structured outputs guarantee schema compliance in most cases, there are scenarios where the output may not match your schema: +Although structured outputs guarantee schema compliance in most cases, there are scenarios where the output might not match your schema: **Refusals** (`stop_reason: "refusal"`) @@ -2710,21 +2712,21 @@ Claude maintains its safety and helpfulness properties even when using structure * The response has `stop_reason: "refusal"` * You'll receive a 200 status code * You'll be billed for the tokens generated -* The output may not match your schema because the refusal message takes precedence over schema constraints +* The output might not match your schema because the refusal message takes precedence over schema constraints -A property that asks for the model's thinking or step-by-step reasoning may lead to a `reasoning_extraction` refusal. Ask for a short explanation instead. See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). +A property that asks for the model's thinking or step-by-step reasoning might lead to a `reasoning_extraction` refusal. Ask for a short explanation instead. See [Keep reasoning in thinking blocks](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#keep-reasoning-in-thinking-blocks). **Token limit reached** (`stop_reason: "max_tokens"`) -If the response is cut off due to reaching the `max_tokens` limit: +If the response is cut off because it reached the `max_tokens` limit: * The response has `stop_reason: "max_tokens"` -* The output may be incomplete and not match your schema +* The output might be incomplete and not match your schema * Retry with a higher `max_tokens` value to get the complete structured output **Enum value casing** -Structured outputs don't guarantee the capitalization of string `enum` and `const` values: Claude may return a value that differs from your schema only in capitalization, typically in the first letter of a word following a space. For example, given this schema: +Structured outputs don't guarantee the capitalization of string `enum` and `const` values: Claude might return a value that differs from your schema only in capitalization, typically in the first letter of a word following a space. For example, given this schema: ```json { @@ -2733,7 +2735,7 @@ Structured outputs don't guarantee the capitalization of string `enum` and `cons } ``` -The output may contain `"Conversation Topic 3"` (capital "T") even though that exact value isn't in the enum. The response completes normally, with no error and no special `stop_reason`. This applies to both JSON outputs and strict tool use. Compare enum values case-insensitively, and avoid enum values that differ only in capitalization. +The output might contain `"Conversation Topic 3"` (capital "T") even though that exact value isn't in the enum. The response completes normally, with no error and no special `stop_reason`. This applies to both JSON outputs and strict tool use. Compare enum values case-insensitively, and avoid enum values that differ only in capitalization. ### Schema complexity limits @@ -2755,27 +2757,27 @@ The following limits apply to all requests with `output_config.format` or `stric #### Additional internal limits -Beyond the explicit limits in the preceding table, there are additional internal limits on the compiled grammar size. These limits exist because schema complexity doesn't reduce to a single dimension: features like optional parameters, union types, nested objects, and number of tools interact with each other in ways that can make the compiled grammar disproportionately large. +Beyond the explicit limits in the preceding table, there are additional internal limits on the compiled grammar size. These limits exist because schema complexity doesn't reduce to a single dimension: features such as optional parameters, union types, nested objects, and number of tools interact with each other in ways that can make the compiled grammar disproportionately large. -When these limits are exceeded, you'll receive a 400 error with the message "Schema is too complex for compilation." These errors mean the combined complexity of your schemas exceeds what can be efficiently compiled, even if each individual limit in the preceding table is satisfied. As a final stop-gap, the API also enforces a **compilation timeout of 180 seconds**. Schemas that pass all explicit checks but produce very large compiled grammars may hit this timeout. +When these limits are exceeded, you'll receive a 400 error with the message "Schema is too complex for compilation." These errors mean the combined complexity of your schemas exceeds what can be efficiently compiled, even if each individual limit in the preceding table is satisfied. As a final stop-gap, the API also enforces a **compilation timeout of 180 seconds**. Schemas that pass all explicit checks but produce very large compiled grammars might hit this timeout. #### Tips for reducing schema complexity If you're hitting complexity limits, try these strategies in order: -1. **Mark only critical tools as strict.** If you have many tools, reserve it for tools where schema violations cause real problems, and rely on Claude's natural adherence for simpler tools. +1. **Mark only critical tools as strict.** If you have many tools, reserve strict tool use for those where schema violations cause real problems, and rely on Claude's natural adherence for simpler tools. 2. **Reduce optional parameters.** Make parameters `required` where possible. Each optional parameter roughly doubles a portion of the grammar's state space. If a parameter always has a reasonable default, consider making it required and having Claude provide that default explicitly. 3. **Simplify nested structures.** Deeply nested objects with optional fields compound the complexity. Flatten structures where possible. -4. **Split into multiple requests.** If you have many strict tools, consider splitting them across separate requests or sub-agents. +4. **Split into multiple requests.** If you have many strict tools, consider splitting them across separate requests or subagents. For persistent issues with valid schemas, [contact support](https://support.claude.com/en/articles/9015913-how-to-get-support) with your schema definition. ## Migrating from the beta -The `output_format` parameter has moved to `output_config.format`, and beta headers are no longer required. The `output_format` parameter is deprecated and will be removed in the future. To use it anyway, add the `structured-outputs-2025-11-13` beta header. Without it, the API returns a 400 error. +The `output_format` parameter has moved to `output_config.format`, and beta headers are no longer required. The `output_format` parameter is deprecated. To use it anyway, add the `structured-outputs-2025-11-13` beta header. Without it, the API returns a 400 error. The Python SDK (v1.0 and later) does not accept `output_format={...}` on `client.beta.messages.create()` or `count_tokens()` and raises a `TypeError`. Use `output_config` instead. See [Using a raw JSON schema](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#using-a-raw-json-schema) for the updated API shape. @@ -2791,7 +2793,7 @@ For ZDR and HIPAA eligibility across all features, see [API and data retention]( **Works with:** -* **[Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing):** Process structured outputs at scale with 50% discount +* **[Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing):** Process structured outputs at scale with a 50 percent discount * **[Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting):** Count tokens without compilation * **[Streaming](https://platform.claude.com/docs/en/build-with-claude/streaming):** Stream structured outputs like normal responses * **[Combined usage](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#using-both-features-together):** Use JSON outputs (`output_config.format`) and strict tool use (`strict: true`) together in the same request @@ -2799,7 +2801,7 @@ For ZDR and HIPAA eligibility across all features, see [API and data retention]( **Incompatible with:** * **[Citations](https://platform.claude.com/docs/en/build-with-claude/citations):** Citations require interleaving citation blocks with text, which conflicts with strict JSON schema constraints. Returns 400 error if citations enabled with `output_config.format`. -* **Message Prefilling:** Incompatible with JSON outputs +* **Message prefilling:** Incompatible with JSON outputs **Grammar scope:** Grammars apply only to Claude's direct output, not to tool use calls, tool results, or thinking tags (when using [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking)). Grammar state resets between sections, allowing Claude to think freely while still producing structured output in the final response. @@ -2817,7 +2819,7 @@ For ZDR and HIPAA eligibility across all features, see [API and data retention]( - Connect Claude to external tools and APIs. Learn where tools execute and how the agentic loop works. + Connect Claude to external tools and APIs. Learn where tools run and how the agentic loop works. diff --git a/content/en/build-with-claude/task-budgets.md b/content/en/build-with-claude/task-budgets.md index 69d0dcb13a..210904a02a 100644 --- a/content/en/build-with-claude/task-budgets.md +++ b/content/en/build-with-claude/task-budgets.md @@ -18,7 +18,7 @@ featureMetadata: - claude-haiku-5-5 --- -Task budgets let you tell Claude how many tokens it has for a full agentic loop, including thinking, tool calls, tool results, and output. The model sees a running countdown and uses it to prioritize work and finish gracefully as the budget is consumed. +Task budgets let you tell Claude how many tokens it has for a full agentic loop, including thinking, tool calls, tool results, and output. The model receives a running countdown and uses it to prioritize work and finish gracefully as the budget is consumed. ## When to use task budgets @@ -28,7 +28,7 @@ Task budgets work best for agentic workflows where Claude makes multiple tool ca * You have a predictable per-task cost or latency ceiling to enforce. * You want the model to finish gracefully (summarize findings, report progress) as it approaches the budget rather than cutting off mid-action. -Task budgets complement the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort): effort controls how thoroughly Claude reasons about each step, while task budgets cap the total work Claude can do across an agentic loop. +Task budgets complement the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort): effort controls how thoroughly Claude reasons about each step, whereas task budgets cap the total work Claude can do across an agentic loop. ## Setting a task budget @@ -119,7 +119,7 @@ Add `task_budget` to `output_config` and include the beta header: { Model = Messages::Model.ClaudeOpus5_5, MaxTokens = 128000, - Messages = [new() { Role = Role.User, Content = "Review the codebase and propose a refactor plan." }], + Messages = [new BetaUserMessageParam { Content = "Review the codebase and propose a refactor plan." }], OutputConfig = new BetaOutputConfig { Effort = Effort.High, @@ -250,14 +250,14 @@ The `task_budget` object has three fields: ## How the budget countdown works -Claude sees a budget-countdown marker injected server-side throughout the conversation. The marker shows how many tokens remain in the current agentic loop and updates as the model generates thinking, tool calls, and output, and as it processes tool results. Claude uses this signal to pace itself and finish gracefully as the budget is consumed. +Claude receives a budget-countdown marker injected server-side throughout the conversation. The marker shows how many tokens remain in the current agentic loop and updates as the model generates thinking, tool calls, and output, and as it processes tool results. Claude uses this signal to pace itself and finish gracefully as the budget is consumed. **The countdown is visible only to the model.** API responses do not include a remaining-budget field: there is no `task_budget` information in the response `usage` object, and the SDK has no accessor for it. To track spend client-side, sum token usage across the requests in your loop as shown in [Measure your current usage](https://platform.claude.com/docs/en/build-with-claude/task-budgets#measure-your-current-usage), or pass your own figure forward with `remaining` when [carrying a budget across compaction](https://platform.claude.com/docs/en/build-with-claude/task-budgets#carrying-a-budget-across-compaction-with-remaining). - **The countdown reflects tokens Claude has processed in the current agentic loop, not tokens you resend between requests.** If your client sends the full conversation history on every follow-up request, your client-side token count might differ from the budget Claude is tracking. If you also decrement `remaining` while resending full history, the model sees an under-reported budget and the countdown drops faster than it should, causing Claude to wrap up earlier than the budget actually allows. Set a generous budget and let the model self-regulate against the countdown rather than trying to mirror it client-side. + **The countdown reflects tokens Claude has processed in the current agentic loop, not tokens you resend between requests.** If your client sends the full conversation history on every follow-up request, your client-side token count might differ from the budget Claude is tracking. If you also decrement `remaining` while resending full history, the model receives an under-reported budget and the countdown drops faster than it should, causing Claude to finish earlier than the budget actually allows. Set a generous budget and let the model self-regulate against the countdown rather than trying to mirror it client-side. ### What counts as a turn @@ -293,7 +293,7 @@ That holds even when the message adds new content alongside the tool results: } ``` -Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) during a turn does not reset the budget: tokens the turn consumed before the compaction still count against it. Tokens from before the turn began do not count, even when a compaction at the start of a turn summarizes them. Today, that exclusion applies only to the budget carried across a server-side compaction; earlier turns' history still counts while it remains in the context. +Server-side [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) during a turn does not reset the budget: tokens the turn consumed before the compaction still count against it. Tokens from before the turn do not count, even when a compaction at the start of a turn summarizes them. Today, that exclusion applies only to the budget carried across a server-side compaction; earlier turns' history still counts while it remains in the context. ### Worked example: budget counting across requests @@ -331,7 +331,7 @@ Claude thinks, then emits a tool call and stops with `stop_reason: "tool_use"`: } ``` -Suppose this assistant message (thinking plus the tool call) totals 5,000 generated tokens. The countdown Claude saw during generation ended near `remaining` ≈ 95,000. +Suppose this assistant message (thinking plus the tool call) totals 5,000 generated tokens. The countdown Claude received during generation ended near `remaining` ≈ 95,000. **Request 2.** Your client runs the tool, then resends the full history with the tool result appended: @@ -483,7 +483,7 @@ If your own code compacts or rewrites the message history between requests (for ``` -In this example, the tokens spent before compaction are the usage of all the messages you have removed from the history so far, measured as in [Measure your current usage](https://platform.claude.com/docs/en/build-with-claude/task-budgets#measure-your-current-usage). Leave out anything still present in the messages you send, including any summary you added, because the server counts those tokens itself. Update this figure only when you replace the history this way; don't decrement it per request. Pass the resulting `remaining` on every request, not only the one that compacts. +In this example, the tokens spent before compaction are the usage of all the messages you have removed from the history so far, measured as in [Measure your current usage](https://platform.claude.com/docs/en/build-with-claude/task-budgets#measure-your-current-usage). Leave out anything still present in the messages you send, including any summary you added, because the server counts those tokens itself. Update this figure only when you replace the history this way; don't decrement it on each request. Pass the resulting `remaining` on every request, not only the one that compacts. For loops that resend the full uncompacted history on every request, omit `remaining` and let the server track the countdown. @@ -493,17 +493,17 @@ For loops that resend the full uncompacted history on every request, omit `remai ## Task budgets are advisory, not enforced -Task budgets are a **soft hint, not a hard cap**. Claude may occasionally exceed the budget if it is in the middle of an action that would be more disruptive to interrupt than to finish. The enforced limit on total output tokens is still `max_tokens`, which truncates the response with `stop_reason: "max_tokens"` when reached. +Task budgets are a **soft hint, not a hard cap**. Claude might occasionally exceed the budget if it is in the middle of an action that would be more disruptive to interrupt than to complete. The enforced limit on total output tokens is still `max_tokens`, which truncates the response with `stop_reason: "max_tokens"` when reached. For a hard cap on cost or latency, combine task budgets with a reasonable `max_tokens` value: * Use `task_budget` to give Claude a target to pace against. * Use `max_tokens` as the absolute ceiling that prevents runaway generation. -Because `task_budget` spans the full agentic loop (potentially many requests) while `max_tokens` caps each individual request, the two values are independent; one is not required to be at or below the other. +Because `task_budget` spans the full agentic loop (potentially many requests) whereas `max_tokens` caps each individual request, the two values are independent; one is not required to be at or below the other. - **A budget that is too small for the task can cause refusal-like behavior.** When Claude sees a budget that is clearly insufficient for the work being asked (for example, a 20,000-token budget for a multihour agentic coding task), it may decline to attempt the task at all, scope it down aggressively, or stop early with a partial result rather than start work it cannot finish. If you observe unexpected refusals or premature stops after setting a budget, raise the budget before debugging other parameters. Size budgets against your actual task-length distribution rather than a fixed default; see [Choosing a budget](https://platform.claude.com/docs/en/build-with-claude/task-budgets#choosing-a-budget). + **A budget that is too small for the task can cause refusal-like behavior.** When Claude sees a budget that is clearly insufficient for the work being asked (for example, a 20,000-token budget for a multihour agentic coding task), it might decline to attempt the task at all, scope it down aggressively, or stop early with a partial result rather than start work it cannot complete. If you observe unexpected refusals or premature stops after setting a budget, raise the budget before debugging other parameters. Size budgets against your actual task-length distribution rather than a fixed default; see [Choosing a budget](https://platform.claude.com/docs/en/build-with-claude/task-budgets#choosing-a-budget). ## Choosing a budget @@ -512,7 +512,7 @@ The right budget depends on how much work your agentic loop currently does. Rath ### Measure your current usage -Run a representative sample of tasks **without** `task_budget` set and record the total tokens Claude spends per task. For an agentic loop, sum `usage.output_tokens` across every request in the loop, plus the tokens of the tool results you append between requests: +Run a representative sample of tasks **without** `task_budget` set and record the total tokens Claude spends for each task. For an agentic loop, sum `usage.output_tokens` across every request in the loop, plus the tokens of the tool results you append between requests: ```bash cURL @@ -576,7 +576,7 @@ Run a representative sample of tasks **without** `task_budget` set and record th { Model = Model.ClaudeOpus5_5, MaxTokens = 4096, - Messages = [new() { Role = Role.User, Content = "Review the codebase and propose a refactor plan." }], + Messages = [new UserMessageParam { Content = "Review the codebase and propose a refactor plan." }], }); // Sum OutputTokens (text + thinking + tool calls) across every request in your loop. @@ -652,8 +652,8 @@ The minimum accepted `task_budget.total` is **20,000 tokens** on every model tha ## Interaction with other parameters -* **`max_tokens`:** Orthogonal to task budgets. `max_tokens` is a hard per-request cap on generated tokens, while `task_budget` is an advisory cap across the full agentic loop (potentially spanning many requests). At `xhigh` or `max` effort, set `max_tokens` to at least 64k to give Claude room to think and act on each request. -* **[Effort](https://platform.claude.com/docs/en/build-with-claude/effort):** Effort controls how deeply Claude reasons per step. Task budgets control how much total work Claude does across an agentic loop. The two are complementary: effort tunes depth, task budgets tune breadth. +* **`max_tokens`:** Orthogonal to task budgets. `max_tokens` is a hard per-request cap on generated tokens, whereas `task_budget` is an advisory cap across the full agentic loop (potentially spanning many requests). At `xhigh` or `max` effort, set `max_tokens` to at least 64k to give Claude room to think and act on each request. +* **[Effort](https://platform.claude.com/docs/en/build-with-claude/effort):** Effort controls how deeply Claude reasons about each step. Task budgets control how much total work Claude does across an agentic loop. The two are complementary: effort tunes depth, and task budgets tune breadth. * **[Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking):** Task budgets include thinking tokens in the count, so adaptive thinking scales down as the budget depletes. * **[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching):** The budget-countdown marker is injected server-side on each request, so it does not match across requests. If your client decrements `task_budget.remaining` on each follow-up request, the changed value invalidates any cache prefix that contains it. To preserve caching, set the budget once on the initial request and let the model self-regulate against the server-side countdown rather than mutating the budget client-side. diff --git a/content/en/build-with-claude/thinking-steering-and-cost.md b/content/en/build-with-claude/thinking-steering-and-cost.md index 5aa1e87051..f9096c7f4b 100644 --- a/content/en/build-with-claude/thinking-steering-and-cost.md +++ b/content/en/build-with-claude/thinking-steering-and-cost.md @@ -8,29 +8,29 @@ description: Steer how often and how deeply Claude thinks with effort levels, sy To learn how zero data retention (ZDR) applies to this feature, see [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention). -Claude's thinking is adaptive: the model evaluates each request and determines whether to think and how much. You set an intent, optionally specify the effort, and the model allocates reasoning where it judges reasoning will help. +Claude's thinking is adaptive: the model evaluates each request and determines whether to think and how much. You set an intent, optionally specify the effort, and the model allocates reasoning where reasoning is likely to help. This makes thinking a strong fit for workloads that mix trivial and complex requests, and for long-horizon agentic workflows where the right amount of reasoning varies from step to step. -To learn how to turn thinking on, how to read thinking output, and about [thinking output on Claude Fable 5 and Claude Mythos 5](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-output-on-claude-fable-5-and-claude-mythos-5), see the [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) overview. This page covers how Claude determines when to think, how to steer thinking, and the caching, cost, and pricing mechanics that follow from it. +To learn how to turn thinking on and how to read thinking output, see the [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) overview. This page covers how Claude determines when to think, how to steer thinking, and the caching, cost, and pricing mechanics that follow from it. ## How Claude determines when to think -Thinking is optional for the model. On each request, Claude weighs the complexity of the input and determines whether deeper reasoning would improve the answer. A simple factual question may get a direct response with no thinking block at all; a multistep math problem or a tricky debugging task triggers deeper reasoning. +Thinking is optional for the model. On each request, Claude evaluates the complexity of the input and determines whether deeper reasoning would improve the answer. A simple factual question may get a direct response with no thinking block at all; a multistep math problem or a tricky debugging task triggers deeper reasoning. -The decision happens per request. The same conversation can contain turns with and without thinking, and a turn where Claude chose not to think contains no thinking block. Don't build application logic that assumes every assistant turn starts with one. +This determination happens per request. The same conversation can contain turns with and without thinking, and a turn where Claude skips thinking contains no thinking block. Don't build application logic that assumes every assistant turn starts with one. -The primary control over this decision is the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) parameter, which acts as soft guidance for how willing Claude should be to think and how deeply; see [Effort levels](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#effort-levels) on this page for what each level does. +The primary control over this determination is the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) parameter, which acts as soft guidance for how often and how deeply Claude uses thinking; see [Effort levels](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#effort-levels) on this page for what each level does. If you want Claude to think less often, lower the effort level before reaching for prompt-based steering. -Thinking also interleaves with tool use automatically: Claude can think between tool calls, reflecting on each tool result before determining what to do next ([interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#interleaved-thinking)). You don't need a beta header or any additional configuration for this. +Thinking also interleaves with tool use automatically: Claude can think between tool calls, evaluating each tool result before determining what to do next ([interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#interleaved-thinking)). You don't need a beta header or any additional configuration for this. -For the full picture of how the thinking configuration and the effort parameter interact, see [Thinking and effort](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-effort). +For full details on how the thinking configuration and the effort parameter interact, see [Thinking and effort](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-effort). ## Steering how often Claude thinks -Whether Claude thinks on a given turn is promptable. Effort sets the overall posture, but you can also shape the decision directly with natural-language guidance, either globally in the system prompt or per message from the user turn. +Whether Claude thinks on a given turn is promptable. Effort sets the overall posture, but you can also shape that behavior directly with natural-language guidance, either globally in the system prompt or per message from the user turn. Use the two levers together in this order: @@ -52,14 +52,14 @@ Effort is the primary steering lever for thinking. Each level sets a different d | `max` | Claude thinks the most readily and at the greatest depth, with no constraint on thinking length. | | `xhigh` | Claude thinks more readily and at greater depth than at `high`, suited to extended exploration. | | `high` (default on most models) | Claude thinks on most requests that benefit from it. Provides deep reasoning on complex tasks. | -| `medium` (default on Claude Opus 5.5 and Claude Haiku 5.5) | Claude uses moderate thinking. May skip thinking for simple queries. | +| `medium` (default on Claude Opus 5.5 and Claude Haiku 5.5) | Claude uses moderate thinking. Might skip thinking for simple queries. | | `low` | Claude minimizes thinking. Skips thinking for simple tasks where speed matters most. | -At every level, Claude determines per request whether to think. In a tool-use loop, the first request after new user input typically carries most of the reasoning, and follow-up requests that only process tool results can skip thinking, including at `xhigh` and `max`. Thinking per request also tends to decrease as a conversation grows longer. No level guarantees a thinking block on every request. +At every level, Claude determines for each request whether to think. In a tool-use loop, the first request after new user input typically carries most of the reasoning, and follow-up requests that only process tool results can skip thinking, including at `xhigh` and `max`. Thinking per request also tends to decrease as a conversation grows longer. No level guarantees a thinking block on every request. This table describes how each level changes thinking behavior. For guidance on which level to choose for a given workload, including per-model recommendations, see [When to adjust the effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort#when-to-adjust-the-effort-parameter) on the effort page. -Effort is set at `output_config.effort`, not inside the `thinking` object; for full per-language examples, see [Effort](https://platform.claude.com/docs/en/build-with-claude/effort#basic-usage). +Effort is set at `output_config.effort`, not inside the `thinking` object; for full per-language examples, see [Set the effort level](https://platform.claude.com/docs/en/build-with-claude/effort#basic-usage). ```json { @@ -82,7 +82,7 @@ will meaningfully improve answer quality, typically for problems that require multistep reasoning. When in doubt, respond directly. ``` -To encourage thinking instead, use a phrase like: +To encourage thinking instead, use a phrase such as: ```text wrap This task involves multistep reasoning. Think carefully before responding. @@ -103,7 +103,7 @@ On Claude Haiku 5.5, the discouraging phrase doesn't reliably reduce thinking. O Prompt-based steering changes model behavior, so treat it like any other prompt change: measure before you ship. Run a representative sample of your traffic with and without the guidance, and compare how often thinking triggers (the presence of thinking blocks in responses), output token usage, latency, and answer quality on the cases that matter to you. - Steering Claude to think less often may reduce quality on tasks that benefit from reasoning. Lowering the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level is usually the better first lever, since it is a calibrated control rather than a wording-sensitive instruction. Measure the impact on your specific workloads before deploying prompt-based tuning to production. + Steering Claude to think less often might reduce quality on tasks that benefit from reasoning. Lowering the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level is usually the better first lever, because it is a calibrated control rather than a wording-sensitive instruction. Measure the impact on your specific workloads before deploying prompt-based tuning to production. ## Mechanics @@ -112,11 +112,11 @@ Three mechanics follow from Claude managing its own thinking: turn validation, p ### Turn validation -Assistant turns don't need to start with a thinking block. (Models using a legacy manual thinking budget enforce that the final assistant turn of a thinking-enabled request begins with one; see [Turn structure in manual mode](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#turn-structure-in-manual-mode).) +Assistant turns don't need to start with a thinking block. (Models using a legacy manual thinking budget enforce that the final assistant turn of a thinking-enabled request starts with one; see [Turn structure in manual mode](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#turn-structure-in-manual-mode).) For multi-turn applications, this means you can pass back conversation history in whatever shape you have it: -* Assistant turns where Claude chose not to think are valid history as-is. +* Assistant turns without thinking are valid history as-is. * You can resume a conversation that began without thinking, or that used a different thinking configuration, without rewriting its history. * History assembled from mixed sources doesn't need thinking blocks reinserted at the start of each assistant turn to pass validation. @@ -126,7 +126,7 @@ The relaxation is about validation, not about what you should send. When you hav Consecutive requests that keep the same thinking configuration and effort level preserve prompt caching; see [Thinking and prompt caching](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-prompt-caching) for the full rules. The resolved effort value is rendered into the prompt, so changing it between requests invalidates cache breakpoints, just as changing the legacy [`budget_tokens`](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#extended-thinking-with-prompt-caching) parameter does on models that use it. Setting `effort` explicitly to the model's default is equivalent to omitting it and does not break the cache. -The practical consequence: pick a thinking configuration and a top-level effort level per conversation and keep them. If some turns need more or less thinking, use a [per-message effort change](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) (beta) on models that support it, or steer with [per-message prompting](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#tuning-thinking-behavior). Both leave earlier cache breakpoints intact, where a change to the thinking configuration or the top-level effort level does not. +The practical consequence: pick a thinking configuration and a top-level effort level for each conversation and keep them. If some turns need more or less thinking, use a [per-message effort change](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) (beta) on models that support it, or steer with [per-message prompting](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#tuning-thinking-behavior). Both leave earlier cache breakpoints intact, where a change to the thinking configuration or the top-level effort level does not. The following example demonstrates the invalidation with a multi-turn script you can run yourself: @@ -134,13 +134,13 @@ The following example demonstrates the invalidation with a multi-turn script you - This workflow doesn't translate well to a one-off shell command. See the SDK tabs for the multi-turn pattern; per-turn HTTP requests follow the examples on the [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) page. + This workflow doesn't translate well to a one-off shell command. Use the Claude SDK to run it; per-turn HTTP requests follow the examples on the [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) page. - This workflow doesn't translate well to a one-off shell command. See the SDK tabs for the multi-turn pattern; per-turn CLI invocations follow the examples on the [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) page. + This workflow doesn't translate well to a one-off shell command. Use the Claude SDK to run it; per-turn CLI commands follow the examples on the [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) page. @@ -316,10 +316,9 @@ The following example demonstrates the invalidation with a multi-turn script you Thinking = new ThinkingConfigAdaptive(), Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { @@ -330,7 +329,7 @@ The following example demonstrates the invalidation with a multi-turn script you { Text = "Analyze the tone of this passage." }), - }) + } } ] }; @@ -346,10 +345,9 @@ The following example demonstrates the invalidation with a multi-turn script you Thinking = new ThinkingConfigAdaptive(), Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { @@ -360,18 +358,13 @@ The following example demonstrates the invalidation with a multi-turn script you { Text = "Analyze the tone of this passage." }), - }) + } }, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = response1.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() - { - Role = Role.User, - Content = "Analyze the characters in this passage." - } + new UserMessageParam { Content = "Analyze the characters in this passage." } ] }; @@ -390,10 +383,9 @@ The following example demonstrates the invalidation with a multi-turn script you }, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam() { @@ -404,28 +396,18 @@ The following example demonstrates the invalidation with a multi-turn script you { Text = "Analyze the tone of this passage." }), - }) + } }, - new() + new AssistantMessageParam { - Role = Role.Assistant, Content = response1.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() - { - Role = Role.User, - Content = "Analyze the characters in this passage." - }, - new() + new UserMessageParam { Content = "Analyze the characters in this passage." }, + new AssistantMessageParam { - Role = Role.Assistant, Content = response2.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() - { - Role = Role.User, - Content = "Analyze the setting in this passage." - } + new UserMessageParam { Content = "Analyze the setting in this passage." } ] }; @@ -540,7 +522,7 @@ The following example demonstrates the invalidation with a multi-turn script you .model(Model.CLAUDE_OPUS_5_5) .maxTokens(16000L) .thinking(ThinkingConfigAdaptive.builder().build()) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text(largeText) .cacheControl(CacheControlEphemeral.builder().build()) @@ -560,7 +542,7 @@ The following example demonstrates the invalidation with a multi-turn script you .model(Model.CLAUDE_OPUS_5_5) .maxTokens(16000L) .thinking(ThinkingConfigAdaptive.builder().build()) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text(largeText) .cacheControl(CacheControlEphemeral.builder().build()) @@ -569,7 +551,7 @@ The following example demonstrates the invalidation with a multi-turn script you .text("Analyze the tone of this passage.") .build()) )) - .addAssistantMessageOfBlockParams(response1.content().stream() + .addAssistantMessageOfContentBlockParams(response1.content().stream() .map(block -> block.toParam()) .collect(Collectors.toList())) .addUserMessage("Analyze the characters in this passage.") @@ -587,7 +569,7 @@ The following example demonstrates the invalidation with a multi-turn script you .outputConfig(OutputConfig.builder() .effort(OutputConfig.Effort.LOW) .build()) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofText(TextBlockParam.builder() .text(largeText) .cacheControl(CacheControlEphemeral.builder().build()) @@ -596,11 +578,11 @@ The following example demonstrates the invalidation with a multi-turn script you .text("Analyze the tone of this passage.") .build()) )) - .addAssistantMessageOfBlockParams(response1.content().stream() + .addAssistantMessageOfContentBlockParams(response1.content().stream() .map(block -> block.toParam()) .collect(Collectors.toList())) .addUserMessage("Analyze the characters in this passage.") - .addAssistantMessageOfBlockParams(response2.content().stream() + .addAssistantMessageOfContentBlockParams(response2.content().stream() .map(block -> block.toParam()) .collect(Collectors.toList())) .addUserMessage("Analyze the setting in this passage.") @@ -865,7 +847,7 @@ The following example demonstrates the invalidation with a multi-turn script you - Here is the output of the script (you may see slightly different numbers): + Here is the output of the script (you might see slightly different numbers): ```text Output wrap First request - establishing cache @@ -890,7 +872,7 @@ You don't set a thinking token budget. Two controls bound cost: Because thinking counts toward `max_tokens`, set it high enough to leave room for both the reasoning and the answer. A `max_tokens` sized for a response with no thinking is often too small once Claude starts thinking on hard requests. -At `high` effort and above, Claude may think extensively and is more likely to exhaust the budget. If you see [`stop_reason: "max_tokens"`](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#stopped-at-max-tokens) in responses, you have two remedies: +At `high` effort and above, Claude might think extensively and is more likely to exhaust the budget. If you see [`stop_reason: "max_tokens"`](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#stopped-at-max-tokens) in responses, you have two remedies: * Raise `max_tokens` to give the model more room for thinking plus the answer. * Lower the effort level so Claude thinks less and leaves more of the budget for response text. @@ -902,7 +884,7 @@ Which one is right depends on whether the truncated responses needed the reasoni Thinking incurs charges for: * Tokens Claude uses while thinking (billed as output tokens) -* Thinking blocks from prior assistant turns that remain in context, per the [preservation default](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model): all turns by default on keep-all models, only the last turn elsewhere (billed as input tokens) +* Thinking blocks from prior assistant turns that remain in context, according to the [preservation default](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model): all turns by default on keep-all models, only the last turn elsewhere (billed as input tokens) * Standard text output tokens @@ -950,6 +932,6 @@ To see how many billed output tokens were spent on internal reasoning, read `usa - Control how much thinking and output Claude allocates per request. + Control how much thinking and output Claude allocates for each request. diff --git a/content/en/build-with-claude/thinking-tool-workflows.md b/content/en/build-with-claude/thinking-tool-workflows.md index 24e17a45aa..acdf3ab959 100644 --- a/content/en/build-with-claude/thinking-tool-workflows.md +++ b/content/en/build-with-claude/thinking-tool-workflows.md @@ -153,7 +153,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), Tools = [weatherTool], - Messages = [new() { Role = Role.User, Content = "What's the weather in Paris?" }] + Messages = [new UserMessageParam { Content = "What's the weather in Paris?" }] }; var message = await client.Messages.Create(parameters); @@ -265,7 +265,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c } message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, thinking: { type: "adaptive" @@ -281,7 +281,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c - You should see `thinking` and `tool_use` blocks in the response content on a run where Claude chose to think (on simpler requests, adaptive mode may skip the thinking block). A note Claude writes before the tool call comes back as a `text` block or, on models that write [progress updates](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates), as another `thinking` block. Keep this content array intact: the next step sends it back verbatim. + You should see `thinking` and `tool_use` blocks in the response content on a run that includes thinking (on simpler requests, adaptive mode may skip the thinking block). A note Claude writes before the tool call comes back as a `text` block or, on models that write [progress updates](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates), as another `thinking` block. Keep this content array intact: the next step sends it back verbatim. To see thinking text like this output, add `display: "summarized"` to the request. On models where display defaults to omitted, including Claude Opus 5.5, the `thinking` field otherwise comes back as an empty string with only the `signature` populated. Either way, echo the content array back unchanged; see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). @@ -344,8 +344,8 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c # Extract the tool use block to get its ID for the tool result tool_use_block = next(block for block in response.content if block.type == "tool_use") - # Call your actual weather API, here is where your actual API call would go - # Let's pretend this is what we get back + # This is where your actual weather API call would go + # Pretend this is what the weather API returns weather_data = {"temperature": 88} # Second request - Include the assistant turn and the tool result @@ -402,8 +402,8 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c // Extract the tool use block to get its ID for the tool result const toolUseBlock = response.content.find((block) => block.type === "tool_use"); - // Call your actual weather API, here is where your actual API call would go - // Let's pretend this is what we get back + // This is where your actual weather API call would go + // Pretend this is what the weather API returns const weatherData = { temperature: 88 }; if (toolUseBlock) { @@ -459,9 +459,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), Tools = [weatherTool], - Messages = [ - new() { Role = Role.User, Content = "What's the weather in Paris?" } - ] + Messages = [new UserMessageParam { Content = "What's the weather in Paris?" }] }; var response = await client.Messages.Create(parameters); @@ -487,17 +485,17 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c Thinking = new ThinkingConfigAdaptive(), Tools = [weatherTool], Messages = [ - new() { Role = Role.User, Content = "What's the weather in Paris?" }, + new UserMessageParam { Content = "What's the weather in Paris?" }, // response.Content includes the thinking blocks; passing them back is required - new() { Role = Role.Assistant, Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, - new() { Role = Role.User, Content = new MessageParamContent(new List + new AssistantMessageParam { Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList() }, + new UserMessageParam { Content = new List { new ContentBlockParam(new ToolResultBlockParam() { ToolUseID = toolUseBlock?.ID ?? "", Content = $"Current temperature: {weatherData.temperature}°F" }) - })} + }} ] }; @@ -617,7 +615,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c .addTool(weatherTool) .addUserMessage("What's the weather in Paris?") .addMessage(response) - .addUserMessageOfBlockParams(List.of( + .addUserMessageOfContentBlockParams(List.of( ContentBlockParam.ofToolResult( ToolResultBlockParam.builder() .toolUseId(toolUseBlock.id()) @@ -707,7 +705,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c } response = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, thinking: { type: "adaptive" @@ -725,7 +723,7 @@ The example defines a `get_weather` tool, lets Claude think and request a tool c weather_data = { temperature: 88 } continuation = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, thinking: { type: "adaptive" diff --git a/content/en/build-with-claude/thinking-troubleshooting.md b/content/en/build-with-claude/thinking-troubleshooting.md index 93c9d1da33..26cdf0a879 100644 --- a/content/en/build-with-claude/thinking-troubleshooting.md +++ b/content/en/build-with-claude/thinking-troubleshooting.md @@ -54,7 +54,7 @@ The request fails with a 400 error whose message reads: "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior. ``` -This happens because the model you requested has removed extended thinking (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). +This occurs because the model you requested has removed extended thinking (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). Switch the request to `thinking: {type: "adaptive"}` and steer thinking depth with `effort` instead of `budget_tokens`. [Migrating to adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#migrating-to-adaptive-thinking) walks through the conversion. @@ -72,7 +72,7 @@ On Claude Mythos Preview, the only one of these models that accepts extended thi "thinking.type.disabled" is not supported for this model. Thinking defaults to adaptive mode when not specified; use "thinking.type.enabled" with "budget_tokens" for extended thinking. ``` -This happens because thinking is always on for all of these models (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). +This occurs because thinking is always on for all of these models (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). Omit the `thinking` parameter; these models think without any configuration. If your goal was to keep thinking text out of responses, use `display: "omitted"` instead of disabling thinking; see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). @@ -94,7 +94,7 @@ The request fails with a 400 error whose message reads: "thinking.type.between_tools" is not supported for this model. ``` -This happens because only Claude Sonnet 5.5 accepts `thinking: {type: "between_tools"}` (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). +This occurs because only Claude Sonnet 5.5 accepts `thinking: {type: "between_tools"}` (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). Send `between_tools` only to Claude Sonnet 5.5. On other models, omit `thinking` or use a `thinking.type` value the table doesn't list as rejected. @@ -106,9 +106,9 @@ On Claude Sonnet 5.5, a request with `thinking: {type: "between_tools"}` at effo output_config.effort 'xhigh' is not supported when thinking is disabled on this model. Use effort 'high' or below, or enable thinking. ``` -This happens because Claude Sonnet 5.5 accepts `between_tools` only at [effort](https://platform.claude.com/docs/en/build-with-claude/effort) `high` or below. The message says thinking is disabled because `between_tools` has no up-front thinking, even though the request didn't send `"disabled"`. The message names the level the request sent. +This occurs because Claude Sonnet 5.5 accepts `between_tools` only at [effort](https://platform.claude.com/docs/en/build-with-claude/effort) `high` or below. The message says thinking is disabled because `between_tools` has no up-front thinking, even though the request didn't send `"disabled"`. The message names the level the request sent. -Lower the effort to `high` or below. To run at `xhigh` or `max`, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. That's what the message means by "enable thinking". Claude Sonnet 5.5 rejects `"enabled"` with a 400 error. +Lower the effort to `high` or below. To run at `xhigh` or `max`, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. That's what the message means by "enable thinking." Claude Sonnet 5.5 rejects `"enabled"` with a 400 error. Claude Haiku 5.5 returns the same message when a request sends `thinking: {type: "disabled"}` at effort `xhigh` or `max`. It accepts `"disabled"` only at `high` or below. Lower the effort, or set `thinking` to `{"type": "adaptive"}`. @@ -122,9 +122,9 @@ messages.N: output_config.effort 'low' differs from the 'high' in effect before The message says thinking is disabled because `between_tools` has no up-front thinking. With `between_tools`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. `messages.N` is the position of the message that set the new level. -Remove that per-message effort, or set it to the level in effect. To vary effort per turn, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. That's what the message means by "enable thinking". +Remove that per-message effort, or set it to the level in effect. To vary effort for each turn, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. That's what the message means by "enable thinking." -Claude Haiku 5.5 returns the same message when a request with `thinking: {type: "disabled"}` sets a per-message effort that differs from the level in effect. Remove that per-message effort, or set `thinking` to `{"type": "adaptive"}` to vary effort per turn. +Claude Haiku 5.5 returns the same message when a request with `thinking: {type: "disabled"}` sets a per-message effort that differs from the level in effect. Remove that per-message effort, or set `thinking` to `{"type": "adaptive"}` to vary effort for each turn. ## A 400 error says adaptive thinking is not supported @@ -134,7 +134,7 @@ The request fails with a 400 error whose message reads: adaptive thinking is not supported on this model ``` -This happens because the model supports only extended thinking (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). +This occurs because the model supports only extended thinking (see the [per-model configuration table](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting#rejected-configurations)). Use `thinking: {type: "enabled", budget_tokens: N}` instead; see [Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) for the configuration. @@ -146,7 +146,7 @@ A request that returns tool results fails with a 400 `invalid_request_error` who `thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified ``` -In multi-turn and tool-use conversations you send previous assistant messages, including their `thinking` and `redacted_thinking` blocks, back to the API, and the API verifies they arrive unmodified. This error happens when the assistant message you send back differs from the one the API returned, most often because your code filters content blocks by type and drops `redacted_thinking` blocks, or rebuilds the assistant message instead of echoing it. +In multi-turn and tool-use conversations you send previous assistant messages, including their `thinking` and `redacted_thinking` blocks, back to the API, and the API verifies they arrive unmodified. This error occurs when the assistant message you send back differs from the one the API returned, most often because your code filters content blocks by type and drops `redacted_thinking` blocks, or rebuilds the assistant message instead of echoing it. Echo the assistant turn back verbatim, thinking blocks included. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks) for the rules, and the worked round trip in [Thinking in tool and multi-turn workflows](https://platform.claude.com/docs/en/build-with-claude/thinking-tool-workflows#two-turn-tool-use-round-trip) for correct code in every SDK. @@ -174,9 +174,9 @@ A block from a model the target model can't read never produces this error: the The response contains `thinking` blocks, but their `thinking` field is an empty string and only the `signature` field is populated. -This happens because `display` defaults to `"omitted"` on newer models, which returns thinking blocks without their text. +This occurs because `display` defaults to `"omitted"` on newer models, which returns thinking blocks without their text. -Set `display: "summarized"` in your thinking configuration to receive the summarized thinking text. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display) for the defaults per model. If you only want the short status lines some models write between tool calls, and not the reasoning, set `display: "updates"` (beta) instead. See [Progress updates between tool calls](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). +Set `display: "summarized"` in your thinking configuration to receive the summarized thinking text. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display) for each model's default. If you only want the short status lines some models write between tool calls, and not the reasoning, set `display: "updates"` (beta) instead. See [Progress updates between tool calls](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). A block whose `thinking` field is empty is still complete: the `signature` holds the reasoning. Send it back with the turn like any other. See [Send assistant turns back exactly as returned](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#append-assistant-turns-exactly-as-returned). @@ -184,7 +184,7 @@ A block whose `thinking` field is empty is still complete: the `signature` holds Some responses contain no `thinking` block at all, even though thinking is configured. -This is normal in adaptive mode: Claude skips thinking on requests it judges simple enough to answer directly. +This is normal in adaptive mode: Claude skips thinking on requests it determines are simple enough to answer directly. If you want thinking more often or more deeply, raise `effort` or steer with prompting; see [Steering how often Claude thinks](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#tuning-thinking-behavior). @@ -194,7 +194,7 @@ A forced `tool_choice` (`{"type": "any"}` or a named tool) also returns no `thin A response occasionally writes a tool call into its text instead of emitting a `tool_use` block, or includes `` or other internal XML tags in its visible text. A leaked tool call never runs, and in agentic loops the leaked text stays in the conversation history, so later turns are affected as well. -This happens on Claude Opus 5 when thinking is disabled, most commonly on tool-heavy workloads such as search. System-prompt rules instructing the model not to think or not to reason increase the tag leakage. +This occurs on Claude Opus 5 when thinking is disabled, most commonly on tool-heavy workloads such as search. System-prompt rules instructing the model not to think or not to reason increase the tag leakage. Re-enable thinking (the default) and use lower `effort` levels to control token cost instead. If your integration must keep thinking disabled, apply the prompting mitigations in [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled). @@ -202,7 +202,7 @@ Re-enable thinking (the default) and use lower `effort` levels to control token The response ends with `stop_reason: "max_tokens"`, often with a truncated or missing text block. -This happens because thinking tokens count toward `max_tokens`, so a long thinking pass can consume the budget before the text response completes. +This occurs because thinking tokens count toward `max_tokens`, so a long thinking pass can consume the budget before the text response completes. Raise `max_tokens` to leave room for both thinking and text, or lower `effort` so Claude spends less on thinking; see [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control) and [Thinking and the context window](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-the-context-window). @@ -218,7 +218,7 @@ Keep the thinking configuration and effort level constant across requests that s You change `effort` but thinking frequency or depth stays the same. -This happens because effort is the primary thinking lever only in adaptive mode. On extended-thinking-only models, thinking depth is set by `budget_tokens` instead. +This occurs because effort is the primary thinking lever only in adaptive mode. On extended-thinking-only models, thinking depth is set by `budget_tokens` instead. Adjust `budget_tokens` on those models, or check which mode your model runs in; see [Thinking and effort](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-effort). On Claude Opus 4.5, the one extended-thinking-only model that supports effort, effort composes with the budget; see [Budget rules and tuning](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#budget-rules-and-tuning). diff --git a/content/en/build-with-claude/thinking.md b/content/en/build-with-claude/thinking.md index 857b75db0e..13d78301e3 100644 --- a/content/en/build-with-claude/thinking.md +++ b/content/en/build-with-claude/thinking.md @@ -8,16 +8,16 @@ description: "Understand how Claude's thinking works: turn it on, read thinking To learn how zero data retention (ZDR) applies to this feature, see [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention). -A model that answers in a single pass has to get everything right on the first try: no scratch work, no checking, no changing course halfway through. For a proof, a tricky bug, or a long agentic task, the first approach is often not the best one. +A model that answers in a single pass has to get everything right on the first try: no scratch work, no checking, no changing approach halfway through. For a proof, a tricky bug, or a long agentic task, the first approach is often not the best one. -Thinking removes that constraint. When thinking is active, Claude works through the problem in its own words before answering: it restates what is being asked, tries approaches, checks intermediate results, and abandons paths that do not hold up. That up-front thinking arrives in `thinking` content blocks ahead of the response, and Claude draws on it to produce the final answer. This is why thinking improves performance on complex tasks like math, coding, analysis, and long-running agentic work, where the quality of the answer depends on intermediate work that would otherwise be compressed into the response itself or skipped. +Thinking removes that constraint. When thinking is active, Claude works through the problem in its own words before answering: it restates what is being asked, tries approaches, checks intermediate results, and abandons paths that do not hold up. That up-front thinking arrives in `thinking` content blocks ahead of the response, and Claude draws on it to produce the final answer. This is why thinking improves performance on complex tasks such as math, coding, analysis, and long-running agentic work, where the quality of the answer depends on intermediate work that would otherwise be compressed into the response itself or skipped. Thinking has a cost: the tokens Claude spends reasoning are billed as output tokens, even when the thinking text isn't returned to you, and they count toward `max_tokens` alongside the response text. This page covers how thinking behaves across the API surface: turning it on, reading its output, and managing its interactions with tools, streaming, caching, and the context window. ## How thinking works - ![Diagram: Claude determines whether to think up front, may think between tool calls, and returns thinking blocks before text](https://platform.claude.com/docs/images/how-thinking-works.svg) + ![Diagram: Claude determines whether to think up front, might think between tool calls, and returns thinking blocks before text](https://platform.claude.com/docs/images/how-thinking-works.svg) Whether Claude thinks on a given request, and how deeply, depends on your thinking configuration and the complexity of the request. @@ -40,13 +40,13 @@ Here is what up-front thinking looks like in a response: one or more `thinking` } ``` -You don't always see this text, and what you see is never the raw chain of thought: the text in a thinking block is a [summary of Claude's reasoning](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking). The `display` field on the thinking configuration controls whether that summary is returned at all: `"summarized"` returns it, while `"omitted"`, the default on many models, returns thinking blocks with an empty `thinking` field. Either way the block is billed the same and passed back the same in multi-turn conversations. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display) for per-model defaults and details. +You don't always see this text, and what you see is never the raw chain of thought: the text in a thinking block is a [summary of Claude's reasoning](https://platform.claude.com/docs/en/build-with-claude/thinking#summarized-thinking). The `display` field on the thinking configuration controls whether that summary is returned at all: `"summarized"` returns it, whereas `"omitted"`, the default on many models, returns thinking blocks with an empty `thinking` field. Either way the block is billed the same and passed back the same in multi-turn conversations. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display) for per-model defaults and details. If Claude uses tools, thinking can also appear between tool calls. See [Thinking with tool use](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-with-tool-use). For the full response format, see the [Messages API reference](https://platform.claude.com/docs/en/api/messages/create). ## Configuring thinking -On most models, thinking is on by default or one parameter away. The following table shows what each model does with each `thinking` value a request can send. A 400 error means the API rejects the request, and [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting) has each error and its fix. +On most models, thinking is on by default or needs only one parameter. The following table shows what each model does with each `thinking` value a request can send. A 400 error means the API rejects the request, and [Troubleshooting thinking](https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting) has each error and its fix. | Model | No `thinking` field | `"adaptive"` | `"enabled"` with `budget_tokens` | `"between_tools"` | `"disabled"` | | --------------------- | ------------------- | ----------------- | -------------------------------- | ----------------------------------------------- | -------------------------------------- | @@ -72,7 +72,7 @@ In the table, "at `high` effort or below" means the request works at `low`, `med On Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, Claude Sonnet 5, Claude Fable 5.1, Claude Mythos 5.1, Claude Fable 5, Claude Mythos 5, Claude Mythos Preview, and Claude Haiku 5.5, thinking is already on and needs no configuration. `display` defaults to `"omitted"` on these models, so the thinking text is hidden until you opt in. Opt in with `thinking: {"type": "adaptive", "display": "summarized"}`, as the following examples do. -On Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, and Claude Sonnet 4.6, thinking is off until you set `thinking: {type: "adaptive"}`, which lets Claude determine when and how deeply to think based on the request. The same request, with the [model string](https://platform.claude.com/docs/en/models/overview) swapped, turns it on there. The following examples set `display: "summarized"` so the thinking text is visible, and use a roomy `max_tokens`: +On Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, and Claude Sonnet 4.6, thinking is off until you set `thinking: {type: "adaptive"}`, which lets Claude determine when and how deeply to think based on the request. The same request, with the [model string](https://platform.claude.com/docs/en/models/overview) swapped, turns it on there. The following examples set `display: "summarized"` so the thinking text is visible, and use a large `max_tokens`: ```bash cURL @@ -166,10 +166,7 @@ On Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, and Claude Sonnet 4.6, thi MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive { Display = Display.Summarized }, Messages = [ - new() { - Role = Role.User, - Content = "What is the greatest common divisor of 1071 and 462?" - } + new UserMessageParam { Content = "What is the greatest common divisor of 1071 and 462?" } ] }; @@ -279,7 +276,7 @@ On Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, and Claude Sonnet 4.6, thi client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, thinking: { type: "adaptive", @@ -384,12 +381,7 @@ On Claude Sonnet 5, where thinking is on by default, you can turn it off: Model = Model.ClaudeSonnet5, MaxTokens = 4096, Thinking = new ThinkingConfigDisabled(), - Messages = [ - new() { - Role = Role.User, - Content = "Summarize this article in one sentence." - } - ] + Messages = [new UserMessageParam { Content = "Summarize this article in one sentence." }] }; var message = await client.Messages.Create(parameters); @@ -450,7 +442,7 @@ On Claude Sonnet 5, where thinking is on by default, you can turn it off: client = Anthropic::Client.new message = client.messages.create( - model: "claude-sonnet-5", + model: Anthropic::Model::CLAUDE_SONNET_5, max_tokens: 4096, thinking: { type: "disabled" }, messages: [ @@ -485,7 +477,7 @@ The `display` field on the thinking configuration controls how thinking content * `"omitted"`: thinking blocks are returned with an empty `thinking` field. The `signature` field still carries the encrypted full thinking for multi-turn continuity (see [Thinking encryption](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption)). This is the default on Claude Fable 5.1, Claude Mythos 5.1, Claude Fable 5, Claude Mythos 5, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7, [Claude Mythos Preview](https://anthropic.com/glasswing), and Claude Haiku 5.5. * `"updates"` (beta): reasoning blocks are returned with an empty `thinking` field, as with `"omitted"`, and the short [progress updates](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) some models write between tool calls come back as readable text. Requires the beta header `thinking-display-updates-2026-08-18`. -Set `display: "omitted"` when your application doesn't surface thinking content to users. The primary benefit is faster time-to-first-text-token when streaming: the server skips streaming thinking tokens entirely and delivers only the signature, so the final text response begins streaming sooner. +Set `display: "omitted"` when your application doesn't surface thinking content to users. The primary benefit is faster time-to-first-text-token when streaming: the server skips streaming thinking tokens entirely and delivers only the signature, so the final text response starts streaming sooner. With `display: "omitted"`, the response contains `thinking` blocks with an empty `thinking` field: @@ -510,7 +502,7 @@ Keep the following in mind when working with omitted thinking: * You're still charged for the full thinking tokens. Omitting reduces latency, not cost. * If you pass thinking blocks back in multi-turn conversations, pass them unchanged. The server decrypts the `signature` to reconstruct the original thinking for prompt construction (see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks)). Any text you place in the `thinking` field of a round-tripped omitted block is ignored. * `display` is invalid with `thinking.type: "disabled"` (there is nothing to display) and with `thinking.type: "between_tools"` (Claude Sonnet 5.5 only), which accepts no other field. With `between_tools`, progress updates still come back with summary text, as they do under `display: "updates"` (see [Progress updates](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates)). -* When using `thinking.type: "adaptive"` and the model skips thinking for a simple request, no thinking block is produced regardless of `display`. +* When you use `thinking.type: "adaptive"` and the model skips thinking for a simple request, no thinking block is produced regardless of `display`. * When streaming with `display: "omitted"`, no thinking text is streamed. Each thinking block streams a `thinking_delta` with an empty `thinking` string, then its `signature_delta`. With `display: "updates"`, only [progress-update blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) stream `thinking_delta` events that carry text. See [Streaming thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#streaming-thinking) for the event sequence. @@ -526,7 +518,7 @@ Keep the following in mind when working with summarized thinking: * You're charged for the full thinking tokens generated by the original request, not the summary tokens. The billed output token count does not match the count of tokens you see in the response. * On Claude Opus 4.6, Claude Sonnet 4.6, and earlier models, the first few lines of thinking output are more verbose, providing detailed reasoning that's particularly helpful for prompt engineering purposes. [Claude Mythos Preview](https://anthropic.com/glasswing) summarizes from the first token, so its thinking blocks do not show this verbose preamble. * Summarization preserves the key ideas of Claude's thinking process with minimal added latency, so summaries can stream as they arrive. -* Summarization is processed by a different model from the one you target in your requests. The thinking model does not see the summarized output. +* Summarization is processed by a different model from the one you target in your requests. The thinking model does not receive the summarized output. * As Anthropic seeks to improve the thinking feature, summarization behavior is subject to change. @@ -540,7 +532,7 @@ To see the model's reasoning, read the `thinking` blocks rather than prompting f Thinking works with [streaming](https://platform.claude.com/docs/en/build-with-claude/streaming). Thinking blocks stream as `thinking_delta` events inside `content_block_delta` events, followed by a single `signature_delta` event just before the block's `content_block_stop`. Text blocks stream afterward as usual. - ![Diagram of the streaming event sequence with thinking: the thinking block opens, thinking deltas carry text only when the display setting returns text (summarized, or updates for progress-update blocks), a single signature delta closes the block, then text deltas stream](https://platform.claude.com/docs/images/how-thinking-streams.svg) + ![Streaming with thinking: thinking deltas (text only if the display setting returns it), a signature delta, then text deltas](https://platform.claude.com/docs/images/how-thinking-streams.svg) The following examples stream a response with adaptive thinking, printing thinking and text deltas as they arrive: @@ -642,14 +634,14 @@ The following examples stream a response with adaptive thinking, printing thinki Model = Model.ClaudeOpus5_5, MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive { Display = Display.Summarized }, - Messages = [new() { Role = Role.User, Content = "What is the greatest common divisor of 1071 and 462?" }] + Messages = [new UserMessageParam { Content = "What is the greatest common divisor of 1071 and 462?" }] }; await foreach (var rawEvent in client.Messages.CreateStreaming(parameters)) { if (rawEvent.TryPickContentBlockStart(out var start)) { - Console.WriteLine($"\nStarting {start.ContentBlock.Type} block..."); + Console.WriteLine($"\nStarting {start.ContentBlock.Type.Raw()} block..."); } else if (rawEvent.TryPickContentBlockDelta(out var delta)) { @@ -781,7 +773,7 @@ The following examples stream a response with adaptive thinking, printing thinki client = Anthropic::Client.new stream = client.messages.stream( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, # A plain hash like this one takes display:. The typed ThinkingConfigAdaptive class # spells it display_ (trailing underscore) to avoid shadowing Ruby's Kernel#display. @@ -846,7 +838,7 @@ To reassemble complete thinking blocks with their signatures after streaming, us ``` -When `display: "omitted"` is set, the thinking block opens, a `thinking_delta` with an empty `thinking` string arrives, a single `signature_delta` follows, and the block closes. Text streaming begins immediately after: +When `display: "omitted"` is set, the thinking block opens, a `thinking_delta` with an empty `thinking` string arrives, a single `signature_delta` follows, and the block closes. Text streaming starts immediately after: ```sse Output event: content_block_start @@ -892,7 +884,7 @@ Under `"updates"`, treat a block as a progress update as soon as one of its `thi The streaming system processes content in batches, which can delay and group streaming events into this "chunky" delivery pattern. -For general streaming mechanics, see [Streaming Messages](https://platform.claude.com/docs/en/build-with-claude/streaming). +For general streaming mechanics, see [Streaming messages](https://platform.claude.com/docs/en/build-with-claude/streaming). ## Thinking and effort @@ -914,7 +906,7 @@ Thinking works alongside [tool use](https://platform.claude.com/docs/en/agents-a 1. **Tool choice limitation (manual mode):** tool use with manual extended thinking (`thinking: {type: "enabled"}`) only supports `tool_choice: {"type": "auto"}` (the default) or `tool_choice: {"type": "none"}`. Using `tool_choice: {"type": "any"}` or `tool_choice: {"type": "tool", "name": "..."}` results in an error because these options force tool use, which is incompatible with manual extended thinking. Adaptive thinking, including on models where thinking is on by default, supports forced tool use, except on Claude Opus 5.5, Claude Sonnet 5.5, Claude Fable 5.1, and Claude Mythos 5.1 (see [Response prefill and forced tool use](https://platform.claude.com/docs/en/build-with-claude/thinking#limits-and-feature-compatibility)). Where forced tool use is accepted, the response starts with the tool call and has no `thinking` block. 2. **Preserving thinking blocks:** when you return tool results, you must pass the thinking blocks from the assistant message back to the API, complete and unmodified. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). -**A tool-use loop is one assistant turn.** From the model's perspective, an assistant turn doesn't complete until Claude finishes its full response, which may include multiple tool calls and results. This whole sequence is a single assistant turn: +**A tool-use loop is one assistant turn.** From the model's perspective, an assistant turn doesn't complete until Claude finishes its full response, which might include multiple tool calls and results. This whole sequence is a single assistant turn: ```text wrap User: "What's the weather in Paris?" @@ -923,9 +915,9 @@ User: [tool_result: "20°C, sunny"] Assistant: [text: "The weather in Paris is 20°C and sunny"] ``` -The entire turn runs in a single thinking mode: you can't toggle thinking in the middle of a turn, including during the tool-use loop. In extended (manual) mode, the API additionally enforces that the final assistant turn of a thinking-enabled request begins with a thinking block. Adaptive mode relaxes this: no assistant turn needs to start with one. +The entire turn runs in a single thinking mode: you can't toggle thinking in the middle of a turn, including during the tool-use loop. In extended (manual) mode, the API additionally enforces that the final assistant turn of a thinking-enabled request starts with a thinking block. Adaptive mode relaxes this: no assistant turn needs to start with one. -**Mid-turn conflicts degrade gracefully.** If you toggle thinking mid-turn (for example, between sending a tool call and returning its result), the API doesn't error. Instead, it silently disables thinking for that request. To preserve model quality, the API may strip thinking blocks that would create an invalid turn structure, or disable thinking when the conversation history is incompatible with thinking being enabled. To confirm whether thinking was active, check for the presence of `thinking` blocks in the response. +**Mid-turn conflicts degrade gracefully.** If you toggle thinking mid-turn (for example, between sending a tool call and returning its result), the API doesn't error. Instead, it silently disables thinking for that request. To preserve model quality, the API might strip thinking blocks that would create an invalid turn structure, or disable thinking when the conversation history is incompatible with thinking being enabled. To confirm whether thinking was active, check for the presence of `thinking` blocks in the response. **Toggle between turns, not within them.** Plan your thinking strategy at the start of each turn. Complete the assistant turn, then change the thinking configuration for the next one: @@ -942,7 +934,7 @@ Toggling thinking modes also invalidates prompt caching. See [Thinking and promp ### Preserving thinking blocks -When Claude invokes a tool, it pauses construction of its response to await external information. When you return the tool result, Claude continues building that same response, so its earlier reasoning must still be present. Pass every `thinking` block back to the API complete and unmodified, alongside the `tool_use` block it accompanied. This matters for two reasons: +When Claude calls a tool, it pauses construction of its response to await external information. When you return the tool result, Claude continues building that same response, so its earlier reasoning must still be present. Pass every `thinking` block back to the API complete and unmodified, alongside the `tool_use` block it accompanied. This matters for two reasons: 1. **Reasoning continuity:** the thinking blocks capture the step-by-step reasoning that led to the tool requests. Including them lets Claude continue reasoning from where it left off. 2. **Context maintenance:** tool results appear as user messages in the API structure, but they're part of one continuous reasoning flow. Preserving thinking blocks maintains that flow across API calls. @@ -1055,7 +1047,7 @@ Keep the following in mind when working with progress updates: * Pass progress-update blocks back unchanged with the rest of the assistant turn, like any other `thinking` block. * The text you receive is a summary of the progress update, normally a sentence or two. Don't rely on its length. The progress update counts toward `usage.output_tokens` at its full length, not the summary's. * A progress-update block can come back with an empty `thinking` field under any `display` value. Render nothing for an empty block. Under `"updates"` it looks the same as an empty reasoning block and needs no separate handling. -* When a response stops on `max_tokens`, `model_context_window_exceeded`, or `stop_sequence` soon after a tool call or tool result, its last block can be a progress-update block standing in for the work the model hadn't finished. Under `"updates"` and `"summarized"` its text is exactly `This part of the response was interrupted before it finished.` and you can show it like any other update. Under `"omitted"` it's empty. To continue, pass the assistant turn back unchanged and append a new `user` message (with a `tool_result` for each `tool_use` block in that turn). +* When a response stops on `max_tokens`, `model_context_window_exceeded`, or `stop_sequence` soon after a tool call or tool result, its last block can be a progress-update block standing in for the work the model hadn't completed. Under `"updates"` and `"summarized"` its text is exactly `This part of the response was interrupted before it finished.` and you can show it like any other update. Under `"omitted"` it's empty. To continue, pass the assistant turn back unchanged and append a new `user` message (with a `tool_result` for each `tool_use` block in that turn). * When [streaming](https://platform.claude.com/docs/en/build-with-claude/thinking#streaming-thinking), expect a pause of several seconds before a progress-update block opens. See the `"updates"` trace in [Streaming thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#streaming-thinking). * These models write fewer progress updates at higher [effort](https://platform.claude.com/docs/en/build-with-claude/effort) and in long tool chains. If your interface depends on them, see [Ask for user-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#ask-for-user-facing-progress-updates) or, for Claude Opus 5.5, [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates). For Claude Sonnet 5.5, see [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#user-facing-progress-updates). @@ -1068,7 +1060,7 @@ Whether thinking blocks from previous assistant turns stay in context by default Preservation brings two benefits: -* **Cache optimization:** preserved thinking blocks enable cache hits during tool use, as they are passed back with tool results and cached incrementally across the assistant turn, resulting in token savings in multistep workflows. +* **Cache optimization:** preserved thinking blocks allow cache hits during tool use, as they are passed back with tool results and cached incrementally across the assistant turn, resulting in token savings in multistep workflows. * **No intelligence impact:** preserving thinking blocks has no negative effect on model performance. The tradeoff is context usage: long conversations consume more context space on keep-all models, because retained thinking blocks count as input like any other conversation history (see [Thinking and the context window](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-the-context-window)). The behavior is automatic in both regimes. No code changes or beta headers are required, and you should keep passing complete, unmodified thinking blocks back as described in [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). To override the default in either direction, use [thinking block clearing](https://platform.claude.com/docs/en/build-with-claude/context-editing#thinking-block-clearing). @@ -1089,9 +1081,9 @@ The model check applies to every account. The API enforces the prefix check by d To keep thinking valid, send every assistant turn back exactly as you received it and add new messages only at the end of `messages`. If your code builds the `messages` array itself, the Preserved thinking page covers: * [What counts as an edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#what-counts-as-an-edit), and [how to check whether your code makes one](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#how-to-tell-whether-your-integration-is-impacted). -* [The API feature that replaces each common edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits): mid-conversation system messages for new instructions and per-turn reminders, `tool_addition` and `tool_removal` blocks for tool changes, per-message `output_config` for effort changes, and server-side compaction and context editing for trimming. +* The [API feature that replaces each common edit](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#replace-prefix-edits): mid-conversation system messages for new instructions and per-turn reminders, `tool_addition` and `tool_removal` blocks for tool changes, per-message `output_config` for effort changes, and server-side compaction and context editing for trimming. * [Client-side compaction](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#custom-compaction-on-the-client): which patterns keep thinking valid and which don't. -* [The `thinking-binding-controls-2026-08-01` beta header](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls). It adds a `block_binding.prefix_mismatch_behavior` field (`"error"` or `"drop_block"`) to the thinking configuration and an `input_transformations` array to every response. The array lists each thinking block that the API dropped, or that failed the prefix check and was let through. +* The [`thinking-binding-controls-2026-08-01` beta header](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#preserved-thinking-controls). It adds a `block_binding.prefix_mismatch_behavior` field (`"error"` or `"drop_block"`) to the thinking configuration and an `input_transformations` array to every response. The array lists each thinking block that the API dropped, or that failed the prefix check and was let through. ## Thinking and prompt caching @@ -1146,13 +1138,13 @@ In practice: The following diagrams illustrate the last-turn-only (stripping) regime. The first shows a multi-turn conversation: each turn's thinking block is generated in the output but not carried into later turns' input. - ![Diagram of thinking on a model that strips previous thinking blocks: each turn's thinking block is generated in the output and not carried into later turns' input](https://platform.claude.com/docs/images/context-window-thinking.svg) + ![Thinking on a model that strips previous thinking: each turn's thinking is generated but not carried into later turns' input](https://platform.claude.com/docs/images/context-window-thinking.svg) The second shows the same regime with tool use: thinking stays in context alongside its tool result for the duration of the assistant turn, then drops out on the next user turn. - ![Diagram of thinking with tool use on a model that strips previous thinking blocks: thinking is kept with its tool result, then dropped on the next user turn](https://platform.claude.com/docs/images/context-window-thinking-tools.svg) + ![Thinking with tools on a model that strips previous thinking: thinking stays with its tool result until the next user turn](https://platform.claude.com/docs/images/context-window-thinking-tools.svg) Use the [token counting API](https://platform.claude.com/docs/en/build-with-claude/token-counting) to get accurate counts for your specific use case, especially for multi-turn conversations that include thinking. @@ -1172,7 +1164,7 @@ Keep the following in mind when working with signatures: ## Redacted thinking blocks -In addition to regular `thinking` blocks, the API may return `redacted_thinking` blocks when portions of Claude's reasoning are safety-redacted. A `redacted_thinking` block contains encrypted thinking content in a `data` field, with no readable text: +In addition to regular `thinking` blocks, the API might return `redacted_thinking` blocks when portions of Claude's reasoning are safety-redacted. A `redacted_thinking` block contains encrypted thinking content in a `data` field, with no readable text: ```json { @@ -1181,7 +1173,7 @@ In addition to regular `thinking` blocks, the API may return `redacted_thinking` } ``` -The `data` field is opaque and encrypted. Like the `signature` field on regular thinking blocks, pass `redacted_thinking` blocks back to the API unchanged when continuing a multi-turn conversation with [tools](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-with-tool-use). +The `data` field is opaque and encrypted. As with the `signature` field on regular thinking blocks, pass `redacted_thinking` blocks back to the API unchanged when continuing a multi-turn conversation with [tools](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-with-tool-use). If your code filters content blocks by type (for example, `block.type == "thinking"`) when round-tripping responses with tool use, also include `redacted_thinking` blocks. Filtering on `block.type == "thinking"` alone silently drops `redacted_thinking` blocks and breaks the multi-turn protocol described in [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). @@ -1195,7 +1187,7 @@ The `data` field is opaque and encrypted. Like the `signature` field on regular ### Sampling parameters -On Claude Fable 5.1, Claude Mythos 5.1, Claude Fable 5, Claude Mythos 5, Claude Mythos Preview, Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Sonnet 5.5, Claude Sonnet 5, and Claude Haiku 5.5, non-default `temperature`, `top_p`, or `top_k` values return a 400 error on every request, regardless of whether thinking is used. On these models, the `top_p` default is `0.99`, so a `top_p` of `1` returns a 400 error, and so does a request that includes both `temperature` and `top_p`, even at their defaults. See [Remove sampling parameters](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#remove-sampling-parameters). On older models, the restriction applies only while thinking is on: `temperature` and `top_k` are incompatible with thinking, and `top_p` is allowed at values between 0.95 and 1. +On Claude Fable 5.1, Claude Mythos 5.1, Claude Fable 5, Claude Mythos 5, Claude Mythos Preview, Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Sonnet 5.5, Claude Sonnet 5, and Claude Haiku 5.5, non-default `temperature`, `top_p`, or `top_k` values return a 400 error on every request, regardless of whether thinking is used. On these models, the `top_p` default is `0.99`, so a `top_p` of `1` returns a 400 error, and so does a request that includes both `temperature` and `top_p`, even at their defaults. See [Remove sampling parameters](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#remove-sampling-parameters). Starting with [API version `2026-10-21`](https://platform.claude.com/docs/en/api/migration-2026-10-21#sampling-parameters), a request that includes `temperature`, `top_p`, or `top_k` at any value returns a 400 error on every model. On older models in API versions before `2026-10-21`, the restriction applies only while thinking is on: `temperature` and `top_k` are incompatible with thinking, and `top_p` is allowed at values between 0.95 and 1. ### Response prefill and forced tool use @@ -1229,7 +1221,7 @@ See the [models overview](https://platform.claude.com/docs/en/models/overview) f ### Long requests -The SDK requires streaming when `max_tokens` is greater than 21,333, to avoid HTTP timeouts on long-running requests. This is a client-side validation, not an API restriction. If you don't need to process events incrementally, use `.stream()` (java: `.createStreaming()`; csharp: `.CreateStreaming()`; go: `.NewStreaming()`; php: `->createStream()`) with `.get_final_message()` (typescript: `.finalMessage()`; ruby: `.accumulated_message`; csharp: `.Aggregate()`; go: `message.Accumulate(event)`; java, php: `MessageAccumulator`) to get the complete `Message` object without assembling it from individual events yourself. See [Streaming Messages](https://platform.claude.com/docs/en/build-with-claude/streaming#get-the-final-message-without-handling-events). Expect longer response times when thinking is active, because generating thinking blocks adds processing time. For workloads that push thinking above roughly 32k tokens per request, use [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) to avoid networking issues: such requests can run long enough to hit system timeouts and open connection limits. +The SDK requires streaming when `max_tokens` is greater than 21,333, to avoid HTTP timeouts on long-running requests. This is a client-side validation, not an API restriction. If you don't need to process events incrementally, use `.stream()` (java: `.createStreaming()`; csharp: `.CreateStreaming()`; go: `.NewStreaming()`; php: `->createStream()`) with `.get_final_message()` (typescript: `.finalMessage()`; ruby: `.accumulated_message`; csharp: `.Aggregate()`; go: `message.Accumulate(event)`; java, php: `MessageAccumulator`) to get the complete `Message` object without assembling it from individual events yourself. See [Streaming messages](https://platform.claude.com/docs/en/build-with-claude/streaming#get-the-final-message-without-handling-events). Expect longer response times when thinking is active, because generating thinking blocks adds processing time. For workloads that push thinking above roughly 32k tokens per request, use [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) to avoid networking issues: such requests can run long enough to hit system timeouts and open connection limits. ## Next steps @@ -1247,7 +1239,7 @@ The SDK requires streaming when `max_tokens` is greater than 21,333, to avoid HT - Diagnose and fix the most common thinking failures: configuration 400 errors, empty or missing thinking blocks, max\_tokens stops, and cache misses. + Diagnose and fix the most common thinking failures: configuration 400 errors, empty or missing thinking blocks, `max_tokens` stops, and cache misses. diff --git a/content/en/build-with-claude/token-counting.md b/content/en/build-with-claude/token-counting.md index e09a2885af..ead70c89ab 100644 --- a/content/en/build-with-claude/token-counting.md +++ b/content/en/build-with-claude/token-counting.md @@ -32,7 +32,7 @@ This endpoint returns an `invalid_request_error` for a few inputs that the Messa The token count is an **estimate**. In some cases, the actual number of input tokens used when creating a message might differ by a small amount. - Token counts may include tokens added automatically by Anthropic for system optimizations. **You are not billed for system-added tokens**. Billing reflects only your content. + Token counts might include tokens added automatically by Anthropic for system optimizations. **You are not billed for system-added tokens**. Billing reflects only your content. ### Supported models @@ -109,7 +109,7 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support { Model = Model.ClaudeOpus5_5, System = "You are a scientist", - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }] + Messages = [new UserMessageParam { Content = "Hello, Claude" }] }; var response = await client.Messages.CountTokens(parameters); @@ -332,7 +332,7 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support }, }), ], - Messages = [new() { Role = Role.User, Content = "What's the weather like in San Francisco?" }] + Messages = [new UserMessageParam { Content = "What's the weather like in San Francisco?" }] }; var count = await client.Messages.CountTokens(parameters); @@ -606,10 +606,9 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support Model = Model.ClaudeOpus5_5, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new Base64ImageSource() @@ -619,7 +618,7 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support }) )), new ContentBlockParam(new TextBlockParam("Describe this image")), - }), + }, } ] }; @@ -703,7 +702,7 @@ All [active models](https://platform.claude.com/docs/en/models/overview) support MessageCountTokensParams params = MessageCountTokensParams.builder() .model(Model.CLAUDE_OPUS_5_5) - .addUserMessageOfBlockParams(List.of(imageBlock, textBlock)) + .addUserMessageOfContentBlockParams(List.of(imageBlock, textBlock)) .build(); MessageTokensCount count = client.messages().countTokens(params); @@ -785,8 +784,8 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor See [Thinking and the context window](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-and-the-context-window) for more details. - * Thinking blocks from **previous** assistant turns count toward your input tokens on models that [keep all prior turns](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model); on models that keep only the last turn, the API strips them and they do **not** count - * **Current** assistant turn thinking **does** count toward your input tokens + * Thinking blocks from **previous** assistant turns count toward your input tokens on models that [keep all prior turns](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model); on models that keep only the last turn, the API strips them and they do **not** count. + * **Current** assistant turn thinking **does** count toward your input tokens. @@ -933,15 +932,13 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor Thinking = new ThinkingConfigAdaptive(), Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Are there an infinite number of prime numbers such that n mod 4 == 3?" }, - new() + new AssistantMessageParam { - Role = Role.Assistant, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ThinkingBlockParam() { @@ -949,13 +946,9 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor Signature = "EuYBCkQYAiJAgCs1le6/Pol5Z4/JMomVOouGrWdhYNsH3ukzUECbB6iWrSQtsQuRHJID6lWV...", }), new ContentBlockParam(new TextBlockParam("Yes, there are infinitely many prime numbers p such that p mod 4 = 3...")), - }), + }, }, - new() - { - Role = Role.User, - Content = "Can you write a formal proof?" - } + new UserMessageParam { Content = "Can you write a formal proof?" } ] }; @@ -1024,7 +1017,7 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor .model(Model.CLAUDE_OPUS_5_5) .thinking(ThinkingConfigAdaptive.builder().build()) .addUserMessage("Are there an infinite number of prime numbers such that n mod 4 == 3?") - .addAssistantMessageOfBlockParams(assistantBlocks) + .addAssistantMessageOfContentBlockParams(assistantBlocks) .addUserMessage("Can you write a formal proof?") .build(); @@ -1244,10 +1237,9 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor Model = Model.ClaudeOpus5_5, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new DocumentBlockParam( new DocumentBlockParamSource(new Base64PdfSource() @@ -1256,7 +1248,7 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor }) )), new ContentBlockParam(new TextBlockParam("Please summarize this document.")), - }), + }, } ] }; @@ -1316,7 +1308,7 @@ An embedded image block that sets [`"oversized_image": "error"`](https://platfor MessageCountTokensParams params = MessageCountTokensParams.builder() .model(Model.CLAUDE_OPUS_5_5) - .addUserMessageOfBlockParams(List.of(documentBlock, textBlock)) + .addUserMessageOfContentBlockParams(List.of(documentBlock, textBlock)) .build(); MessageTokensCount count = client.messages().countTokens(params); diff --git a/content/en/build-with-claude/vision-coordinates.md b/content/en/build-with-claude/vision-coordinates.md index 4b3bbf457b..bdc87b1d83 100644 --- a/content/en/build-with-claude/vision-coordinates.md +++ b/content/en/build-with-claude/vision-coordinates.md @@ -9,10 +9,10 @@ Claude can locate and label regions of an image (for example, returning bounding You'll need this for OCR pipelines, form extraction, chart parsing, UI element location, and any task where you act on a specific region of an image. For sending images, supported formats, and per-model resolution limits, see [Vision](https://platform.claude.com/docs/en/build-with-claude/vision). - **Claude works best with absolute pixel coordinates.** Ask for them explicitly in your prompt. For example: *"Return the bounding box of each table as `[x1, y1, x2, y2]` (top-left and bottom-right corners) in pixel coordinates."* Claude does not work well when you ask for normalized coordinates, for example: *"Return bounding box coordinates between `0` and `1000`."* Always ask for pixel coordinates and normalize in your own code if you need to. To get coordinates as machine-readable JSON instead of prose, define a schema with [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs), for example an object with an `[x1, y1, x2, y2]` array per detected element. + **Claude works best with absolute pixel coordinates.** Ask for them explicitly in your prompt. For example: *"Return the bounding box of each table as `[x1, y1, x2, y2]` (top-left and bottom-right corners) in pixel coordinates."* Claude does not work well when you ask for normalized coordinates, for example: *"Return bounding box coordinates between `0` and `1000`."* Always ask for pixel coordinates and normalize in your own code if you need to. To get coordinates as machine-readable JSON instead of prose, define a schema with [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs), for example an object with an `[x1, y1, x2, y2]` array for each detected element. -Coordinates follow the standard image convention: the origin `(0, 0)` is the top-left corner of the image, with x increasing to the right and y increasing downward. The coordinates Claude returns are pixel positions in the image Claude sees: your image after Claude resizes it to fit the model's native resolution (see [How Claude resizes and pads images](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images)). To get coordinates you can use directly, either pre-resize your image so the coordinates map one-to-one onto the image you have (see [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading)), or rescale the coordinates Claude returns (see [Rescale coordinates when you cannot pre-resize](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#rescale-coordinates-when-you-cannot-pre-resize)). +Coordinates follow the standard image convention: the origin `(0, 0)` is the top-left corner of the image, with x increasing to the right and y increasing downward. The coordinates Claude returns are pixel positions in the image Claude processes: your image after Claude resizes it to fit the model's native resolution (see [How Claude resizes and pads images](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images)). To get coordinates you can use directly, either pre-resize your image so the coordinates map one-to-one onto the image you have (see [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading)), or rescale the coordinates Claude returns (see [Rescale coordinates when you cannot pre-resize](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#rescale-coordinates-when-you-cannot-pre-resize)). Claude's spatial reasoning has limits (see [Limitations](https://platform.claude.com/docs/en/build-with-claude/vision#limitations)). Coordinate accuracy is best when you state the expected coordinate format in your prompt and spot-check results visually before processing at scale. Small elements lose precision when an image is downscaled: for fine targets, crop the region of interest and send the crop (offset returned coordinates by the crop origin), or use a high-resolution-tier model. For [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), pages are rasterized to images server-side at dimensions you don't control, so the returned coordinates can't be reliably mapped back onto the page. To work with coordinates on PDF content, rasterize the pages to images yourself and use the pre-resize approach. @@ -39,7 +39,7 @@ Claude then pads every image, resized or not, up to the next multiple of 28 pixe ## Resize your image before uploading -The most reliable approach is to resize your image yourself before uploading, so the image you have is exactly the image Claude sees and the coordinates Claude returns need no conversion. +The most reliable approach is to resize your image yourself before uploading, so the image you have is exactly the image Claude processes and the coordinates Claude returns need no conversion. First check which resolution tier your model is on (see [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size)) and pass the matching edge and token limits. The following reference implementation computes the exact size Claude resizes an image to: @@ -457,7 +457,7 @@ Pre-resizing only protects your coordinates while your pipeline keeps producing } ``` -A request whose marked image (any block that sets `"oversized_image": "error"`) would be resized is rejected with a 400 `invalid_request_error` naming the image's dimensions and the largest dimensions that fit. Whether an image triggers the rejection depends on the [limits of every model the request names](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images): the 1920×1080 example below is rejected by a standard-tier model but fits within the high-resolution tier: +A request whose marked image (any block that sets `"oversized_image": "error"`) would be resized is rejected with a 400 `invalid_request_error` naming the image's dimensions and the largest dimensions that fit. Whether an image triggers the rejection depends on the [limits of every model the request names](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images): the following 1920×1080 example is rejected by a standard-tier model but fits within the high-resolution tier: ```text wrap messages.0.content.0: image dimensions 1920x1080 exceed the maximum image size of a model named on this request and would be downsized to 1456x819; scale the image to at most 1456x819 or set the image's oversized_image setting to "downsize" @@ -465,19 +465,19 @@ messages.0.content.0: image dimensions 1920x1080 exceed the maximum image size o Rescale to the reported target and resend: the target is the largest size, at your image's aspect ratio, that every model named on the request accepts. How marked images interact with the [server-side fallback beta](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback) is described with that feature; in every mode, a marked image is never served resized. -The setting is per image. `"oversized_image": "downsize"` (the default when the field is omitted) keeps automatic resizing as described on this page. Each image block is checked only against its own setting, so one request can mix images whose dimensions are load-bearing (a screenshot you'll click on) with images where resizing is harmless (a logo). What the setting does and does not change: +Each image has its own setting. `"oversized_image": "downsize"` (the default when the field is omitted) keeps automatic resizing as described on this page. Each image block is checked only against its own setting, so one request can mix images whose dimensions matter (a screenshot you'll click) with images where resizing is harmless (a logo). What the setting does and does not change: -* Padding ([which never discards content](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images)), format conversion, and orientation correction proceed as usual. +* [Padding](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images) (which never discards content), format conversion, and orientation correction proceed as usual. * The hard limits (8000 px on the longest side, and the stricter per-image limit on [many-image requests](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits)) are separate rejections; this setting never lets an image past them. * Images supplied by URL or file ID are checked once their bytes have been fetched; those rejections carry the same message without the leading position, so they don't identify which image failed; only embedded base64 images are named by position in the error. * [PDF pages](https://platform.claude.com/docs/en/build-with-claude/pdf-support) are rasterized server-side at dimensions you don't control; the `document` block does not accept the field (an image block nested inside a document's content accepts it like any other). -* A marked image whose dimensions cannot be determined is rejected rather than passed through: that rejection reports that the image's source dimensions could not be determined, not the resize message quoted above. No image that sets `"error"` reaches the model resized. +* A marked image whose dimensions cannot be determined is rejected rather than passed through: that rejection reports that the image's source dimensions could not be determined, not the resize message quoted earlier. No image that sets `"error"` reaches the model resized. The [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint honors `transformations` too, rejecting an embedded image exactly as the Messages API would, so you can check whether an embedded image fits without being resized, before running inference. Counting rejects images supplied by URL or file ID rather than fetching them, so a marked image from those sources is checked only at Messages time. ## Rescale coordinates when you cannot pre-resize -If you cannot pre-resize (for example, when the image comes from an upstream system you can't modify), use the resize helper from [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading) to recover the dimensions Claude saw, then map the coordinates Claude returns into normalized coordinates or back onto your original image. Unless an image [opts into an error instead](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#oversized-image-error), Claude resizes oversized images rather than rejecting them, up to the API's [request limits](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits). Beyond those limits the request fails with a validation error instead. Pass the tier limits that match the model you called: the wrong tier's limits recover the wrong resized dimensions and silently shift every coordinate. This approach requires knowing the pixel dimensions of the image you uploaded, so it does not apply to PDF uploads. +If you cannot pre-resize (for example, when the image comes from an upstream system you can't modify), use the resize helper from [Resize your image before uploading](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#resize-your-image-before-uploading) to recover the dimensions of the image Claude processed, then map the coordinates Claude returns into normalized coordinates or back onto your original image. Unless an image opts into an [oversized-image error](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#oversized-image-error) instead, Claude resizes oversized images rather than rejecting them, up to the API's [request limits](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits). Beyond those limits the request fails with a validation error instead. Pass the tier limits that match the model you called: the wrong tier's limits recover the wrong resized dimensions and silently shift every coordinate. This approach requires knowing the pixel dimensions of the image you uploaded, so it does not apply to PDF uploads. Screenshots and zoom images that you return to the [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#handle-coordinate-scaling-for-higher-resolutions) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#targets-and-coordinates) toolsets are an exception to automatic resizing. The API rejects a `tool_result` image that exceeds the model's limits with a validation error instead of resizing it. Resize those images in your application before returning them, then scale the coordinates Claude returns back to your screen's dimensions. diff --git a/content/en/build-with-claude/vision.md b/content/en/build-with-claude/vision.md index 6d7590738c..7afe031a88 100644 --- a/content/en/build-with-claude/vision.md +++ b/content/en/build-with-claude/vision.md @@ -1,7 +1,7 @@ --- title: Vision url: https://platform.claude.com/docs/en/build-with-claude/vision -description: Claude's vision capabilities allow it to understand and analyze images, opening up exciting possibilities for multimodal interaction. +description: Claude's vision capabilities allow it to process and analyze images, opening up exciting possibilities for multimodal interaction. --- This guide describes how to send images to Claude, the limits and costs that apply, and where to find guidance for [coordinate-based workflows](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates). @@ -13,7 +13,7 @@ This guide describes how to send images to Claude, the limits and costs that app Use Claude's vision capabilities through: * [claude.ai](https://claude.ai/). Upload an image like you would a file, or drag and drop an image directly into the chat window. -* [Playground](https://platform.claude.com/playground) in the Claude Console. Add images directly to any User message block. +* [Playground](https://platform.claude.com/playground) in the Claude Console. Add images directly to any **User** message block. * API request. See the following examples. On the API, provide images to Claude as `image` content blocks using one of three source types: @@ -158,10 +158,9 @@ On the API, provide images to Claude as `image` content blocks using one of thre MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new Base64ImageSource() @@ -171,7 +170,7 @@ On the API, provide images to Claude as `image` content blocks using one of thre }) )), new ContentBlockParam(new TextBlockParam("Describe this image.")), - }), + }, } ] }); @@ -225,7 +224,7 @@ On the API, provide images to Claude as `image` content blocks using one of thre MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(contentBlockParams) + .addUserMessageOfContentBlockParams(contentBlockParams) .build() ); @@ -405,10 +404,9 @@ On the API, provide images to Claude as `image` content blocks using one of thre MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new UrlImageSource() @@ -417,7 +415,7 @@ On the API, provide images to Claude as `image` content blocks using one of thre }) )), new ContentBlockParam(new TextBlockParam("Describe this image.")), - }), + }, } ] }); @@ -468,7 +466,7 @@ On the API, provide images to Claude as `image` content blocks using one of thre MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(contentBlockParams) + .addUserMessageOfContentBlockParams(contentBlockParams) .build() ); System.out.println(message); @@ -691,16 +689,15 @@ For images you'll use repeatedly or when you want to avoid encoding overhead, us MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new FileImageSource(fileUpload.ID)) )), new ContentBlockParam(new TextBlockParam("Describe this image.")), - }), + }, } ] }); @@ -773,7 +770,7 @@ For images you'll use repeatedly or when you want to avoid encoding overhead, us MessageCreateParams params = MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams( + .addUserMessageOfContentBlockParams( List.of( ContentBlockParam.ofImage(imageParam), ContentBlockParam.ofText( @@ -1031,10 +1028,9 @@ You can include multiple images in a single request, and Claude analyzes them jo MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new TextBlockParam("Image 1:")), new ContentBlockParam(new ImageBlockParam( @@ -1053,7 +1049,7 @@ You can include multiple images in a single request, and Claude analyzes them jo }) )), new ContentBlockParam(new TextBlockParam("How are these images different?")), - }), + }, } ] }); @@ -1127,7 +1123,7 @@ You can include multiple images in a single request, and Claude analyzes them jo MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024) - .addUserMessageOfBlockParams(contentBlockParams) + .addUserMessageOfContentBlockParams(contentBlockParams) .build() ); @@ -1223,13 +1219,13 @@ In a multi-turn conversation, add new images in later `user` turns the same way. ### Request limits -The maximum number of images per message or request is: +The maximum number of images for each message or request is: -* 20 per message on [claude.ai](https://claude.ai/). -* 100 per request on the API, for models with a 200k-token context window. -* 600 per request on the API, for all other models. +* 20 for each message on [claude.ai](https://claude.ai/) +* 100 for each request on the API, for models with a 200k-token context window +* 600 for each request on the API, for all other models -The maximum dimensions per image are 8000x8000 px. +The maximum dimensions for each image are 8000x8000 px. If a single API request contains more than 20 images, a stricter per-image dimension limit applies to every image in that request. All `image` blocks in the request count toward this threshold, including images from earlier conversation turns that you resend and images nested inside `tool_result` content (for example, screenshots returned to the computer use tool). On Amazon Bedrock and Google Cloud, document blocks such as PDFs also count toward this threshold. Images exceeding the stricter limit are rejected with an `invalid_request_error` whose message references "many-image requests" and states the current limit in pixels. To stay under the limit on all platforms, either resize each image so that neither dimension exceeds 2000 px, or keep the request to 20 or fewer image and document blocks. @@ -1251,7 +1247,7 @@ Claude supports JPEG, PNG, GIF, and WebP images (`image/jpeg`, `image/png`, `ima ### Resolution and token cost -Claude views images in patches instead of pixels. Each patch is a 28×28-pixel block of the image, referred to as a visual token. An image, therefore, costs `⌈width / 28⌉ × ⌈height / 28⌉` visual tokens. +Claude processes images in patches instead of pixels. Each patch is a 28×28-pixel block of the image, referred to as a visual token. An image, therefore, costs `⌈width / 28⌉ × ⌈height / 28⌉` visual tokens. Each model has a maximum native image resolution, expressed as a long-edge limit and a visual-token limit. Images larger than either limit are downscaled before processing; see [How Claude resizes and pads images](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#how-claude-resizes-and-pads-images) for the exact rule. The exception is screenshots and zoom images that you return to the [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#handle-coordinate-scaling-for-higher-resolutions) and [browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#targets-and-coordinates) toolsets: the API rejects a `tool_result` image that exceeds the model's limits with a validation error instead of downscaling it, so resize those images in your application before returning them. To have any other oversized image rejected with an error instead of downscaled, set the image block's [`transformations` field](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates#oversized-image-error). @@ -1292,20 +1288,20 @@ When providing images to Claude, keep the following in mind for best results: ## Coordinates and bounding boxes -For bounding boxes, points, and pixel coordinates, see [Coordinates and bounding boxes](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates). Claude returns absolute pixel coordinates relative to the image it sees after resizing; that guide covers how Claude resizes and pads images and how to pre-resize or rescale so coordinates line up with your original image. +For bounding boxes, points, and pixel coordinates, see [Coordinates and bounding boxes](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates). Claude returns absolute pixel coordinates relative to the image it processes after resizing; that guide covers how Claude resizes and pads images and how to pre-resize or rescale so coordinates line up with your original image. *** ## Limitations -Although Claude's image understanding capabilities are cutting-edge, there are some limitations to be aware of: +Although Claude's image understanding capabilities are advanced, there are some limitations to be aware of: -* **People identification:** Claude [cannot be used](https://www.anthropic.com/legal/aup) to name people in images and refuses to do so. +* **People identification:** Claude cannot be used to name people in images and refuses to do so (see the [Usage Policy](https://www.anthropic.com/legal/aup)). * **Accuracy:** Claude might hallucinate or make mistakes when interpreting low-quality, rotated, or very small images under 200 pixels. * **Spatial reasoning:** Claude's coordinate and localization outputs are approximate. Follow the guidance in [Coordinates and bounding boxes](https://platform.claude.com/docs/en/build-with-claude/vision-coordinates) and verify outputs before relying on them. * **Counting:** Claude can give approximate counts of objects in an image but might not always be precisely accurate, especially with large numbers of small objects. * **AI-generated images:** Claude cannot determine whether an image is AI-generated and might be incorrect if asked. Do not rely on it to detect fake or synthetic images. -* **Inappropriate content:** Claude does not process inappropriate or explicit images that violate the [Acceptable Use Policy](https://www.anthropic.com/legal/aup). +* **Inappropriate content:** Claude does not process inappropriate or explicit images that violate the [Usage Policy](https://www.anthropic.com/legal/aup). * **Healthcare applications:** Although Claude can analyze general medical images, it is not designed to interpret complex diagnostic scans such as CTs or MRIs. Claude's outputs should not be considered a substitute for professional medical advice or diagnosis. Always carefully review and verify Claude's image interpretations, especially for high-stakes use cases. Do not use Claude for tasks requiring perfect precision or sensitive image analysis without human oversight. @@ -1328,7 +1324,7 @@ Always carefully review and verify Claude's image interpretations, especially fo - Up to 600 per API request (100 for models with a 200k-token context window) and 20 per turn on claude.ai. See [Request limits](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits) for details and the lower per-image dimension limit that applies above 20 images. + Up to 600 for each API request (100 for models with a 200k-token context window) and 20 for each turn on claude.ai. See [Request limits](https://platform.claude.com/docs/en/build-with-claude/vision#request-limits) for details and the lower per-image dimension limit that applies above 20 images. @@ -1339,7 +1335,7 @@ Always carefully review and verify Claude's image interpretations, especially fo No. Image uploads are ephemeral and not stored beyond the duration of the API request. Uploaded images are automatically deleted after they have been processed. - + Refer to the Anthropic privacy policy page for information on how uploaded images and other data are handled. Anthropic does not use uploaded images to train models. @@ -1363,7 +1359,7 @@ Always carefully review and verify Claude's image interpretations, especially fo ## Next steps - + Get tips and best-practice techniques for tasks such as interpreting charts and extracting content from forms. diff --git a/content/en/build-with-claude/working-with-messages.md b/content/en/build-with-claude/working-with-messages.md index 906beb0059..42691a223c 100644 --- a/content/en/build-with-claude/working-with-messages.md +++ b/content/en/build-with-claude/working-with-messages.md @@ -20,7 +20,7 @@ This guide covers common patterns for working with the Messages API, including b ## Basic request and response - The `temperature`, `top_p`, and `top_k` sampling parameters are not supported on Claude 4.7 and later models and Claude Mythos Preview. Setting them to a non-default value returns a 400 error. Omit them from request payloads and use prompting to guide the model's behavior instead. See the [migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#opus-46-breaking-changes). + The `temperature`, `top_p`, and `top_k` sampling parameters are not supported on Claude 4.7 and later models and Claude Mythos Preview, or on any model starting with [API version `2026-10-21`](https://platform.claude.com/docs/en/api/migration-2026-10-21#sampling-parameters). Setting them to a non-default value returns a 400 error, and starting with `2026-10-21` any value does. Omit them from request payloads and use prompting to guide the model's behavior instead. See the [breaking changes in the migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#opus-46-breaking-changes). @@ -73,7 +73,7 @@ This guide covers common patterns for working with the Messages API, including b { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }] + Messages = [new UserMessageParam { Content = "Hello, Claude" }] }; var message = await client.Messages.Create(parameters); Console.WriteLine(message); @@ -123,7 +123,7 @@ This guide covers common patterns for working with the Messages API, including b client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { role: "user", content: "Hello, Claude" } @@ -225,9 +225,9 @@ The Messages API is stateless, which means that you always send the full convers MaxTokens = 1024, Messages = [ - new() { Role = Role.User, Content = "Hello, Claude" }, - new() { Role = Role.Assistant, Content = "Hello!" }, - new() { Role = Role.User, Content = "Can you describe LLMs to me?" } + new UserMessageParam { Content = "Hello, Claude" }, + new AssistantMessageParam { Content = "Hello!" }, + new UserMessageParam { Content = "Can you describe LLMs to me?" } ] }; @@ -288,7 +288,7 @@ The Messages API is stateless, which means that you always send the full convers client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 1024, messages: [ { role: "user", content: "Hello, Claude" }, @@ -331,7 +331,7 @@ See [Mid-conversation system messages](https://platform.claude.com/docs/en/build ## Prefilling Claude's response -You can pre-fill part of Claude's response in the last position of the input messages list. Use this technique to shape Claude's response. The following example uses `"max_tokens": 1` to get a single multiple choice answer from Claude. +You can prefill part of Claude's response in the last position of the input messages list. Use this technique to shape Claude's response. The following example uses `"max_tokens": 1` to get a single multiple choice answer from Claude. Prefilling is not supported on Claude 4.6 and later models and [Claude Mythos Preview](https://anthropic.com/glasswing). Requests using prefill with these models return a 400 error. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) on models that support it, or system prompt instructions, instead. See the [migration guide](https://platform.claude.com/docs/en/about-claude/models/migration-guide) for migration patterns. @@ -406,8 +406,8 @@ You can pre-fill part of Claude's response in the last position of the input mes Model = Model.ClaudeSonnet4_5, MaxTokens = 1, Messages = [ - new() { Role = Role.User, Content = "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae" }, - new() { Role = Role.Assistant, Content = "The answer is (" } + new UserMessageParam { Content = "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae" }, + new AssistantMessageParam { Content = "The answer is (" } ] }; @@ -464,7 +464,7 @@ You can pre-fill part of Claude's response in the last position of the input mes client = Anthropic::Client.new message = client.messages.create( - model: "claude-sonnet-4-5", + model: Anthropic::Model::CLAUDE_SONNET_4_5, max_tokens: 1, messages: [ { @@ -501,7 +501,7 @@ You can pre-fill part of Claude's response in the last position of the input mes ## Vision -Claude can read both text and images in requests. You can supply images using the `base64`, `url`, or `file` source types. The `file` source type references an image uploaded through the [Files API](https://platform.claude.com/docs/en/build-with-claude/files). Supported media types are `image/jpeg`, `image/png`, `image/gif`, and `image/webp`. See the [vision guide](https://platform.claude.com/docs/en/build-with-claude/vision) for more details. +Claude can read both text and images in requests. You can supply images using the `base64`, `url`, or `file` source types. The `file` source type references an image uploaded through the [Files API](https://platform.claude.com/docs/en/build-with-claude/files). Supported media types are `image/jpeg`, `image/png`, `image/gif`, and `image/webp`. See the [Vision](https://platform.claude.com/docs/en/build-with-claude/vision) guide for more details. ```bash cURL @@ -721,10 +721,9 @@ Claude can read both text and images in requests. You can supply images using th MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new Base64ImageSource() @@ -734,7 +733,7 @@ Claude can read both text and images in requests. You can supply images using th }) )), new ContentBlockParam(new TextBlockParam("What is in the above image?")), - }), + }, } ] }; @@ -749,10 +748,9 @@ Claude can read both text and images in requests. You can supply images using th MaxTokens = 1024, Messages = [ - new() + new UserMessageParam { - Role = Role.User, - Content = new MessageParamContent(new List + Content = new List { new ContentBlockParam(new ImageBlockParam( new ImageBlockParamSource(new UrlImageSource() @@ -761,7 +759,7 @@ Claude can read both text and images in requests. You can supply images using th }) )), new ContentBlockParam(new TextBlockParam("What is in the above image?")), - }), + }, } ] }; @@ -857,7 +855,7 @@ Claude can read both text and images in requests. You can supply images using th MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024L) - .addUserMessageOfBlockParams(base64Content) + .addUserMessageOfContentBlockParams(base64Content) .build()); System.out.println(message); @@ -879,7 +877,7 @@ Claude can read both text and images in requests. You can supply images using th MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) .maxTokens(1024L) - .addUserMessageOfBlockParams(urlContent) + .addUserMessageOfContentBlockParams(urlContent) .build()); System.out.println(messageFromUrl); ``` diff --git a/content/en/claude_api_primer.md b/content/en/claude_api_primer.md index 4d5ba3f627..3e22746adc 100644 --- a/content/en/claude_api_primer.md +++ b/content/en/claude_api_primer.md @@ -239,8 +239,6 @@ Claude can read both text and images in requests. Both `base64` and `url` source Thinking can sometimes help Claude with very hard tasks. The current mechanism is [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) (`thinking: {"type": "adaptive"}`): Claude determines when and how much to think, and you steer thinking depth with the [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) parameter rather than a token budget. Adaptive thinking is supported on Claude 4.6 and later models and Claude Mythos Preview. On Claude 5 and later models and Claude Mythos Preview, thinking is on by default when the `thinking` parameter is omitted. -Temperature must be set to 1 (or left unset) whenever thinking is enabled, on all models. On Claude 4.7 and later models and Claude Mythos Preview, `temperature` is deprecated and only its default value is accepted, even when thinking is off. - Thinking is supported in the following models: * Claude Opus 5.5 (`claude-opus-5-5`, adaptive thinking only, always on) @@ -388,7 +386,7 @@ Important limitations: ### Interleaved thinking -Interleaved thinking enables Claude to think between tool calls, reasoning about tool results before determining the next step. +Interleaved thinking allows Claude to think between tool calls, reasoning about tool results before determining the next step. On models with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) (`thinking: {type: "adaptive"}`), interleaved thinking is automatically enabled. No beta header is needed. Sonnet 4.6 supports both the `interleaved-thinking-2025-05-14` beta header with manual extended thinking and adaptive thinking. @@ -496,11 +494,11 @@ With interleaved thinking and ONLY with interleaved thinking (not regular manual Client tools are specified in the `tools` top-level parameter of the API request. Each tool definition includes: -| Parameter | Description | -| -------------- | --------------------------------------------------------------------------------------------------- | -| `name` | The name of the tool. Must match the regex `^[a-zA-Z0-9_-]{1,128}$`. | -| `description` | A detailed plaintext description of what the tool does, when it should be used, and how it behaves. | -| `input_schema` | A [JSON Schema](https://json-schema.org/) object defining the expected parameters for the tool. | +| Parameter | Description | +| -------------- | ---------------------------------------------------------------------------------------------------- | +| `name` | The name of the tool. Must match the regex `^[a-zA-Z0-9_-]{1,128}$`. | +| `description` | A detailed plain text description of what the tool does, when it should be used, and how it behaves. | +| `input_schema` | A [JSON Schema](https://json-schema.org/) object defining the expected parameters for the tool. | ```json { @@ -566,7 +564,7 @@ tool_choice = {"type": "tool", "name": "get_weather"} When working with the `tool_choice` parameter, there are four possible options: -* `auto` allows Claude to determine whether to call any provided tools or not (default). +* `auto` allows Claude to determine whether to call any provided tools (default). * `any` tells Claude that it must use one of the provided tools. * `tool` forces Claude to always use a particular tool. * `none` prevents Claude from using any tools. @@ -579,7 +577,7 @@ Tools do not necessarily need to be client functions. You can use tools anytime ### Parallel tool use -By default, Claude may use multiple tools to answer a user query. You can disable this behavior by setting `disable_parallel_tool_use=true`. +By default, Claude might use multiple tools to answer a user query. You can disable this behavior by setting `disable_parallel_tool_use=true`. ## Handling tool use and tool result content blocks @@ -587,9 +585,9 @@ By default, Claude may use multiple tools to answer a user query. You can disabl The response has a `stop_reason` of `tool_use` and one or more `tool_use` content blocks that include: -* `id`: A unique identifier for this particular tool use block. -* `name`: The name of the tool being used. -* `input`: An object containing the input being passed to the tool. +* `id`: A unique identifier for this particular tool use block +* `name`: The name of the tool being used +* `input`: An object containing the input being passed to the tool ```json { @@ -630,7 +628,7 @@ If Claude's response is cut off because it hits the `max_tokens` limit during to ### Handling the `pause_turn` stop reason -When using server tools such as web search, the API may return a `pause_turn` stop reason. Continue the conversation by passing the paused response back as-is in a subsequent request. +When using server tools such as web search, the API might return a `pause_turn` stop reason. Continue the conversation by passing the paused response back as-is in a subsequent request. ## Troubleshooting errors diff --git a/content/en/cli-sdks-libraries/cli/apply.md b/content/en/cli-sdks-libraries/cli/apply.md index 22116f2747..a9cfb3a5b9 100644 --- a/content/en/cli-sdks-libraries/cli/apply.md +++ b/content/en/cli-sdks-libraries/cli/apply.md @@ -93,7 +93,7 @@ The first `ant apply` writes `claude-lock.json`, the lockfile, in the directory } ``` -Commit it with your files. It's how the next run, on your machine or in CI, finds these resources instead of creating them again, and it's where you read an agent's ID to [start a session](https://platform.claude.com/docs/en/managed-agents/sessions). The two hashes fingerprint what was last sent and what the API returned. That's how a later run notices an edited file, or a resource changed outside these files. +Commit it with your files. It's how the next run, on your machine or in CI, finds these resources instead of creating them again, and it's where you read an agent's ID to [start a session](https://platform.claude.com/docs/en/managed-agents/sessions). The two hashes fingerprint what was last sent and what the API returned. That's how a later run detects an edited file, or a resource changed outside these files. ## Grow it into a project diff --git a/content/en/cli-sdks-libraries/cli/authentication.md b/content/en/cli-sdks-libraries/cli/authentication.md index 284965ec5d..1ebca7454c 100644 --- a/content/en/cli-sdks-libraries/cli/authentication.md +++ b/content/en/cli-sdks-libraries/cli/authentication.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication description: Authenticate the ant CLI with interactive login, API keys, named profiles, and Workload Identity Federation. --- -The `ant` CLI supports several credential sources. The [Quickstart](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart#authentication) covers the one-command happy path (`ant auth login`). This page covers every option in full. +The `ant` CLI supports several credential sources. The [Quickstart](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart#authentication) covers the one-command login (`ant auth login`). This page covers every option in full. ## Interactive login @@ -71,9 +71,9 @@ The CLI also reads your API key from the `ANTHROPIC_API_KEY` environment variabl -To override the key for a single invocation, pass [`--api-key-stdin`](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#global-flags) and pipe the key to the command. To point at a different API host, set `ANTHROPIC_BASE_URL` or pass `--base-url`. +To override the key for a single run, pass [`--api-key-stdin`](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#global-flags) and pipe the key to the command. To point at a different API host, set `ANTHROPIC_BASE_URL` or pass `--base-url`. -If you are using an API key scoped to multiple workspaces, such as a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types), you must [specify the workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) to run your command in. Do this by setting an `ANTHROPIC_WORKSPACE_ID` environment variable, which the CLI reads automatically, or by using the [`--workspace-id` flag](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#global-flags). The value must be a `wrkspc_...` ID. +If you are using a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, you must [specify the workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) to run your command in. Do this by setting an `ANTHROPIC_WORKSPACE_ID` environment variable, which the CLI reads automatically, or by using the [`--workspace-id` flag](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#global-flags). The value must be a `wrkspc_...` ID. ```bash CLI ant messages create \ @@ -152,7 +152,7 @@ For the profile file schema and the federation block, see [Profile configuration - Version-control API resources, scripting patterns, and use from Claude Code + Version control for API resources, scripting patterns, and use from Claude Code diff --git a/content/en/cli-sdks-libraries/cli/quickstart.md b/content/en/cli-sdks-libraries/cli/quickstart.md index 6934048f74..238bf9ac4d 100644 --- a/content/en/cli-sdks-libraries/cli/quickstart.md +++ b/content/en/cli-sdks-libraries/cli/quickstart.md @@ -32,7 +32,7 @@ Compared to `curl`, `ant` builds request bodies from typed flags or piped YAML i For Linux environments, download the release binary directly. ```bash - VERSION=1.44.0 + VERSION=2.0.0 OS=$(uname -s | tr '[:upper:]' '[:lower:]') case $(uname -m) in x86_64) ARCH=amd64 ;; @@ -49,7 +49,7 @@ Compared to `curl`, `ant` builds request bodies from typed flags or piped YAML i You can also install the CLI from source using `go install`. Requires Go 1.25 or later. ```bash - go install github.com/anthropics/anthropic-cli/cmd/ant@latest + go install github.com/anthropics/anthropic-cli/v2/cmd/ant@latest ``` The binary is placed in `$(go env GOPATH)/bin`. Add it to your `PATH` if it isn't already: @@ -153,6 +153,6 @@ The CLI ships completion scripts for bash, zsh, fish, and PowerShell. Generate a - Version-control API resources, scripting patterns, and use from Claude Code + Version control for API resources, scripting patterns, and use from Claude Code diff --git a/content/en/cli-sdks-libraries/cli/scripting.md b/content/en/cli-sdks-libraries/cli/scripting.md index c44f8d8eca..4efa91a874 100644 --- a/content/en/cli-sdks-libraries/cli/scripting.md +++ b/content/en/cli-sdks-libraries/cli/scripting.md @@ -72,7 +72,7 @@ The CLI is designed to compose with standard shell tooling. ### Chain list output into a second command -`--transform id --raw-output` on a list endpoint emits one bare ID per line, so standard tools such as `head` and `xargs` apply directly. Capture the first result, then pass it to a follow-up command: +`--transform id --raw-output` on a list endpoint emits one bare ID on each line, so standard tools such as `head` and `xargs` apply directly. Capture the first result, then pass it to a follow-up command: ```bash FIRST_AGENT=$(ant beta:agents list --transform id --raw-output | head -1) @@ -104,7 +104,7 @@ Agent not found. * "Upload every PDF in `./reports` to the Files API and print the resulting IDs." * "Pull the events for session `session_01...` and tell me where the agent got stuck." -Claude Code shells out to `ant`, parses the structured output, and reasons over the results (no custom integration code required). +Claude Code runs `ant` commands, parses the structured output, and reasons over the results (no custom integration code required). ## Authenticate curl requests with CLI credentials diff --git a/content/en/cli-sdks-libraries/cli/sessions-connect.md b/content/en/cli-sdks-libraries/cli/sessions-connect.md index 7c01491d31..10e513209d 100644 --- a/content/en/cli-sdks-libraries/cli/sessions-connect.md +++ b/content/en/cli-sdks-libraries/cli/sessions-connect.md @@ -32,7 +32,7 @@ The terminal view shows the conversation live: messages and tool calls, with eac | Page Up, Page Down | Scroll through the transcript. Scrolling up pauses following; End resumes it. | | Ctrl+C | Detach. Ctrl+D on an empty input line also detaches. | -When a tool call is waiting for your approval, the input line changes to **Allow tool call?** This happens under an `always_ask` policy, or under `auto` when the server reaches no determination. Choose **Yes**, **No**, or **No, and tell the agent why**. The CLI sends your choice as a [`user.tool_confirmation`](https://platform.claude.com/docs/en/managed-agents/permission-policies#respond-to-confirmation-requests) event, with any reason you type as its `deny_message`. +When a tool call is waiting for your approval, the input line changes to **Allow tool call?** This occurs under an `always_ask` policy, or under `auto` when the server reaches no determination. Select **Yes**, **No**, or **No, and tell the agent why**. The CLI sends your choice as a [`user.tool_confirmation`](https://platform.claude.com/docs/en/managed-agents/permission-policies#respond-to-confirmation-requests) event, with any reason you type as its `deny_message`. If the session is `terminated` or deleted, the view is read-only. @@ -44,4 +44,4 @@ ant beta:sessions connect sesn_011CZkZAtmR3yMPDzynEDxu7 --web `--web` serves the Console's session viewer from a local server on `127.0.0.1`, prints its URL, and opens it in your browser. Add `--no-browser` to skip opening the browser. You can also send messages, interrupt the agent, and allow or deny a tool call from the browser. Unlike the terminal view, the browser viewer follows every thread of a multiagent session. -The URL can be opened once, within two minutes of being printed. Reloading that tab works, but to open the viewer anywhere else, run the command again. Your credentials never leave the CLI: the page sends requests only to the local `ant` process, which makes the API requests. The server runs until you press Ctrl+C. +The URL can be opened once, within 2 minutes of being printed. Reloading that tab works, but to open the viewer anywhere else, run the command again. Your credentials never leave the CLI: the page sends requests only to the local `ant` process, which makes the API requests. The server runs until you press Ctrl+C. diff --git a/content/en/cli-sdks-libraries/cli/using.md b/content/en/cli-sdks-libraries/cli/using.md index f0bb538cd1..946174d97f 100644 --- a/content/en/cli-sdks-libraries/cli/using.md +++ b/content/en/cli-sdks-libraries/cli/using.md @@ -27,18 +27,18 @@ ant beta:sessions:events list --session-id session_01... ### Global flags -| Flag | Description | -| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `--profile` | Named profile to use for this invocation (equivalent to setting `ANTHROPIC_PROFILE`). See [Switch between workspaces](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication#switch-between-workspaces). | -| `--api-key-stdin` | Read the API key from standard input. The flag reads all of standard input, so pass the request body with [flags](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#flags). | -| `--auth-token-stdin` | Read the bearer token from standard input. The flag reads all of standard input, so pass the request body with [flags](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#flags). | -| `--format` | Output format: `auto`, `json`, `jsonl`, `yaml`, `pretty`, `raw`, `explore` | -| `--transform` | Filter or reshape the response with a [GJSON path](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#transform-output-with-gjson) | -| `-r`, `--raw-output` | Print string results without surrounding quotes, like `jq -r` | -| `--base-url` | Override the API base URL | -| `--workspace-id` | Optional. Workspace ID (`wrkspc_...`) to send as the `anthropic-workspace-id` header, for API keys with access to multiple workspaces (equivalent to setting `ANTHROPIC_WORKSPACE_ID`). See [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) commands take their own `--workspace-id`, which names the workspace they manage instead. | -| `--debug` | Print full HTTP request and response to stderr | -| `--format-error`, `--transform-error` | Same as `--format` and `--transform` but applied to [error responses](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/scripting#inspect-errors) | +| Flag | Description | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--profile` | Named profile to use for this command (equivalent to setting `ANTHROPIC_PROFILE`). See [Switch between workspaces](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication#switch-between-workspaces). | +| `--api-key-stdin` | Read the API key from standard input. The flag reads all of standard input, so pass the request body with [flags](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#flags). | +| `--auth-token-stdin` | Read the bearer token from standard input. The flag reads all of standard input, so pass the request body with [flags](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#flags). | +| `--format` | Output format: `auto`, `json`, `jsonl`, `yaml`, `pretty`, `raw`, `explore` | +| `--transform` | Filter or reshape the response with a GJSON path. See [Transform output with GJSON](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/using#transform-output-with-gjson). | +| `-r`, `--raw-output` | Print string results without surrounding quotes, like `jq -r` | +| `--base-url` | Override the API base URL | +| `--workspace-id` | Optional. Workspace ID (`wrkspc_...`) to send as the `anthropic-workspace-id` header, for API keys that aren't scoped to a workspace (equivalent to setting `ANTHROPIC_WORKSPACE_ID`). See [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) commands take their own `--workspace-id`, which names the workspace they manage instead. | +| `--debug` | Print full HTTP request and response to stderr | +| `--format-error`, `--transform-error` | Same as `--format` and `--transform` but applied to [error responses](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/scripting#inspect-errors) | ## Output formats @@ -56,11 +56,11 @@ created_at: "2026-09-22T00:00:00Z" ... ``` -List endpoints auto-paginate. In the default formats each item is written separately (one compact JSON object per line in `jsonl` mode, a stream of YAML documents in `yaml` mode), which streams cleanly into `head`, `grep`, and `--transform` filters. +List endpoints auto-paginate. In the default formats each item is written separately (one compact JSON object on each line in `jsonl` mode, a stream of YAML documents in `yaml` mode), which streams cleanly into `head`, `grep`, and `--transform` filters. ### Interactive explorer -The explorer is a fold-and-search TUI for browsing large responses. Arrow keys expand and collapse nodes, `/` searches, `q` exits. List and retrieve commands open it by default when connected to a terminal. Pass `--format explore` to open it explicitly: +The explorer is a fold-and-search TUI for browsing large responses. Arrow keys expand and collapse nodes, `/` searches, and `q` exits. List and retrieve commands open it by default when connected to a terminal. Pass `--format explore` to open it explicitly: ```bash ant models list --format explore @@ -186,20 +186,20 @@ ant --debug beta:agents list GET /v1/agents?beta=true HTTP/1.1 Host: api.anthropic.com Anthropic-Beta: managed-agents-2026-04-01 -Anthropic-Version: 2023-06-01 -X-Api-Key: +Anthropic-Version: 2026-10-21 +Authorization: Bearer ... ``` ## Available resources -Every API resource the CLI exposes is documented in the [API reference](https://platform.claude.com/docs/en/api/cli/messages/create). For a local listing, run `ant --help`, and append `--help` to any subcommand for its flags and parameters. +Every API resource the CLI exposes is documented in the [API reference](https://platform.claude.com/docs/en/api/cli/messages/create). For a local list, run `ant --help`, and append `--help` to any subcommand for its flags and parameters. ## Next steps - Version-control API resources, scripting patterns, and use from Claude Code + Version control for API resources, scripting patterns, and use from Claude Code diff --git a/content/en/cli-sdks-libraries/libraries/apple-foundation-models.md b/content/en/cli-sdks-libraries/libraries/apple-foundation-models.md index 4789bf84cf..7557f9b2b4 100644 --- a/content/en/cli-sdks-libraries/libraries/apple-foundation-models.md +++ b/content/en/cli-sdks-libraries/libraries/apple-foundation-models.md @@ -6,7 +6,7 @@ description: Use Claude on Apple platforms through the Foundation Models framewo [Claude for Foundation Models](https://github.com/anthropics/ClaudeForFoundationModels) is a Swift package that makes Claude available as a server-side language model in Apple's [Foundation Models](https://developer.apple.com/documentation/foundationmodels) framework. The package conforms Claude to the framework's `LanguageModel` protocol, so you drive it with the same `LanguageModelSession` API you use for Apple's on-device model: `respond(to:)`, streaming, guided generation, and tool calling all work the same way. -Requests go directly from your app to the Claude API; Apple is not in the request path and does not see prompts or responses. Usage is billed to your Anthropic account at [standard API pricing](https://platform.claude.com/docs/en/about-claude/pricing), so your organization needs an available credit balance or an active billing method. Your app decides when to use Claude and when to use Apple's on-device model: pass whichever model you want to each session. +Requests go directly from your app to the Claude API; Apple is not in the request path and does not see prompts or responses. Usage is billed to your Anthropic account at [standard API pricing](https://platform.claude.com/docs/en/about-claude/pricing), so your organization needs an available credit balance or an active billing method. Your app determines when to use Claude and when to use Apple's on-device model: pass whichever model you want to each session. **Beta.** This package targets the Foundation Models server-side language model API introduced in the OS 27 betas. APIs might change during the beta. @@ -131,7 +131,7 @@ To set up App Attest, you need your Apple Developer Team ID and the admin, owner The first time your app uses Claude on a device, the app requests a challenge from Anthropic, attests the device with Apple's `DCAppAttestService`, and exchanges the verified attestation for an access token. The Claude for Foundation Models package runs this flow automatically and requests new tokens as they expire; there is no attestation code for you to write. -Tokens are scoped to your workspace, expire after one hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. They carry no end-user identity: App Attest identifies your app, not the person using it, so handle any per-user logic in your app. +Tokens are scoped to your workspace, expire after 1 hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. They carry no end-user identity: App Attest identifies your app, not the person using it, so handle any per-user logic in your app. To stop a compromised or retired app, revoke its integration. In the Claude Console, go to the [App integrations](https://platform.claude.com/settings/workspaces/default/app-integrations) page (`platform.claude.com/settings/workspaces/default/app-integrations`). Each app integration belongs to one workspace. In the workspace picker in the sidebar, select the workspace that holds the integration. Select the integration and click **Revoke**, then confirm. Revoking an integration revokes its outstanding tokens, and its registered devices can no longer request new ones. Revocation is permanent, so create a new app integration to restore access. @@ -193,7 +193,7 @@ Structured output requires a model whose capabilities include it (all compiled-i ### Client-side tools -The framework's `tools:` array works unchanged. Conform your types to `Tool`, pass them to `LanguageModelSession`, and the framework invokes them on the device when Claude calls them. See [Tool use with Claude](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview). +The framework's `tools:` array works unchanged. Conform your types to `Tool`, pass them to `LanguageModelSession`, and the framework runs them on the device when Claude calls them. See [Tool use with Claude](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview). ```swift let session = LanguageModelSession(model: model, tools: [FindRestaurantsTool()]) @@ -201,7 +201,7 @@ let session = LanguageModelSession(model: model, tools: [FindRestaurantsTool()]) ### Server-side tools -[Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) (web search, web fetch, and code execution) run on Anthropic's infrastructure within a single round trip, with nothing for the framework to invoke on the device. Configure them for each model with `serverTools:`: +[Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools) (web search, web fetch, and code execution) run on Anthropic's infrastructure within a single round trip, with nothing for the framework to call on the device. Configure them for each model with `serverTools:`: ```swift let model = ClaudeLanguageModel( diff --git a/content/en/cli-sdks-libraries/libraries/openai-sdk.md b/content/en/cli-sdks-libraries/libraries/openai-sdk.md index 9230ea35d1..3d3a0f45d2 100644 --- a/content/en/cli-sdks-libraries/libraries/openai-sdk.md +++ b/content/en/cli-sdks-libraries/libraries/openai-sdk.md @@ -1,35 +1,35 @@ --- title: OpenAI SDK compatibility url: https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk -description: Anthropic provides a compatibility layer that enables you to use the OpenAI SDK to test the Claude API. With a few code changes, you can quickly evaluate Anthropic model capabilities. +description: Anthropic provides a compatibility layer that lets you use the OpenAI SDK to test the Claude API. With a few code changes, you can quickly evaluate Anthropic model capabilities. --- - This compatibility layer is primarily intended to test and compare model capabilities, and is not considered a long-term or production-ready solution for most use cases. While it is intended to remain fully functional and not have breaking changes, the priority is the reliability and effectiveness of the [Claude API](https://platform.claude.com/docs/en/api/overview). + This compatibility layer is primarily intended to test and compare model capabilities, and is not considered a long-term or production-ready solution for most use cases. Although it is intended to remain fully functional and not have breaking changes, the priority is the reliability and effectiveness of the [Claude API](https://platform.claude.com/docs/en/api/overview). For more information on known compatibility limitations, see [Important OpenAI compatibility limitations](https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk#important-openai-compatibility-limitations). - If you encounter any issues with the OpenAI SDK compatibility feature, please share your feedback via this [compatibility feedback form](https://forms.gle/oQV4McQNiuuNbz9n8). + If you encounter any issues with the OpenAI SDK compatibility feature, share your feedback through this [compatibility feedback form](https://forms.gle/oQV4McQNiuuNbz9n8). - For the best experience and access to Claude API full feature set ([PDF processing](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [citations](https://platform.claude.com/docs/en/build-with-claude/citations), [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), and [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)), use the native [Claude API](https://platform.claude.com/docs/en/api/overview). + For the best experience and access to the full Claude API feature set ([PDF processing](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [citations](https://platform.claude.com/docs/en/build-with-claude/citations), [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), and [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)), use the native [Claude API](https://platform.claude.com/docs/en/api/overview). ## Getting started with the OpenAI SDK To use the OpenAI SDK compatibility feature, you'll need to: -1. Use an official OpenAI SDK +1. Use an official OpenAI SDK. 2. Change the following * Update your base URL to point to the Claude API * Replace your API key with a [Claude API key](https://platform.claude.com/settings/keys) from the Claude Console - * If your key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, also send the `anthropic-workspace-id` header on every request (for example, `default_headers` in the Python SDK or `defaultHeaders` in TypeScript); see [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) + * If your key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, also send the `anthropic-workspace-id` header on every request (for example, `default_headers` in the Python SDK or `defaultHeaders` in TypeScript); see [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) * Update your model name to use a [Claude model](https://platform.claude.com/docs/en/models/overview) -3. Review the following sections for what features are supported +3. Review the following sections for what features are supported. ### Quick start example @@ -184,19 +184,19 @@ To use the OpenAI SDK compatibility feature, you'll need to: Here are the most substantial differences from using OpenAI: * The `strict` parameter for function calling is ignored, which means the tool use JSON is not guaranteed to follow the supplied schema. For guaranteed schema conformance, use the native [Claude API with Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs). -* Audio input is not supported; it will be ignored and stripped from input -* Prompt caching is not supported, but it is supported in the [Anthropic SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) +* Audio input is not supported; it is ignored and stripped from input. +* Prompt caching is not supported, but it is supported in the [Anthropic SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview). * System/developer messages are hoisted and concatenated into the top-level `system` field, wherever they appear in the conversation. To add system instructions partway through a conversation, use [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) in the native Claude API. Most unsupported fields are silently ignored rather than producing errors. These are all documented in the following sections. ### Output quality considerations -If you’ve done lots of tweaking to your prompt, it’s likely to be well-tuned to OpenAI specifically. Consider reworking it for Claude using the [prompting best practices guide](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices). +If you’ve adjusted your prompt extensively, it’s likely to be well-tuned to OpenAI specifically. Consider reworking it for Claude using the [prompting best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices) guide. ### System / developer message hoisting -Most of the inputs to the OpenAI SDK clearly map directly to Anthropic’s API parameters, but one distinct difference is the handling of system / developer prompts. These two prompts can be put throughout a chat conversation via OpenAI. The compatibility layer takes all system/developer messages and concatenates them together with a single newline (`\n`) in between them. This full string is then supplied as the top-level `system` field, ahead of every message. +Most of the inputs to the OpenAI SDK clearly map directly to Claude API parameters, but one distinct difference is the handling of system / developer prompts. These two prompts can be put throughout a chat conversation in the OpenAI API. The compatibility layer takes all system/developer messages and concatenates them together with a single newline (`\n`) in between them. This full string is then supplied as the top-level `system` field, ahead of every message. ### Thinking support @@ -297,7 +297,7 @@ Rate limits follow Anthropic's [standard limits](https://platform.claude.com/doc | `n` | Must be exactly 1 | | `logprobs` | Ignored | | `metadata` | Ignored | -| `response_format` | Ignored. For JSON output, use [Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with the native Claude API | +| `response_format` | Ignored. For JSON output, use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with the native Claude API | | `prediction` | Ignored | | `presence_penalty` | Ignored | | `frequency_penalty` | Ignored | @@ -318,27 +318,27 @@ Rate limits follow Anthropic's [standard limits](https://platform.claude.com/doc `tools[n].function` fields - | Field | Support status | - | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `name` | Fully supported | - | `description` | Fully supported | - | `parameters` | Fully supported | - | `strict` | Ignored. Use [Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with native Claude API for strict schema validation | + | Field | Support status | + | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `name` | Fully supported | + | `description` | Fully supported | + | `parameters` | Fully supported | + | `strict` | Ignored. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with the native Claude API for strict schema validation | `functions[n]` fields - OpenAI has deprecated the `functions` field and suggests using `tools` instead. + OpenAI has deprecated the `functions` field and recommends using `tools` instead. - | Field | Support status | - | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `name` | Fully supported | - | `description` | Fully supported | - | `parameters` | Fully supported | - | `strict` | Ignored. Use [Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with native Claude API for strict schema validation | + | Field | Support status | + | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `name` | Fully supported | + | `description` | Fully supported | + | `parameters` | Fully supported | + | `strict` | Ignored. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) with the native Claude API for strict schema validation | @@ -351,7 +351,7 @@ Rate limits follow Anthropic's [standard limits](https://platform.claude.com/doc Fields for `messages[n].role == "developer"` - Developer messages are hoisted to beginning of conversation as part of the initial system message + Developer messages are hoisted to the beginning of the conversation as part of the initial system message. | Field | Support status | @@ -364,7 +364,7 @@ Rate limits follow Anthropic's [standard limits](https://platform.claude.com/doc Fields for `messages[n].role == "system"` - System messages are hoisted to beginning of conversation as part of the initial system message + System messages are hoisted to the beginning of the conversation as part of the initial system message. | Field | Support status | @@ -428,40 +428,40 @@ Rate limits follow Anthropic's [standard limits](https://platform.claude.com/doc ### Response fields -| Field | Support status | -| --------------------------------- | ------------------------------ | -| `id` | Fully supported | -| `choices[]` | Will always have a length of 1 | -| `choices[].finish_reason` | Fully supported | -| `choices[].index` | Fully supported | -| `choices[].message.role` | Fully supported | -| `choices[].message.content` | Fully supported | -| `choices[].message.tool_calls` | Fully supported | -| `object` | Fully supported | -| `created` | Fully supported | -| `model` | Fully supported | -| `finish_reason` | Fully supported | -| `content` | Fully supported | -| `usage.completion_tokens` | Fully supported | -| `usage.prompt_tokens` | Fully supported | -| `usage.total_tokens` | Fully supported | -| `usage.completion_tokens_details` | Always empty | -| `usage.prompt_tokens_details` | Always empty | -| `choices[].message.refusal` | Always empty | -| `choices[].message.audio` | Always empty | -| `logprobs` | Always empty | -| `service_tier` | Always empty | -| `system_fingerprint` | Always empty | +| Field | Support status | +| --------------------------------- | ------------------------ | +| `id` | Fully supported | +| `choices[]` | Always has a length of 1 | +| `choices[].finish_reason` | Fully supported | +| `choices[].index` | Fully supported | +| `choices[].message.role` | Fully supported | +| `choices[].message.content` | Fully supported | +| `choices[].message.tool_calls` | Fully supported | +| `object` | Fully supported | +| `created` | Fully supported | +| `model` | Fully supported | +| `finish_reason` | Fully supported | +| `content` | Fully supported | +| `usage.completion_tokens` | Fully supported | +| `usage.prompt_tokens` | Fully supported | +| `usage.total_tokens` | Fully supported | +| `usage.completion_tokens_details` | Always empty | +| `usage.prompt_tokens_details` | Always empty | +| `choices[].message.refusal` | Always empty | +| `choices[].message.audio` | Always empty | +| `logprobs` | Always empty | +| `service_tier` | Always empty | +| `system_fingerprint` | Always empty | ### Error message compatibility -The compatibility layer maintains consistent error formats with the OpenAI API. However, the detailed error messages will not be equivalent. Only use the error messages for logging and debugging. +The compatibility layer maintains consistent error formats with the OpenAI API. However, the detailed error messages are not equivalent. Only use the error messages for logging and debugging. ### Header compatibility -While the OpenAI SDK automatically manages headers, here is the complete list of headers supported by the Claude API for developers who need to work with them directly. +Although the OpenAI SDK automatically manages headers, here is the complete list of headers supported by the Claude API for developers who need to work with them directly. -| Header | Support Status | +| Header | Support status | | -------------------------------- | ------------------- | | `x-ratelimit-limit-requests` | Fully supported | | `x-ratelimit-limit-tokens` | Fully supported | diff --git a/content/en/cli-sdks-libraries/middleware.md b/content/en/cli-sdks-libraries/middleware.md index ae1b5bcaa3..986b9b807f 100644 --- a/content/en/cli-sdks-libraries/middleware.md +++ b/content/en/cli-sdks-libraries/middleware.md @@ -173,7 +173,7 @@ In the Go SDK, repeated `option.WithMiddleware` calls concatenate (client first, ## Replacing the HTTP client -The SDK also accepts a custom HTTP client (for proxy configuration, custom TLS, or connection pooling). Only one HTTP client is used per SDK client; setting it replaces the default. The custom HTTP client receives requests after all middleware has run. +The SDK also accepts a custom HTTP client (for proxy configuration, custom TLS, or connection pooling). Only one HTTP client is used for each SDK client; setting it replaces the default. The custom HTTP client receives requests after all middleware has run. ## Built-in middleware diff --git a/content/en/cli-sdks-libraries/overview.md b/content/en/cli-sdks-libraries/overview.md index d45192e616..e79ef2702f 100644 --- a/content/en/cli-sdks-libraries/overview.md +++ b/content/en/cli-sdks-libraries/overview.md @@ -54,18 +54,20 @@ Anthropic provides three kinds of official tooling for building with the Claude +Each major version of a client SDK sends one [API version](https://platform.claude.com/docs/en/api/versioning) by default, and a new major version comes with each new API version. To move to `2026-10-21`, see [Upgrade to 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + ## Latest versions | Tool | Latest version | Package | | ---------- | -------------- | ----------------------------------------------------------------------------------------------------- | -| ant CLI | `1.44.0` | [`github.com/anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli/releases) | -| Python | `1.17.0` | [`anthropic`](https://pypi.org/project/anthropic/) | -| TypeScript | `0.137.0` | [`@anthropic-ai/sdk`](https://www.npmjs.com/package/@anthropic-ai/sdk) | -| C# | `12.60.0` | [`Anthropic`](https://www.nuget.org/packages/Anthropic) | -| Go | `1.84.0` | [`github.com/anthropics/anthropic-sdk-go`](https://pkg.go.dev/github.com/anthropics/anthropic-sdk-go) | -| Java | `2.75.0` | [`com.anthropic:anthropic-java`](https://central.sonatype.com/artifact/com.anthropic/anthropic-java) | -| PHP | `0.61.0` | [`anthropic-ai/sdk`](https://packagist.org/packages/anthropic-ai/sdk) | -| Ruby | `1.82.0` | [`anthropic`](https://rubygems.org/gems/anthropic) | +| ant CLI | `2.0.0` | [`github.com/anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli/releases) | +| Python | `2.0.0` | [`anthropic`](https://pypi.org/project/anthropic/) | +| TypeScript | `1.0.0` | [`@anthropic-ai/sdk`](https://www.npmjs.com/package/@anthropic-ai/sdk) | +| C# | `13.0.0` | [`Anthropic`](https://www.nuget.org/packages/Anthropic) | +| Go | `2.0.0` | [`github.com/anthropics/anthropic-sdk-go`](https://pkg.go.dev/github.com/anthropics/anthropic-sdk-go) | +| Java | `3.0.0` | [`com.anthropic:anthropic-java`](https://central.sonatype.com/artifact/com.anthropic/anthropic-java) | +| PHP | `1.0.0` | [`anthropic-ai/sdk`](https://packagist.org/packages/anthropic-ai/sdk) | +| Ruby | `2.0.0` | [`anthropic`](https://rubygems.org/gems/anthropic) | The same versions are available as JSON at `https://platform.claude.com/docs/sdk-versions.json`. diff --git a/content/en/cli-sdks-libraries/sdks/csharp.md b/content/en/cli-sdks-libraries/sdks/csharp.md index 095bbdd147..8d2728b66d 100644 --- a/content/en/cli-sdks-libraries/sdks/csharp.md +++ b/content/en/cli-sdks-libraries/sdks/csharp.md @@ -38,14 +38,7 @@ AnthropicClient client = new(); MessageCreateParams parameters = new() { MaxTokens = 1024, - Messages = - [ - new() - { - Role = Role.User, - Content = "Hello, Claude", - }, - ], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], Model = Model.ClaudeOpus5_5, }; @@ -60,7 +53,7 @@ foreach (var block in message.Content) } ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ## Client configuration @@ -111,7 +104,7 @@ var message = await client Console.WriteLine(message); ``` -Using a [`with` expression](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/with-expression) makes it easy to construct the modified options. +You can use a [`with` expression](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/with-expression) to construct the modified options. The `WithOptions` method does not affect the original client or service. @@ -130,14 +123,7 @@ using Anthropic.Models.Messages; MessageCreateParams parameters = new() { MaxTokens = 1024, - Messages = - [ - new() - { - Role = Role.User, - Content = "Hello, Claude", - }, - ], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], Model = Model.ClaudeOpus5_5, }; @@ -166,7 +152,7 @@ The SDK throws custom unchecked exception types: Additionally, all 4xx errors inherit from `Anthropic4xxException`. -* `AnthropicSseException`: thrown for errors encountered during SSE streaming after a successful initial HTTP response. +* `AnthropicSseException`: Errors encountered during SSE streaming after a successful initial HTTP response. * `AnthropicIOException`: I/O networking errors. @@ -186,7 +172,7 @@ Only the following error types are retried: * 429 Rate Limit * 5xx Internal -The API may also explicitly instruct the SDK to retry or not retry a request. +The API might also explicitly instruct the SDK to retry or not retry a request. To set a custom number of retries, configure the client using the `MaxRetries` property: @@ -277,7 +263,7 @@ while (true) ## Response validation -In rare cases, the API may return a response that doesn't match the expected type. By default, the SDK does not throw an exception in this case. It throws `AnthropicInvalidDataException` only if you directly access the property. +In rare cases, the API might return a response that doesn't match the expected type. By default, the SDK does not throw an exception in this case. It throws `AnthropicInvalidDataException` only if you directly access the property. If you would prefer to check that the response is completely well-typed upfront, then either call `Validate`: @@ -310,7 +296,7 @@ Console.WriteLine(message); ## IChatClient integration -The SDK provides an implementation of the `IChatClient` interface from the `Microsoft.Extensions.AI.Abstractions` library. This enables `AnthropicClient` (and `Anthropic.Services.IBetaService`) to be used with other libraries that integrate with these core abstractions. For example, tools in the MCP C# SDK (`ModelContextProtocol`) library can be used directly with an `AnthropicClient` exposed through `IChatClient`. +The SDK provides an implementation of the `IChatClient` interface from the `Microsoft.Extensions.AI.Abstractions` library. This allows `AnthropicClient` (and `Anthropic.Services.IBetaService`) to be used with other libraries that integrate with these core abstractions. For example, tools in the MCP C# SDK (`ModelContextProtocol`) library can be used directly with an `AnthropicClient` exposed through `IChatClient`. ```csharp using Anthropic; @@ -338,13 +324,13 @@ Console.WriteLine(await chatClient.GetResponseAsync("Tell me about IChatClient", To send a request to the Claude API, build an instance of a `Params` class and pass it to the corresponding client method. When the response is received, it's deserialized into an instance of a C# class. -For example, `client.Messages.Create` should be called with an instance of `MessageCreateParams`, and it will return an instance of `Task`. +For example, `client.Messages.Create` should be called with an instance of `MessageCreateParams`, and it returns an instance of `Task`. ## Advanced usage ### Binary responses -The SDK defines methods that return binary responses, which are used for API responses that shouldn't necessarily be parsed, like non-JSON data. +The SDK defines methods that return binary responses, which are used for API responses that shouldn't necessarily be parsed, such as non-JSON data. These methods return `HttpResponse`: @@ -444,6 +430,8 @@ Use `AnthropicBedrockMantleClient` for new projects; `AnthropicBedrockClient` re ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 13.0.0; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backward-incompatible changes may be released as minor versions: 1. Changes to library internals that are technically public but not intended or documented for external use. diff --git a/content/en/cli-sdks-libraries/sdks/go.md b/content/en/cli-sdks-libraries/sdks/go.md index 3cccea026d..48c9d5d1f4 100644 --- a/content/en/cli-sdks-libraries/sdks/go.md +++ b/content/en/cli-sdks-libraries/sdks/go.md @@ -63,7 +63,7 @@ func main() { } ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. @@ -277,7 +277,7 @@ param.IsNull(p.Name) // true param.IsNull(p.Point) // true ``` -Request structs contain a `.SetExtraFields(map[string]any)` method which can send non-conforming fields in the request body. Extra fields overwrite any struct fields with a matching key. +Request structs contain a `.SetExtraFields(map[string]any)` method that can send non-conforming fields in the request body. Extra fields overwrite any struct fields with a matching key. For security reasons, only use `SetExtraFields` with trusted data. @@ -298,7 +298,7 @@ custom := param.Override[anthropic.FooParams](12) ### Request unions -Unions are represented as a struct with fields prefixed by "Of" for each of its variants. Only one field can be non-zero. The non-zero field will be serialized. +Unions are represented as a struct with fields prefixed by "Of" for each of its variants. Only one field can be non-zero. The non-zero field is serialized. Subproperties of the union can be accessed through methods on the union struct. These methods return a pointer to the value, if present. @@ -324,15 +324,15 @@ if address := animal.GetOwner().GetAddress(); address != nil { } ``` -### Deserializing params +### Deserializing parameters `param.SetJSON` requires SDK v1.20.0 or later. -Param types (types ending in `Param`, such as `MessageNewParams` or `ToolUnionParam`) are designed for outgoing requests only. They marshal correctly to JSON but do not fully support round-trip deserialization. If you unmarshal raw JSON into a param struct, typed union fields like `OfBashTool20250124` will be nil even when the underlying JSON is valid. +Parameter types (types ending in `Param`, such as `MessageNewParams` or `ToolUnionParam`) are designed for outgoing requests only. They marshal correctly to JSON but do not fully support round-trip deserialization. If you unmarshal raw JSON into a parameter struct, typed union fields such as `OfBashTool20250124` will be nil even when the underlying JSON is valid. -If you need to reconstruct params from raw JSON (for example, from a database, middleware, or a previous request), call `UnmarshalJSON` to populate non-union fields, then use `param.SetJSON` to attach the raw bytes for correct re-serialization: +If you need to reconstruct parameters from raw JSON (for example, from a database, middleware, or a previous request), call `UnmarshalJSON` to populate non-union fields, then use `param.SetJSON` to attach the raw bytes for correct re-serialization: ```go // Serialize params (for example, for storage or forwarding) @@ -415,7 +415,7 @@ body := res.JSON.ExtraFields["my_unexpected_field"].Raw() ### Response unions -In responses, unions are represented by a flattened struct containing all possible fields from each of the object variants. To convert it to a variant use the `.AsFooVariant()` method or the `.AsAny()` method if present. +In responses, unions are represented by a flattened struct containing all possible fields from each of the object variants. To convert it to a variant, use the `.AsFooVariant()` method or the `.AsAny()` method if present. If a response value union contains primitive values, primitive fields will be alongside the properties but prefixed with `Of` and feature the tag `json:"...,inline"`. @@ -483,7 +483,7 @@ When other errors occur, they are returned unwrapped; for example, if HTTP trans ## Retries -Certain errors will be automatically retried 2 times by default, with a short exponential backoff. The SDK retries by default all connection errors, 408 Request Timeout, 409 Conflict, 429 Rate Limit, and >=500 Internal errors. +Certain errors are automatically retried 2 times by default, with a short exponential backoff. The SDK retries by default all connection errors, 408 Request Timeout, 409 Conflict, 429 Rate Limit, and >=500 Internal errors. You can use the `WithMaxRetries` option to configure or disable this: @@ -546,16 +546,16 @@ defer cancel() ## Long requests - Consider using the streaming Messages API for longer running requests. + Consider using the streaming Messages API for longer-running requests. -Avoid setting a large `MaxTokens` value without using streaming as some networks may drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/go#timeouts) without receiving a response from Anthropic. +Avoid setting a large `MaxTokens` value without using streaming as some networks might drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/go#timeouts) without receiving a response from Anthropic. This SDK will also return an error if a non-streaming request is expected to be above roughly 10 minutes long. Calling `.Messages.NewStreaming()` or [setting a custom timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/go#timeouts) disables this error. ## File uploads -Request parameters that correspond to file uploads in multipart requests are typed as `io.Reader`. The contents of the `io.Reader` will by default be sent as a multipart form part with the file name of `anonymous_file` and content type of `application/octet-stream`, so the recommended approach is to specify a custom content type with the `anthropic.File(reader io.Reader, filename string, contentType string)` helper, which wraps any `io.Reader` with the appropriate file name and content type. +Request parameters that correspond to file uploads in multipart requests are typed as `io.Reader`. The contents of the `io.Reader` are sent by default as a multipart form part with the file name of `anonymous_file` and content type of `application/octet-stream`, so the recommended approach is to specify a custom content type with the `anthropic.File(reader io.Reader, filename string, contentType string)` helper, which wraps any `io.Reader` with the appropriate file name and content type. ```go // A file from the file system @@ -570,7 +570,7 @@ anthropic.FileUploadParams{ } ``` -The file name and content type can also be customized by implementing `Name() string` or `ContentType() string` on the run-time type of `io.Reader`. Note that `os.File` implements `Name() string`, so a file returned by `os.Open` will be sent with the file name on disk. +The file name and content type can also be customized by implementing `Name() string` or `ContentType() string` on the runtime type of `io.Reader`. Note that `os.File` implements `Name() string`, so a file returned by `os.Open` is sent with the file name on disk. ## Pagination @@ -592,7 +592,7 @@ if err := iter.Err(); err != nil { } ``` -Or you can use simple `.List()` methods to fetch a single page and receive a standard response object with additional helper methods like `.GetNextPage()`: +Or you can use simple `.List()` methods to fetch a single page and receive a standard response object with additional helper methods such as `.GetNextPage()`: ```go page, err := client.Messages.Batches.List(context.TODO(), anthropic.MessageBatchListParams{ @@ -627,7 +627,7 @@ client.Messages.New(context.TODO(), // ..., ) ``` -The request option `option.WithDebugLog(nil)` may be helpful while debugging. +The request option `option.WithDebugLog(nil)` might be helpful while debugging. See the [full list of request options](https://pkg.go.dev/github.com/anthropics/anthropic-sdk-go/option). @@ -692,11 +692,11 @@ fmt.Printf("Headers: %+#v\n", response.Header) ### Making custom/undocumented requests -This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, params, or response properties, the library can still be used. +This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, parameters, or response properties, the library can still be used. #### Undocumented endpoints -To make requests to undocumented endpoints, you can use `client.Get`, `client.Post`, and other HTTP verbs. `RequestOptions` on the client, such as retries, will be respected when making these requests. +To make requests to undocumented endpoints, you can use `client.Get`, `client.Post`, and other HTTP verbs. `RequestOptions` on the client, such as retries, are respected when making these requests. ```go var ( @@ -714,9 +714,9 @@ if err != nil { } ``` -#### Undocumented request params +#### Undocumented request parameters -To make requests using undocumented parameters, you may use either the `option.WithQuerySet()` or the `option.WithJSONSet()` methods. +To make requests using undocumented parameters, you can use either the `option.WithQuerySet()` or the `option.WithJSONSet()` functions. ```go params := FooNewParams{ @@ -730,12 +730,14 @@ client.Foo.New(context.Background(), params, option.WithJSONSet("data.last_name" #### Undocumented response properties -To access undocumented response properties, you may either access the raw JSON of the response as a string with `result.JSON.RawJSON()`, or get the raw JSON of a particular field on the result with `result.JSON.Foo.Raw()`. +To access undocumented response properties, you can either access the raw JSON of the response as a string with `result.JSON.RawJSON()`, or get the raw JSON of a particular field on the result with `result.JSON.Foo.Raw()`. Any fields that are not present on the response struct are saved and can be accessed through `result.JSON.ExtraFields`, which is a `map[string]respjson.Field`. ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 2.0.0, whose module path is `github.com/anthropics/anthropic-sdk-go/v2`; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backward-incompatible changes may be released as minor versions: 1. Changes to library internals that are technically public but not intended or documented for external use. diff --git a/content/en/cli-sdks-libraries/sdks/java.md b/content/en/cli-sdks-libraries/sdks/java.md index 1c447f3ae5..b8546f98a0 100644 --- a/content/en/cli-sdks-libraries/sdks/java.md +++ b/content/en/cli-sdks-libraries/sdks/java.md @@ -15,7 +15,7 @@ The Anthropic Java SDK provides convenient access to the Claude API from applica ```kotlin - implementation("com.anthropic:anthropic-java:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") ``` @@ -24,7 +24,7 @@ The Anthropic Java SDK provides convenient access to the Claude API from applica com.anthropic anthropic-java - 2.75.0 + 3.0.0 ``` @@ -99,7 +99,7 @@ AnthropicClient client = AnthropicOkHttpClient.builder() .build(); ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ### Configuration options @@ -316,7 +316,7 @@ For complete structured outputs documentation including Java examples, see [Stru [Tool use with Claude](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview) lets you integrate external tools and functions directly into the AI model's responses. Instead of producing plain text, the model can output instructions (with parameters) for calling a tool or function when appropriate. You define JSON schemas for tools, and the model uses the schemas to determine when and how to use these tools. -The tool use feature supports a "strict" mode that guarantees that the JSON output from the AI model will conform to the JSON schema you provide in the input parameters. +The tool use feature supports a "strict" mode that guarantees that the JSON output from the AI model conforms to the JSON schema you provide in the input parameters. The SDK can derive a tool and its parameters automatically from the structure of an arbitrary Java class: the class's name (converted to snake case) provides the tool name, and the class's fields define the tool's parameters. @@ -381,7 +381,7 @@ static class Weather { ### Calling tools -When your tool classes are defined, add them to the message parameters using `MessageCreateParams.Builder.addTool(Class)` and then call them if requested to do so in the AI model's response. `BetaToolUseBlock.input(Class)` can be used to parse a tool's parameters in JSON form to an instance of your tool-defining class. +After you define your tool classes, add them to the message parameters using `MessageCreateParams.Builder.addTool(Class)` and then call them if requested to do so in the AI model's response. `BetaToolUseBlock.input(Class)` can be used to parse a tool's parameters in JSON form to an instance of your tool-defining class. After calling the tool, use `BetaToolResultBlockParam.Builder.contentAsJson(Object)` to pass the tool's result back to the AI model: @@ -403,14 +403,14 @@ client.beta().messages().create(createParamsBuilder.build()).content().stream() .flatMap(contentBlock -> contentBlock.toolUse().stream()) .forEach(toolUseBlock -> createParamsBuilder // Add a message indicating that the tool use was requested. - .addAssistantMessageOfBetaContentBlockParams( + .addAssistantMessageOfContentBlockParams( List.of(BetaContentBlockParam.ofToolUse(BetaToolUseBlockParam.builder() .name(toolUseBlock.name()) .id(toolUseBlock.id()) .input(toolUseBlock._input()) .build()))) // Add a message with the result of the requested tool use. - .addUserMessageOfBetaContentBlockParams( + .addUserMessageOfContentBlockParams( List.of(BetaContentBlockParam.ofToolResult(BetaToolResultBlockParam.builder() .toolUseId(toolUseBlock.id()) .contentAsJson(callTool(toolUseBlock)) @@ -432,7 +432,7 @@ private static Object callTool(BetaToolUseBlock toolUseBlock) { ### Tool name conversion -Tool names are derived from the camel case tool class names (for example, `GetWeather`) and converted to snake case (for example, `get_weather`). Word boundaries begin where the current character is not the first character, is uppercase, and either the preceding character is lowercase, or the following character is lowercase. For example, `MyJSONParser` becomes `my_json_parser` and `ParseJSON` becomes `parse_json`. This conversion can be overridden using the `@JsonTypeName` annotation. +Tool names are derived from the camel case tool class names (for example, `GetWeather`) and converted to snake case (for example, `get_weather`). Word boundaries start where the current character is not the first character, is uppercase, and either the preceding character is lowercase, or the following character is lowercase. For example, `MyJSONParser` becomes `my_json_parser` and `ParseJSON` becomes `parse_json`. This conversion can be overridden using the `@JsonTypeName` annotation. ### Local tool JSON schema validation @@ -565,11 +565,11 @@ try (HttpResponse response = client.files().download(params)) { The SDK throws custom unchecked exception types: -* `AnthropicServiceException` - Base class for HTTP errors. -* `AnthropicIoException` - I/O networking errors. -* `AnthropicRetryableException` - Generic error indicating a failure that could be retried. -* `AnthropicInvalidDataException` - Failure to interpret successfully parsed data (for example, when accessing a property that's supposed to be required, but the API unexpectedly omitted it). -* `AnthropicException` - Base class for all exceptions. +* `AnthropicServiceException` - Base class for HTTP errors +* `AnthropicIoException` - I/O networking errors +* `AnthropicRetryableException` - Generic error indicating a failure that could be retried +* `AnthropicInvalidDataException` - Failure to interpret successfully parsed data (for example, when accessing a property that's supposed to be required, but the API unexpectedly omitted it) +* `AnthropicException` - Base class for all exceptions ### Status code mapping @@ -615,7 +615,7 @@ HttpResponseFor message = client.messages().withRawResponse().create(pa Optional requestId = message.requestId(); ``` -This can be used to quickly log failing requests and report them back to Anthropic. For more information on debugging requests, see [Request ID](https://platform.claude.com/docs/en/api/errors#request-id). +This can be used to log failing requests and report them back to Anthropic. For more information on debugging requests, see [Request ID](https://platform.claude.com/docs/en/api/errors#request-id). ## Retries @@ -629,7 +629,7 @@ Only the following error types are retried: * 429 Rate Limit * 5xx Internal -The API may also explicitly instruct the SDK to retry or not retry a request. +The API might also explicitly instruct the SDK to retry or not retry a request. To set a custom number of retries, configure the client using the `maxRetries` method: @@ -687,10 +687,10 @@ AnthropicClient client = AnthropicOkHttpClient.builder() ## Long requests - Consider using [streaming](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#streaming) for longer running requests. + Consider using [streaming](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#streaming) for longer-running requests. -Avoid setting a large `maxTokens` value without using streaming. Some networks may drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#timeouts) without receiving a response from Anthropic. The SDK periodically pings the API to keep the connection alive and reduce the impact of these networks. +Avoid setting a large `maxTokens` value without using streaming. Some networks might drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#timeouts) without receiving a response from Anthropic. The SDK periodically pings the API to keep the connection alive and reduce the impact of these networks. The SDK throws an error if a non-streaming request is expected to take longer than 10 minutes. Using a [streaming method](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#streaming) or [overriding the timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/java#timeouts) at the client or request level disables the error. @@ -832,10 +832,10 @@ MessageCreateParams params = MessageCreateParams.builder() These can be accessed on the built object later using the `_additionalHeaders()`, `_additionalQueryParams()`, and `_additionalBodyProperties()` methods. - The values passed to these methods overwrite values passed to earlier methods. For security reasons, ensure these methods are only used with trusted input data. + The values passed to these methods overwrite values passed to earlier methods. For security reasons, use these methods only with trusted input data. -To set undocumented parameters on nested headers, query params, or body classes: +To set undocumented parameters on nested headers, query parameters, or body classes: ```java import com.anthropic.core.JsonValue; @@ -1037,7 +1037,7 @@ AnthropicClient client = AnthropicOkHttpClient.builder() The SDK consists of three artifacts: -* `anthropic-java-core` - Contains core SDK logic, does not depend on OkHttp. Exposes `AnthropicClient`, `AnthropicClientAsync`, and their implementation classes, all of which can work with any HTTP client. +* `anthropic-java-core` - Contains core SDK logic and does not depend on OkHttp. Exposes `AnthropicClient`, `AnthropicClientAsync`, and their implementation classes, all of which can work with any HTTP client. * `anthropic-java-client-okhttp` - Depends on OkHttp. Exposes `AnthropicOkHttpClient` and `AnthropicOkHttpClientAsync`. * `anthropic-java` - Depends on and exposes the APIs of both `anthropic-java-core` and `anthropic-java-client-okhttp`. Does not have its own logic. @@ -1192,13 +1192,13 @@ MessageCreateParams params = MessageCreateParams.builder() .build(); ``` -Prefer the well-typed constants (for example, `Model.CLAUDE_OPUS_5`) so you get autocomplete and deprecation warnings. The `String` overloads and `of(...)` are primarily for setting the field to an undocumented or not yet supported value while waiting for an SDK release that includes it. +Prefer the well-typed constants (for example, `Model.CLAUDE_OPUS_5`) so you get auto-complete and deprecation warnings. The `String` overloads and `of(...)` are primarily for setting the field to an undocumented or not yet supported value while waiting for an SDK release that includes it. ## Beta features Beta features are available before general release to get early feedback and test new functionality. You can check the availability of all of Claude's capabilities and tools in the [Features overview](https://platform.claude.com/docs/en/build-with-claude/overview). -You can access most beta API features through the `beta()` method on the client. To enable a particular beta feature, add the appropriate [beta header](https://platform.claude.com/docs/en/api/beta-headers) with `.addBeta()` when building the message params. +You can access most beta API features through the `beta()` method on the client. To enable a particular beta feature, add the appropriate [beta header](https://platform.claude.com/docs/en/api/beta-headers) with `.addBeta()` when building the message parameters. For example, to enable [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing): @@ -1234,7 +1234,7 @@ void main() { * Allowing usage of undocumented API functionality * Lazily validating the API response against the expected shape - * Representing absent vs explicitly null values + * Representing absent versus explicitly null values @@ -1249,15 +1249,17 @@ void main() { * Are verbose to handle * Encourage error handling at the wrong level of abstraction, where nothing can be done about the error * Are tedious to propagate because of the function coloring problem - * Don't play well with lambdas (also because of the function coloring problem) + * Don't work well with lambdas (also because of the function coloring problem) ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 3.0.0; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backward-incompatible changes may be released as minor versions: -1. Changes to library internals which are technically public but not intended or documented for external use. +1. Changes to library internals that are technically public but not intended or documented for external use. 2. Changes that aren't expected to impact the vast majority of users in practice. ## Additional resources diff --git a/content/en/cli-sdks-libraries/sdks/php.md b/content/en/cli-sdks-libraries/sdks/php.md index 13022198ba..d4e506c0e4 100644 --- a/content/en/cli-sdks-libraries/sdks/php.md +++ b/content/en/cli-sdks-libraries/sdks/php.md @@ -6,10 +6,6 @@ description: Install and configure the Anthropic PHP SDK with value objects and The Anthropic PHP library provides convenient access to the Claude API from any PHP 8.1.0+ application. - - The PHP SDK is currently in beta. APIs might change between versions. - - For API feature documentation with code examples, see the [API reference](https://platform.claude.com/docs/en/api/overview). This page covers PHP-specific SDK features and configuration. @@ -43,11 +39,11 @@ $textBlock = array_find($message->content, static fn ($block): bool => $block->t echo $textBlock->text; ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ## Value objects -It is recommended to use the static `with` constructor `Base64ImageSource::with(data: "U3RhaW5sZXNzIHJvY2tz", ...)` and named parameters to initialize value objects. +The recommended way to initialize value objects is the static `with` constructor `Base64ImageSource::with(data: "U3RhaW5sZXNzIHJvY2tz", ...)` with named parameters. However, builders are also provided `(new Base64ImageSource)->withData("U3RhaW5sZXNzIHJvY2tz")`. @@ -107,7 +103,7 @@ try { Error codes are as follows: -| Cause | Error Type | +| Cause | Error type | | ---------------- | ------------------------------ | | HTTP 400 | `BadRequestException` | | HTTP 401 | `AuthenticationException` | @@ -238,7 +234,9 @@ Use `MantleClient` for new projects; `Anthropic\Bedrock\Client` remains for exis ## Semantic versioning -This package follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions. As the library is in initial development and has a major version of `0`, APIs might change at any time. +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 1.0.0; see [Upgrade to 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + +This package follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions. This package considers improvements to the (non-runtime) PHPDoc type definitions to be non-breaking changes. diff --git a/content/en/cli-sdks-libraries/sdks/python.md b/content/en/cli-sdks-libraries/sdks/python.md index fea2bbec16..31078fdb27 100644 --- a/content/en/cli-sdks-libraries/sdks/python.md +++ b/content/en/cli-sdks-libraries/sdks/python.md @@ -69,7 +69,7 @@ for block in message.content: Consider using [python-dotenv](https://pypi.org/project/python-dotenv/) to add `ANTHROPIC_API_KEY="my-anthropic-api-key"` to your `.env` file so that your API key isn't stored in source control. -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ## Async usage @@ -202,7 +202,7 @@ asyncio.run(main()) Streaming with `client.messages.stream(...)` exposes various helpers including accumulation and SDK-specific events. -Alternatively, you can use `client.messages.create(..., stream=True)` which only returns an iterable of the events in the stream and uses less memory (it doesn't build up a final message object for you). +Alternatively, you can use `client.messages.create(..., stream=True)`, which only returns an iterable of the events in the stream and uses less memory (it doesn't build up a final message object for you). ## Token counting @@ -347,7 +347,7 @@ The async client uses the exact same interface. If you pass a `PathLike` instanc ## Handling errors -When the library is unable to connect to the API, or if the API returns a non-success status code (that is, 4xx or 5xx response), a subclass of `APIError` is raised: +When the library is unable to connect to the API, or if the API returns a non-success status code (that is, a 4xx or 5xx response), a subclass of `APIError` is raised: ```python import anthropic @@ -392,7 +392,7 @@ Error codes are as follows: > For more information on debugging requests, see [Request ID](https://platform.claude.com/docs/en/api/errors#request-id). -All object responses in the SDK provide a `_request_id` property which is added from the `request-id` response header so that you can quickly log failing requests and report them back to Anthropic. +All object responses in the SDK provide a `_request_id` property, which is added from the `request-id` response header so that you can log failing requests and report them back to Anthropic. ```python message = client.messages.create( @@ -400,7 +400,7 @@ message = client.messages.create( messages=[{"role": "user", "content": "Hello, Claude"}], model="claude-opus-5-5", ) -print(message._request_id) # e.g., req_018EeWyXxfu5pfWkrYcMdjWG +print(message._request_id) # for example, req_018EeWyXxfu5pfWkrYcMdjWG ``` @@ -460,14 +460,14 @@ Note that requests that time out are [retried twice by default](https://platform ## Long requests - Consider using the streaming [Messages API](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#streaming-responses) for longer running requests. + Consider using the [streaming Messages API](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#streaming-responses) for longer-running requests. -Avoid setting a large `max_tokens` value without using streaming. Some networks may drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#timeouts) without receiving a response from Anthropic. +Avoid setting a large `max_tokens` value without using streaming. Some networks might drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#timeouts) without receiving a response from Anthropic. The SDK will throw a `ValueError` if a non-streaming request is expected to take longer than approximately 10 minutes. Passing `stream=True` or overriding the `timeout` option at the client or request level disables this error. -An expected request latency longer than the [timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#timeouts) for a non-streaming request will result in the client terminating the connection and retrying without receiving a response. +An expected request latency longer than the [timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#timeouts) for a non-streaming request will result in the client ending the connection and retrying without receiving a response. The SDK sets a [TCP socket keep-alive](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) option to reduce the impact of idle connection timeouts on some networks. This can be overridden by passing a custom `http_client` option to the client. @@ -525,12 +525,12 @@ for batch in first_page.data: ## Default headers -The SDK automatically sends the `anthropic-version` header set to `2023-06-01`. +The SDK automatically sends the `anthropic-version` header set to the API version for this major version of the SDK (see [Semantic versioning](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/python#semantic-versioning)). If you need to, you can override it by setting default headers on the client object or per-request. - Overriding default headers may result in incorrect types and other unexpected or undefined behavior in the SDK. + Overriding default headers might result in incorrect types and other unexpected or undefined behavior in the SDK. ```python @@ -552,9 +552,9 @@ client.messages.with_raw_response.create( ### Request parameters -Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also have helper methods for things like serializing back into JSON ([`v1`](https://docs.pydantic.dev/1.10/usage/models/), [`v2`](https://docs.pydantic.dev/latest/concepts/serialization/)). +Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev), which also have helper methods for things such as serializing back into JSON ([Pydantic `v1`](https://docs.pydantic.dev/1.10/usage/models/), [Pydantic `v2`](https://docs.pydantic.dev/latest/concepts/serialization/)). -Typed requests and responses provide autocomplete and documentation within your editor. If you'd like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`. +Typed requests and responses provide auto-complete and documentation within your editor. If you'd like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`. ### Response models @@ -570,7 +570,7 @@ json_str = message.to_json() data = message.to_dict() ``` -### Handling null vs missing fields +### Handling null versus missing fields In responses, you can distinguish between fields that are explicitly `null` versus fields that were not returned (missing): @@ -627,7 +627,7 @@ with client.messages.with_streaming_response.create( print(line) ``` -The context manager is required so that the response will reliably be closed. +The context manager is required so that the response is reliably closed. ### Logging @@ -641,7 +641,7 @@ export ANTHROPIC_LOG=debug ### Making custom/undocumented requests -This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, params, or response properties, the library can still be used. +This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, parameters, or response properties, the library can still be used. #### Undocumented endpoints @@ -659,17 +659,17 @@ response = client.post( print(response.json()) ``` -#### Undocumented request params +#### Undocumented request parameters If you want to explicitly send an extra parameter, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request options. - The `extra_` parameters override documented parameters of the same name. For security reasons, ensure these methods are only used with trusted input data. + The `extra_` parameters override documented parameters of the same name. For security reasons, use these methods only with trusted input data. #### Undocumented response properties -To access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You can also get all extra fields on the Pydantic model as a dict with `response.model_extra`. +To access undocumented response properties, you can access the extra fields such as `response.unknown_prop`. You can also get all extra fields on the Pydantic model as a dict with `response.model_extra`. ### Configuring the HTTP client @@ -703,7 +703,7 @@ Tracing and mocking tools that patch `httpx` itself, such as OpenTelemetry's `HT ### Managing HTTP resources -By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting. +By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if you want to, or with a context manager that closes when exiting. ```python with Anthropic() as client: @@ -759,10 +759,12 @@ Use `AnthropicBedrockMantle` for new projects; `AnthropicBedrock` remains for ex ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 2.0.0; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backward-incompatible changes may be released as minor versions: 1. Changes that only affect static types, without breaking runtime behavior. -2. Changes to library internals which are technically public but not intended or documented for external use. +2. Changes to library internals that are technically public but not intended or documented for external use. 3. Changes that aren't expected to impact the vast majority of users in practice. ### Determining the installed version diff --git a/content/en/cli-sdks-libraries/sdks/ruby.md b/content/en/cli-sdks-libraries/sdks/ruby.md index 4610333f4b..535e0c610e 100644 --- a/content/en/cli-sdks-libraries/sdks/ruby.md +++ b/content/en/cli-sdks-libraries/sdks/ruby.md @@ -40,7 +40,7 @@ message.content.each do |block| end ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ## Streaming @@ -80,7 +80,7 @@ Streaming with `anthropic.messages.stream(...)` exposes various helpers includin ## Input schema and tool calling -The SDK provides helper mechanisms to define structured data classes for tools and let Claude automatically execute them. For detailed documentation on tool use patterns including the tool runner, see [Tool Runner (SDK)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner). +The SDK provides helper mechanisms to define structured data classes for tools and let Claude automatically run them. For detailed documentation on tool use patterns including the tool runner, see [Tool Runner (SDK)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner). ```ruby anthropic = Anthropic::Client.new @@ -113,7 +113,7 @@ For complete structured outputs documentation including Ruby examples, see [Stru ## Handling errors -When the library is unable to connect to the API, or if the API returns a non-success status code (that is, 4xx or 5xx response), a subclass of `Anthropic::Errors::APIError` is raised: +When the library is unable to connect to the API, or if the API returns a non-success status code (that is, a 4xx or 5xx response), a subclass of `Anthropic::Errors::APIError` is raised: ```ruby anthropic = Anthropic::Client.new @@ -136,7 +136,7 @@ end Error codes are as follows: -| Cause | Error Type | +| Cause | Error type | | ---------------- | -------------------------- | | HTTP 400 | `BadRequestError` | | HTTP 401 | `AuthenticationError` | @@ -152,7 +152,7 @@ Error codes are as follows: ## Retries -Certain errors will be automatically retried 2 times by default, with a short exponential backoff. +Certain errors are automatically retried 2 times by default, with a short exponential backoff. Connection errors (for example, because of a network connectivity problem), 408 Request Timeout, 409 Conflict, 429 Rate Limit, >=500 Internal errors, and timeouts are all retried by default. @@ -236,26 +236,26 @@ Request parameters that correspond to file uploads can be passed as raw contents anthropic = Anthropic::Client.new require "pathname" -# Use `Pathname` to send the filename and/or avoid paging a large file into memory: +# Use `Pathname` to send the filename, avoid paging a large file into memory, or both: file_metadata = anthropic.files.upload(file: Pathname("/path/to/file")) # Alternatively, pass file contents or a `StringIO` directly: file_metadata = anthropic.files.upload(file: File.read("/path/to/file")) -# Or, to control the filename and/or content type: +# Or, to control the filename, the content type, or both: file = Anthropic::FilePart.new(File.read("/path/to/file"), filename: "/path/to/file", content_type: "...") file_metadata = anthropic.files.upload(file: file) puts(file_metadata.id) ``` -Note that you can also pass a raw `IO` descriptor, but this disables retries, as the library can't be sure if the descriptor is a file or pipe (which cannot be rewound). +Note that you can also pass a raw `IO` descriptor, but this disables retries, as the library can't determine whether the descriptor is a file or pipe (which cannot be rewound). ## Sorbet This library provides comprehensive [RBI](https://sorbet.org/docs/rbi) definitions, and has no dependency on sorbet-runtime. -You can provide typesafe request parameters like so: +You can provide typesafe request parameters as follows: ```ruby anthropic = Anthropic::Client.new @@ -335,7 +335,7 @@ All parameter and response objects inherit from `Anthropic::Internal::Type::Base The `Anthropic::Client` instances are threadsafe, but are only fork-safe when there are no in-flight HTTP requests. -Each instance of `Anthropic::Client` has its own HTTP connection pool with a default size of 99. As such, the recommendation is to create the client once per application in most settings. +Each instance of `Anthropic::Client` has its own HTTP connection pool with a default size of 99. As such, the recommendation is to create the client once for each application in most settings. When all available connections from the pool are checked out, requests wait for a new connection to become available, with queue time counting toward the request timeout. @@ -345,10 +345,10 @@ Unless otherwise specified, other classes in the SDK do not have locks protectin ### Undocumented properties -You can send undocumented parameters to any endpoint, and read undocumented response properties, like so: +You can send undocumented parameters to any endpoint, and read undocumented response properties, as follows: - The `extra_` parameters of the same name override the documented parameters. For security reasons, ensure these methods are only used with trusted input data. + The `extra_` parameters of the same name override the documented parameters. For security reasons, use these methods only with trusted input data. ```ruby @@ -369,13 +369,13 @@ message = puts(message[:my_undocumented_property]) ``` -### Undocumented request params +### Undocumented request parameters -If you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` under the `request_options:` parameter when making a request, as seen in the previous examples. +If you want to explicitly send an extra parameter, you can do so with `extra_query`, `extra_body`, and `extra_headers` under `request_options:` when making a request, as seen in the previous examples. ### Undocumented endpoints -To make requests to undocumented endpoints while retaining the benefit of authentication, retries, and so on, you can make requests using `anthropic.request`, like so: +To make requests to undocumented endpoints while retaining the benefit of authentication, retries, and so on, you can make requests using `anthropic.request`, as follows: ```ruby response = anthropic.request( @@ -409,6 +409,8 @@ Use `Anthropic::BedrockMantleClient` for new projects; `Anthropic::BedrockClient ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 2.0.0; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions. This package considers improvements to the (non-runtime) `*.rbi` and `*.rbs` type definitions to be non-breaking changes. diff --git a/content/en/cli-sdks-libraries/sdks/typescript.md b/content/en/cli-sdks-libraries/sdks/typescript.md index 5eba14657f..cb171f520a 100644 --- a/content/en/cli-sdks-libraries/sdks/typescript.md +++ b/content/en/cli-sdks-libraries/sdks/typescript.md @@ -55,11 +55,11 @@ for (const block of message.content) { } ``` -For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) with access to multiple workspaces, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. +For authentication options including Workload Identity Federation, see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication). If your API key is a [personal or service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) that isn't scoped to a workspace, set the workspace ID in the `anthropic-workspace-id` request header; [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) shows the per-request option for this SDK. ## Request and response types -This library includes TypeScript definitions for all request parameters and response fields. You may import and use them like so: +This library includes TypeScript definitions for all request parameters and response fields. You can import and use them as follows: ```typescript const client = new Anthropic({ @@ -136,13 +136,13 @@ const message = await stream.finalMessage(); console.log(message); ``` -Streaming with `client.messages.stream(...)` exposes various helpers for your convenience including event handlers and accumulation. +Streaming with `client.messages.stream(...)` exposes various helpers for your convenience, including event handlers and accumulation. -Alternatively, you can use `client.messages.create({ ..., stream: true })` which only returns an async iterable of the events in the stream and thus uses less memory (it does not build up a final message object for you). +Alternatively, you can use `client.messages.create({ ..., stream: true })`, which only returns an async iterable of the events in the stream and thus uses less memory (it does not build up a final message object for you). ## Tool helpers -This SDK provides helpers for making it easy to create and run tools in the Messages API. You can use Zod schemas or JSON Schemas to describe the input to a tool. You can then run those tools using the `client.beta.messages.toolRunner()` method. This method handles passing the inputs generated by the chosen model into the right tool and passing the result back to the model. +This SDK provides helpers for creating and running tools in the Messages API. You can use Zod schemas or JSON Schemas to describe the input to a tool. You can then run those tools using the `client.beta.messages.toolRunner()` method. This method handles passing the inputs generated by the chosen model into the right tool and passing the result back to the model. For more details on tool use, see [Tool use with Claude](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview). To run the browser use tool or the computer use tool with this SDK, see [Browser and computer use with the SDK toolsets](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-sdk). @@ -314,7 +314,7 @@ const batch = await client.messages.batches.create({ ### Getting results from a batch -Once a Message Batch has been processed, indicated by `.processing_status === 'ended'`, you can access the results with `.batches.results()` +Once a Message Batch has been processed, indicated by `.processing_status === 'ended'`, you can access the results with `.batches.results()`: ```typescript const results = await client.messages.batches.results(batch.id); @@ -334,7 +334,7 @@ Request parameters that correspond to file uploads can be passed in many differe * an `fs.ReadStream` * the return value of the `toFile` helper -Set the content type explicitly as the Files API will not infer it for you: +Set the content type explicitly as the Files API does not infer it for you: ```typescript import fs from "node:fs"; @@ -369,7 +369,7 @@ await client.files.upload({ ## Handling errors -When the library is unable to connect to the API, or if the API returns a non-success status code (that is, 4xx or 5xx response), a subclass of `APIError` is thrown: +When the library is unable to connect to the API, or if the API returns a non-success status code (that is, a 4xx or 5xx response), a subclass of `APIError` is thrown: ```typescript const message = await client.messages @@ -407,7 +407,7 @@ Error codes are as follows: > For more information on debugging requests, see [Request ID](https://platform.claude.com/docs/en/api/errors#request-id). -All object responses in the SDK provide a `_request_id` property which is added from the `request-id` response header so that you can quickly log failing requests and report them back to Anthropic. +All object responses in the SDK provide a `_request_id` property, which is added from the `request-id` response header so that you can log failing requests and report them back to Anthropic. ```typescript const message = await client.messages.create({ @@ -443,7 +443,7 @@ await client.messages.create( ## Timeouts -By default requests time out after 10 minutes. However if you have specified a large `max_tokens` value and are *not* streaming, the default timeout will be calculated dynamically using the formula: +By default requests time out after 10 minutes. However, if you have specified a large `max_tokens` value and are *not* streaming, the default timeout will be calculated dynamically using the formula: ```typescript const minimum = 10 * 60; @@ -479,14 +479,14 @@ Note that requests that time out are [retried twice by default](https://platform ## Long requests - Consider using the streaming [Messages API](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#streaming-responses) for longer running requests. + Consider using the [streaming Messages API](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#streaming-responses) for longer-running requests. -Avoid setting a large `max_tokens` value without using streaming. Some networks may drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#timeouts) without receiving a response from Anthropic. +Avoid setting a large `max_tokens` value without using streaming. Some networks might drop idle connections after a certain period of time, which can cause the request to fail or [time out](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#timeouts) without receiving a response from Anthropic. This SDK also throws an error if a non-streaming request is expected to be above roughly 10 minutes long. Passing `stream: true` or [overriding](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#timeouts) the `timeout` option at the client or request level disables this error. -An expected request latency longer than the [timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#timeouts) for a non-streaming request will result in the client terminating the connection and retrying without receiving a response. +An expected request latency longer than the [timeout](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#timeouts) for a non-streaming request will result in the client ending the connection and retrying without receiving a response. When supported by the `fetch` implementation, the SDK sets a [TCP socket keep-alive](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html) option to reduce the impact of idle connection timeouts on some networks. This can be [overridden](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#configuring-proxies) by configuring a custom proxy. @@ -522,11 +522,11 @@ while (page.hasNextPage()) { ## Default headers -The SDK automatically sends the `anthropic-version` header set to `2023-06-01`. +The SDK automatically sends the `anthropic-version` header set to the API version for this major version of the SDK (see [Semantic versioning](https://platform.claude.com/docs/en/cli-sdks-libraries/sdks/typescript#semantic-versioning)). If you need to, you can override it by setting default headers on a per-request basis. -Be aware that doing so may result in incorrect types and other unexpected or undefined behavior in the SDK. +Be aware that doing so might result in incorrect types and other unexpected or undefined behavior in the SDK. ```typescript const client = new Anthropic(); @@ -547,7 +547,7 @@ const message = await client.messages.create( The "raw" `Response` returned by `fetch()` can be accessed through the `.asResponse()` method on the `APIPromise` type that all methods return. This method returns as soon as the headers for a successful response are received and does not consume the response body, so you are free to write custom parsing or streaming logic. -You can also use the `.withResponse()` method to get the raw `Response` along with the parsed data. Unlike `.asResponse()` this method consumes the body, returning once it is parsed. +You can also use the `.withResponse()` method to get the raw `Response` along with the parsed data. Unlike `.asResponse()`, this method consumes the body, returning once it is parsed. ```typescript const client = new Anthropic(); @@ -584,7 +584,7 @@ console.log(message.content); You can configure the log level in two ways: 1. Through the `ANTHROPIC_LOG` environment variable -2. Using the `logLevel` client option (overrides the environment variable if set) +2. Through the `logLevel` client option (overrides the environment variable if set) ```typescript const client = new Anthropic({ @@ -600,13 +600,13 @@ Available log levels, from most to least verbose: * `'error'` - Show only errors * `'off'` - Disable all logging -At the `'debug'` level, all HTTP requests and responses are logged, including headers and bodies. Some authentication-related headers are redacted, but sensitive data in request and response bodies may still be visible. +At the `'debug'` level, all HTTP requests and responses are logged, including headers and bodies. Some authentication-related headers are redacted, but sensitive data in request and response bodies might still be visible. #### Custom logger By default, this library logs to `globalThis.console`. You can also provide a custom logger. Most logging libraries are supported, including [pino](https://www.npmjs.com/package/pino), [winston](https://www.npmjs.com/package/winston), [bunyan](https://www.npmjs.com/package/bunyan), [consola](https://www.npmjs.com/package/consola), [signale](https://www.npmjs.com/package/signale), and [@std/log](https://jsr.io/@std/log). If your logger doesn't work, open an issue. -When providing a custom logger, the `logLevel` option still controls which messages are emitted; messages below the configured level will not be sent to your logger. +When providing a custom logger, the `logLevel` option still controls which messages are emitted; messages below the configured level are not sent to your logger. ```typescript import pino from "pino"; @@ -621,7 +621,7 @@ const client = new Anthropic({ ### Making custom/undocumented requests -This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, params, or response properties, the library can still be used. +This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, parameters, or response properties, the library can still be used. #### Undocumented endpoints @@ -636,7 +636,7 @@ await client.post("/some/path", { #### Undocumented request parameters -To make requests using undocumented parameters, you may use `// @ts-expect-error` on the undocumented parameter. This library doesn't validate at runtime that the request matches the type, so any extra values you send will be sent as-is. +To make requests using undocumented parameters, you can use `// @ts-expect-error` on the undocumented parameter. This library doesn't validate at runtime that the request matches the type, so any extra values you send are sent as-is. ```typescript client.messages.create({ @@ -646,17 +646,17 @@ client.messages.create({ }); ``` -For requests with the `GET` verb, any extra parameters will be in the query; all other requests will send the extra parameter in the body. +For requests with the `GET` verb, any extra parameters are in the query; all other requests send the extra parameter in the body. If you want to explicitly send an extra argument, you can do so with the `query`, `body`, and `headers` request options. #### Undocumented response properties -To access undocumented response properties, you may access the response object with `// @ts-expect-error` on the response object, or cast the response object to the requisite type. Like the request parameters, the SDK does not validate or strip extra properties from the response from the API. +To access undocumented response properties, you can access the response object with `// @ts-expect-error` on the response object, or cast the response object to the requisite type. Like the request parameters, the SDK does not validate or strip extra properties from the response from the API. ### Customizing the fetch client -By default, this library expects a global `fetch` function is defined. +By default, this library requires a global `fetch` function to be defined. If you want to use a different `fetch` function, you can either polyfill the global: @@ -782,10 +782,12 @@ Use `AnthropicBedrockMantle` for new projects; `AnthropicBedrock` remains for ex ## Semantic versioning +Each major version of this SDK sends one API version in the `anthropic-version` header by default, and a new major version comes with each new API version. The first major version that sends `2026-10-21` is 1.0.0; see [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). + This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backward-incompatible changes may be released as minor versions: 1. Changes that only affect static types, without breaking runtime behavior. -2. Changes to library internals which are technically public but not intended or documented for external use. +2. Changes to library internals that are technically public but not intended or documented for external use. 3. Changes that aren't expected to impact the vast majority of users in practice. Backward compatibility is taken seriously to ensure you can rely on a smooth upgrade experience. diff --git a/content/en/docs/claude-code/admin-setup.md b/content/en/docs/claude-code/admin-setup.md index d3409c1b11..124fc0f498 100644 --- a/content/en/docs/claude-code/admin-setup.md +++ b/content/en/docs/claude-code/admin-setup.md @@ -91,7 +91,7 @@ Managed settings can lock down tools, sandbox execution, restrict MCP servers an | [Permission lockdown](/docs/en/permissions#managed-only-settings) | Make managed settings the [only settings source of permission rules](/docs/en/settings-reference#allowmanagedpermissionrulesonly). Disable `--dangerously-skip-permissions` | `allowManagedPermissionRulesOnly`, `permissions.disableBypassPermissionsMode` | | [Starting permission mode](/docs/en/permission-modes#which-mode-a-session-starts-in) | Choose the permission mode your developers' terminal sessions start in instead of the built-in starting permission mode, or remove auto mode. [Switch permission modes](/docs/en/permission-modes#switch-permission-modes) lists when the VS Code extension reads a `defaultMode` you set | `permissions.defaultMode`, `permissions.disableAutoMode` | | [Sandboxing](/docs/en/sandboxing) | OS-level filesystem and network isolation with domain allowlists | `sandbox.enabled`, `sandbox.network.allowedDomains` | -| [Managed policy CLAUDE.md](/docs/en/memory#deploy-organization-wide-claude-md) | Org-wide instructions loaded in every session, can't be excluded | File at the managed policy path | +| [Managed policy CLAUDE.md](/docs/en/memory#deploy-organization-wide-claude-md) | Organization-wide behavioral guidance for Claude rather than a client-enforced rule | File at the managed policy path | | [MCP server control](/docs/en/managed-mcp) | Restrict which MCP servers users can add or connect to, deploy a fixed set, or provide remote servers to every user alongside their own | `allowedMcpServers`, `deniedMcpServers`, `allowManagedMcpServersOnly`, `managedMcpServers`, or a deployed `managed-mcp.json` file | | [Plugin marketplace control](/docs/en/plugins/org#restrict-what-users-can-install) | Restrict which marketplace sources users can add and install from, reject the CLI flags that sideload plugins, agents, and MCP servers for a single run, block [`command` plugin sources](/docs/en/plugins/marketplace-reference#command-plugin-source), and allowlist which marketplaces' plugins can be suggested | `strictKnownMarketplaces`, `blockedMarketplaces`, `disableSideloadFlags`, `disableCommandPluginSources`, `pluginSuggestionMarketplaces` | | [Customization lockdown](/docs/en/settings-reference#strictpluginonlycustomization) | Block skills, agents, hooks, and MCP servers from user and project sources, so they can only come from plugins or managed settings. Locking skills also stops the [skills your developers enable on claude.ai](/docs/en/skills#where-synced-skills-load) from syncing | `strictPluginOnlyCustomization` | diff --git a/content/en/docs/claude-code/agent-sdk/typescript.md b/content/en/docs/claude-code/agent-sdk/typescript.md index 7c0976d930..ff4fca4962 100644 --- a/content/en/docs/claude-code/agent-sdk/typescript.md +++ b/content/en/docs/claude-code/agent-sdk/typescript.md @@ -1003,6 +1003,26 @@ Read token attribution from the collection fields: Claude Code leaves the optional `deferredBuiltinTools`, `systemTools`, and `systemPromptSections` diagnostics unset, so expect them to be absent even though the type declares them. +#### Find a row by ID, a server's instruction tokens, or an entry's plugin and file + +MCP server instructions are the usage notes that connected servers supply and Claude Code adds to context, and the `mcp_instructions` row of `categories` counts their tokens. Use these [`getContextUsage()`](#query-object) fields to pick out one `categories` row by `id`, split the `mcp_instructions` tokens by server, or find the plugin and file behind an agent or skill entry: + +| Field | Found on | What it holds | +| :- | :- | :- | +| `id` | Each `categories` row | The row's identifier, one of the values the [response type](#sdkcontrolgetcontextusageresponse) lists, such as `mcp_instructions`. Match on `id` to pick out one row, or on `kind` to group rows. A later Claude Code version can send a value your installed types don't list, so treat an `id` you don't recognize as absent | +| `mcpInstructions` | The response | One `{ serverName, tokens }` entry per connected MCP server that supplies instructions, or an empty array when none does. The `tokens` values are estimates that add up to the `mcp_instructions` row's `tokens`. `serverName` is the `name` that [`mcpServerStatus()`](#query-object) reports for that server | +| `pluginId` | `agents` and `skills.skillFrontmatter` entries | Names the plugin the entry comes from, as an ID in the form `name@marketplace`, and is absent for an entry that doesn't come from a plugin. When the plugin didn't come from a marketplace, the part after `@` names [its origin](/docs/en/plugins/loading#find-where-a-plugin-came-from) instead, such as `inline` for one you loaded through the [`plugins`](#options) option | +| `path` | `agents` and `skills.skillFrontmatter` entries | Absolute path of the file that defines the agent or skill, on the machine where Claude Code runs. The field is absent when no file defines the entry, for example an agent from the [`agents`](#options) option or a skill built into Claude Code | + +As an example of matching on `id`, this sample finds the `mcp_instructions` row: + +```typescript theme={null} +// q is the Query object that query() returned +const usage = await q.getContextUsage(); +// undefined if no connected server supplies instructions +const row = usage.categories.find((c) => c.id === "mcp_instructions"); +``` + ### `SDKControlReadFileResponse` Return type of [`readFile()`](#query-object). @@ -5233,6 +5253,7 @@ When you call `setMcpServers()`, Claude Code applies these rules: * **Servers the call doesn't name**: outside a [cloud session](/docs/en/claude-code-on-the-web), Claude Code disconnects the servers an earlier `setMcpServers()` call added and the in-process SDK servers, and lists them in `removed`. Other servers keep running and aren't listed in `removed`, among them the stdio, HTTP, and SSE servers from the [`mcpServers`](#options) option, servers from settings files, and plugin-provided servers. * **Servers the call names**: Claude Code replaces a stdio, HTTP, or SSE server that an earlier `setMcpServers()` call added only when its config differs from the one you passed. An in-process SDK server already registered under that name stays as it is, so to swap one, leave it out of one call and add it in the next. * **Built-in servers the CLI started at startup**: if the call names one, Claude Code drops that entry and reports it in `errors`. +* **Stdio, HTTP, or SSE servers that share a name with one from an MCP installation scope such as `.mcp.json`**: under that name the session uses your server's tools rather than the [installation-scope server's](/docs/en/mcp#mcp-installation-scopes). Before Claude Code v2.1.305, Claude Code could disconnect your server and connect the installation-scope server when your app [reloaded plugins](#query-object). The promise resolves after newly added stdio, HTTP, and SSE servers connect or fail, so tools from servers that connected are available on the next turn. diff --git a/content/en/docs/claude-code/agent-teams.md b/content/en/docs/claude-code/agent-teams.md index 347ad6bf9d..3e3d6c157a 100644 --- a/content/en/docs/claude-code/agent-teams.md +++ b/content/en/docs/claude-code/agent-teams.md @@ -166,7 +166,9 @@ For complex or risky tasks, you can have teammates plan before implementing. A t Spawn an architect teammate to refactor the authentication module. ``` -When a teammate finishes planning, it sends a plan approval request to the lead. Claude Code approves the plan in the lead's session as soon as the request arrives, without the lead reviewing it. The teammate's edits and commands still go through the permission prompts described in [Permissions](#permissions). Once approved, the teammate exits plan mode and begins implementation. +When that teammate finishes planning, it sends a plan approval request to the lead. If you haven't changed that teammate's permission mode since it was spawned, Claude Code approves the plan as soon as the request arrives, without the lead reviewing it. The teammate's edits and commands still go through the permission prompts described in [Permissions](#permissions). Once approved, the teammate exits plan mode and begins implementation. + +If you put a running in-process teammate in plan mode by pressing [`Shift+Tab`](/docs/en/permission-modes#switch-permission-modes) while viewing its session, the lead reviews that run's plan instead of Claude Code approving it. You aren't asked to approve it; the lead approves it or sends it back for revision. ### Talk to teammates directly @@ -286,7 +288,7 @@ For a teammate it brings back, Claude Code re-applies a definition that came fro Teammates start with the lead's permission mode, except [`dontAsk` mode](/docs/en/permission-modes#allow-only-pre-approved-tools-with-dontask-mode), which they don't inherit. If the lead runs with `--dangerously-skip-permissions`, all teammates do too. After spawning, you can change an individual teammate's permission mode, but you can't set per-teammate permission modes at spawn time. -Teammate permission prompts appear in the lead session, so approve them there yourself. [Plan approval](#have-teammates-plan-before-implementing) is the designed exception: the lead session grants teammate plan approvals without a separate prompt to you. +Teammate permission prompts appear in the lead session, so approve them there yourself. You don't need to approve [a teammate's plan](#have-teammates-plan-before-implementing). #### Messages between agents diff --git a/content/en/docs/claude-code/artifacts.md b/content/en/docs/claude-code/artifacts.md index 7ddbb64fb7..664eae6f31 100644 --- a/content/en/docs/claude-code/artifacts.md +++ b/content/en/docs/claude-code/artifacts.md @@ -113,6 +113,16 @@ Who you can share with depends on your plan: * **Within your organization**: on Team and Enterprise plans, grant access to specific people in your organization, or to everyone in it. Viewers sign in to claude.ai as members of your organization to see the page. * **Publicly**: share a link that anyone on the internet can open, with no claude.ai sign-in required. On Team and Enterprise plans, public sharing is off until an Owner [enables it for the organization](#control-public-sharing). +### Link to a specific view + +If a page has several views, such as tabs or sections, you can link to one of them directly. Ask Claude for the links: + +```text wrap theme={null} +Give me a link to each tab of the deploy failures dashboard. +``` + +Each link is the artifact's link with an anchor on the end, such as `#overview`. + ### Let someone edit with you People you share with are viewers by default: they see each version you publish but can't change the page. On Team and Enterprise plans, you can also make someone an editor. In the share dialog, add a person and switch their role from **viewer** to **editor**. diff --git a/content/en/docs/claude-code/claude-code-on-the-web.md b/content/en/docs/claude-code/claude-code-on-the-web.md index 2a9ad59c9a..bee4357834 100644 --- a/content/en/docs/claude-code/claude-code-on-the-web.md +++ b/content/en/docs/claude-code/claude-code-on-the-web.md @@ -8,7 +8,7 @@ > [!NOTE] > -> Cloud sessions are available on Pro, Max, and Team plans, and for Enterprise users with premium seats or Chat + Claude Code seats. +> Cloud sessions are available on Pro, Max, and Team plans, and for Enterprise users with premium seats or Chat + Claude Code seats. If your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), you also need a role that includes the cloud sessions permission. Ask an Owner to check your roles and add it at [**Organization settings > Roles**](https://claude.ai/admin-settings/roles) if it's missing. A cloud session is a Claude Code session that runs on cloud infrastructure instead of on your machine. By default it runs on infrastructure Anthropic manages, or on your organization's [self-hosted environment](/docs/en/self-hosted-environments) when routed there. The session keeps running after you close your laptop, and you can check on it or steer it from any device. It counts toward your plan's usage limits alongside the rest of your Claude and Claude Code usage, and there's no separate charge for the cloud VM. @@ -428,7 +428,10 @@ Cloud sessions stop after a period of inactivity and the session's VM is reclaim Reopen the session from [claude.ai/code](https://claude.ai/code) to provision a fresh VM: * **Restored**: your conversation history -* **Not restored**: background work that was still running when the VM was reclaimed, such as subagents and shell commands, and the pending wakeup of a [self-paced `/loop`](/docs/en/scheduled-tasks#let-claude-choose-the-interval). To restart the loop, run `/loop` again. +* **Not restored**: background work that was still running or pending when the VM was reclaimed, including: + * **Shell commands**: Claude Code tells Claude which commands stopped. Ask Claude to rerun the ones you still need. + * **Subagents**: Claude Code tells Claude which subagents stopped, and which of those can be [resumed](/docs/en/sub-agents#resume-subagents) instead of started over. Ask Claude to continue their work. + * **Session-scoped scheduled tasks**: tasks you [scheduled in the session](/docs/en/scheduled-tasks) and a `/loop` waiting for its next iteration don't carry over to the reopened session. Ask Claude to schedule the tasks again, or run `/loop` again to restart the loop. ## Limitations diff --git a/content/en/docs/claude-code/claude-directory.md b/content/en/docs/claude-code/claude-directory.md index 85f569e480..ff98038204 100644 --- a/content/en/docs/claude-code/claude-directory.md +++ b/content/en/docs/claude-code/claude-directory.md @@ -175,7 +175,7 @@ Apart from the rows that say otherwise, the retention cleanup sweep doesn't remo | Path under `~/.claude/` | Contents | | - | - | -| `history.jsonl` | Every prompt you've typed, with timestamp and project path. Used for up-arrow recall, `Ctrl+R` history search, and `!` shell-command completion. Each sweep removes the entries older than `cleanupPeriodDays` when the [HIPAA configuration applies to your sessions](/docs/en/hipaa-setup#check-how-developers-sign-in-and-connect). | +| `history.jsonl` | Prompts you've typed, with timestamp and project path. Used for up-arrow recall, `Ctrl+R` history search, and `!` shell-command completion. Each sweep removes the entries older than `cleanupPeriodDays` when the [HIPAA configuration applies to your sessions](/docs/en/hipaa-setup#check-how-developers-sign-in-and-connect). | | `stats-cache.json` | Aggregated token and cost counts shown by `/usage` | | `remote-settings.json` | Cached copy of [server-managed settings](/docs/en/server-managed-settings) for your organization, or `{}` when your organization has configured none. Only present when the session [fetches them](/docs/en/server-managed-settings#platform-availability). Claude Code checks for updates at startup and hourly during a session. Claude Code deletes it when you log out. | | `cache/changelog.md` | Cached copy of the Claude Code changelog, shown by `/release-notes`. Refreshed in the background. | diff --git a/content/en/docs/claude-code/claude-security.md b/content/en/docs/claude-code/claude-security.md index b50125feb1..adc7d018c4 100644 --- a/content/en/docs/claude-code/claude-security.md +++ b/content/en/docs/claude-code/claude-security.md @@ -8,7 +8,7 @@ The Claude Security plugin runs a multi-agent vulnerability scan of your codebase inside a Claude Code session. A team of Claude agents maps your architecture, builds a threat model, hunts for vulnerabilities, and independently reviews every finding before writing the report. Use the plugin to scan a whole repository or [only a set of changes](#scan-only-your-changes), such as a branch's diff, a pull request's diff, or a single commit, then turn the findings you choose into patches that you review and apply yourself. -The plugin runs locally in your session, uses [whichever models you have access to in Claude Code](#models-and-providers), and each scan counts toward your [usage](/docs/en/costs). If you want a managed service that monitors your repositories, or want to run scans on [Claude Mythos](https://platform.claude.com/docs/en/about-claude/models/introducing-claude-fable-5-and-claude-mythos-5), see the [Claude Security](https://claude.com/product/claude-security) product, available on the Enterprise plan. The plugin reaches code the managed product can't reach, such as repositories hosted on GitLab or Bitbucket, or on networks that don't allow inbound connections. +The plugin runs locally in your session, uses [whichever models you have access to in Claude Code](#models-and-providers), and each scan counts toward your [usage](/docs/en/costs). If you want a managed service that monitors your repositories, or want to run scans on [Claude Mythos](https://platform.claude.com/docs/en/about-claude/models/introducing-claude-fable-5-and-claude-mythos-5), see the [Claude Security](https://claude.com/product/claude-security) product, available on the Enterprise plan. The plugin is also distinct from the review tools already in Claude Code: the [security guidance plugin](/docs/en/security-guidance) reviews code as Claude writes it, [`/security-review`](/docs/en/commands#all-commands) runs a single pass over your branch, and [Code Review](/docs/en/code-review) reviews pull requests. For how the layers stack, see [How the plugin fits with other security tools](#how-the-plugin-fits-with-other-security-tools). diff --git a/content/en/docs/claude-code/cloud-environments.md b/content/en/docs/claude-code/cloud-environments.md index ee1c692f04..e08414f206 100644 --- a/content/en/docs/claude-code/cloud-environments.md +++ b/content/en/docs/claude-code/cloud-environments.md @@ -164,7 +164,7 @@ A [self-hosted environment](/docs/en/self-hosted-environments) ID, which has the ### Archive an environment -To archive one of your own environments, open it for editing, select **Archive environment**, and confirm. If the environment is [shared with your organization](#organization-shared-environments), an Owner archives it from the **Cloud environments** page in [admin settings](https://claude.ai/admin-settings) instead, so ask an Owner unless you are one. You can't delete an environment, only archive it. +To archive one of your own environments, open it for editing, then select **Archive environment** and confirm. If the environment is [shared with your organization](#organization-shared-environments), an Owner archives it from the **Cloud environments** page in [admin settings](https://claude.ai/admin-settings) instead, so ask an Owner unless you are one. Archiving affects new sessions, not running ones: @@ -175,6 +175,8 @@ Archiving affects new sessions, not running ones: * **Saved CLI default**: if the environment was your saved [CLI default](#select-an-environment-from-the-cli), Claude Code starts CLI cloud sessions in the Anthropic-hosted environment when your list has one. Otherwise, it starts them in the first environment in your list that isn't a [Remote Control bridge environment](#the-default-environment). * **Configured explicitly**: anything configured with the environment explicitly, such as a [cloud scheduled task](/docs/en/routines#environments-and-network-access), can't start new sessions in it. Point it at another environment. +When you no longer need an Anthropic-hosted environment, archive it. Neither the environment dialog nor the **Cloud environments** admin page has an option to delete an Anthropic-hosted environment. If the environment is [self-hosted](/docs/en/self-hosted-environments), an Owner can delete it from the **Cloud environments** page in admin settings. If you aren't an Owner, ask one to delete it. + ### Organization-shared environments On Team and Enterprise plans, an Owner can create cloud environments that are shared with every member of the organization. The same role manages everything else on the **Cloud environments** admin page, including [self-hosted environments](/docs/en/self-hosted-environments); the Admin role can't open the page. The full list of roles that can open it is the one for [managing server-managed settings](/docs/en/server-managed-settings#access-control). diff --git a/content/en/docs/claude-code/desktop-changelog.md b/content/en/docs/claude-code/desktop-changelog.md index 6e48bcae99..ef3c7f512d 100644 --- a/content/en/docs/claude-code/desktop-changelog.md +++ b/content/en/docs/claude-code/desktop-changelog.md @@ -469,10 +469,9 @@ Through this surface, Claude sees only the sessions the desktop app runs itself: When Claude messages another session through this surface, Claude Code shows it there as a card labeled with the sending session's title and a link back, so you can always tell where a message came from. If the receiving session is mid-task, Claude Code holds the message and Claude reads it once the current work finishes. The receiving Claude can reply, and Claude Code delivers the reply back through this surface. Claude can't deliver to an archived session, and tells you when a message doesn't go through. -Claude Code applies four safety behaviors across sessions: +Claude Code applies three safety behaviors across sessions: * You get an approval card before Claude archives a session, except in Auto mode and Bypass permissions mode, where Claude can archive a session without one. To be asked, switch to Manual. -* Through this surface, Claude can't send cross-session messages from a session nobody is watching, such as a scheduled-task run, and can't deliver messages into one. * Claude Code checks each message from this surface against the receiving session's [inbound controls](/docs/en/cross-session-messaging#control-inbound-messages), even when the receiving session doesn't have [cross-session messaging](/docs/en/cross-session-messaging#availability) itself. If you set [`crossSessionInbound`](/docs/en/settings-reference#crosssessioninbound) to `refuse` in the receiving session, Claude Code drops messages from this surface. Claude Code reports the refusal to the Claude desktop app. Before v2.1.234, Claude Code dropped every message from this surface to a receiving session without cross-session messaging. * Claude Code quotes each incoming message and attributes it to the session that sent it, and Claude still follows the receiving session's own permission settings when acting on one. diff --git a/content/en/docs/claude-code/desktop-quickstart.md b/content/en/docs/claude-code/desktop-quickstart.md index f618357694..78768e52a4 100644 --- a/content/en/docs/claude-code/desktop-quickstart.md +++ b/content/en/docs/claude-code/desktop-quickstart.md @@ -87,13 +87,13 @@ A [session](/docs/en/desktop#work-in-parallel-with-sessions) is a conversation w Check your [permission mode](/docs/en/desktop#choose-a-permission-mode) in the row under the prompt box to see whether Claude waits for your approval: -* **Auto or Accept edits**: Claude applies its file changes, and an indicator such as `+12 -1` appears so you can review them in the diff view +* **Auto or Accept edits**: Claude applies its file changes, and an indicator such as `+12 -1` appears so you can review them in the [diff view](/docs/en/desktop#review-changes-with-diff-view) * **Manual**: Claude proposes each change and waits for your approval before applying it In Manual mode, you'll see: -1. A [diff view](/docs/en/desktop#review-changes-with-diff-view) showing exactly what will change in each file -2. Accept/Reject buttons to approve or decline each change +1. A diff showing exactly what will change +2. Buttons to approve or decline each change 3. Real-time updates as Claude works through your request ## Now what? diff --git a/content/en/docs/claude-code/desktop.md b/content/en/docs/claude-code/desktop.md index 6e48bcae99..ef3c7f512d 100644 --- a/content/en/docs/claude-code/desktop.md +++ b/content/en/docs/claude-code/desktop.md @@ -469,10 +469,9 @@ Through this surface, Claude sees only the sessions the desktop app runs itself: When Claude messages another session through this surface, Claude Code shows it there as a card labeled with the sending session's title and a link back, so you can always tell where a message came from. If the receiving session is mid-task, Claude Code holds the message and Claude reads it once the current work finishes. The receiving Claude can reply, and Claude Code delivers the reply back through this surface. Claude can't deliver to an archived session, and tells you when a message doesn't go through. -Claude Code applies four safety behaviors across sessions: +Claude Code applies three safety behaviors across sessions: * You get an approval card before Claude archives a session, except in Auto mode and Bypass permissions mode, where Claude can archive a session without one. To be asked, switch to Manual. -* Through this surface, Claude can't send cross-session messages from a session nobody is watching, such as a scheduled-task run, and can't deliver messages into one. * Claude Code checks each message from this surface against the receiving session's [inbound controls](/docs/en/cross-session-messaging#control-inbound-messages), even when the receiving session doesn't have [cross-session messaging](/docs/en/cross-session-messaging#availability) itself. If you set [`crossSessionInbound`](/docs/en/settings-reference#crosssessioninbound) to `refuse` in the receiving session, Claude Code drops messages from this surface. Claude Code reports the refusal to the Claude desktop app. Before v2.1.234, Claude Code dropped every message from this surface to a receiving session without cross-session messaging. * Claude Code quotes each incoming message and attributes it to the session that sent it, and Claude still follows the receiving session's own permission settings when acting on one. diff --git a/content/en/docs/claude-code/env-vars.md b/content/en/docs/claude-code/env-vars.md index 4123849a0a..2eac4dfb7d 100644 --- a/content/en/docs/claude-code/env-vars.md +++ b/content/en/docs/claude-code/env-vars.md @@ -405,7 +405,7 @@ Numeric variables such as timeouts, token budgets, and retry counts accept scien | `CLAUDE_CODE_TMUX_TRUECOLOR` | Set to any non-empty value, such as `1`, to allow 24-bit truecolor output inside tmux. **Setting it to `0` or `false` still allows truecolor**, unlike most on/off variables; unset the variable to restore the 256-color clamp. By default, Claude Code clamps to 256 colors when `$TMUX` is set because tmux does not pass through truecolor escape sequences unless configured to. Set this after adding `set -ga terminal-overrides ',*:Tc'` to your `~/.tmux.conf`. See [Terminal configuration](/docs/en/terminal-config) for other tmux settings | | `CLAUDE_CODE_TOOL_MEMORY_CGROUP_EXCLUDE` | On Linux and WSL, set to a comma-separated list of the kinds of processes Claude Code [excludes from the tool memory cap](/docs/en/tools-reference#memory-limit-on-linux-and-wsl), such as `mcp` or `lsp`. Set `none` to cap every kind, or `all-new` to cap only Bash, PowerShell, and Monitor tool commands. Claude Code keeps Bash, PowerShell, and Monitor tool commands under the cap whatever you list. Requires Claude Code v2.1.246 or later | | `CLAUDE_CODE_TOOL_MEMORY_LIMIT` | On Linux and WSL, set to a size such as `4G` to [cap the memory that Bash and PowerShell tool commands can use](/docs/en/tools-reference#memory-limit-on-linux-and-wsl), and Monitor tool commands on v2.1.246 or later. Write the size in plain digits, alone for a number of bytes or with a `K`, `M`, `G`, or `T` suffix. Set `0` or `off` to turn the cap off. Once the first process Claude Code starts has turned the cap on or off, a changed value takes effect the next time you launch `claude`. Requires Claude Code v2.1.233 or later | -| `CLAUDE_CODE_TRANSCRIPT_LOCAL_GC` | Set to `1` to limit how large the [transcript file](/docs/en/sessions#where-transcripts-are-stored) of a long `-p` or Agent SDK session grows. After each compaction, once the file is larger than 5 MB, Claude Code removes the history from before that compaction. Resuming the session restores the same conversation whether or not the file was trimmed. Set it in the environment you start Claude Code from, since a settings `env` block can't turn it on. Requires Claude Code v2.1.287 or later | +| `CLAUDE_CODE_TRANSCRIPT_LOCAL_GC` | Set to `1` to limit how large the [transcript file](/docs/en/sessions#where-transcripts-are-stored) of a long `-p` or Agent SDK session grows. After each compaction, once the file is larger than 5 MB, Claude Code removes the history from before that compaction. On v2.1.296 or later, the file stays as it is when removing that history would shrink it by less than 10%. Resuming the session restores the same conversation whether or not the file was trimmed. Set it in the environment you start Claude Code from, since a settings `env` block can't turn it on. Requires Claude Code v2.1.287 or later | | `CLAUDE_CODE_USER_DIALOG_TIMEOUT_MS` | Deadline in milliseconds before Claude Code cancels a dialog it forwards to a remote client such as a [Remote Control](/docs/en/remote-control) or SDK host, or the approval dialog for a [held cross-session message](/docs/en/cross-session-messaging#control-inbound-messages); permission prompts and `AskUserQuestion` questions use their own flows and aren't governed by it. On Claude Code v2.1.236 or later, it also bounds the mid-session [Fable usage-credits consent prompt](/docs/en/model-config#fable-and-usage-credits) in a session that may be running unattended. [Control inbound messages](/docs/en/cross-session-messaging#control-inbound-messages) and [non-interactive sessions](/docs/en/cross-session-messaging#non-interactive-sessions) cover the full held-message expiry rules, including the cases where the deadline doesn't apply. Overrides the [`dialogExpiry`](/docs/en/settings-reference#dialogexpiry) setting. `0` or a negative value disables the deadline. Ignored in [project and local settings](/docs/en/settings-reference#variables-claude-code-ignores-in-env) | | `CLAUDE_CODE_USE_ANTHROPIC_AWS` | Use [Claude Platform on AWS](/docs/en/claude-platform-on-aws) | | `CLAUDE_CODE_USE_BEDROCK` | Use [Amazon Bedrock](/docs/en/amazon-bedrock) | diff --git a/content/en/docs/claude-code/large-codebases.md b/content/en/docs/claude-code/large-codebases.md index 770fd77b37..7d999cacec 100644 --- a/content/en/docs/claude-code/large-codebases.md +++ b/content/en/docs/claude-code/large-codebases.md @@ -141,7 +141,7 @@ These patterns cover other common cases: * `"**/packages/legacy-*/**"`: excludes every package whose name matches the glob, including rules * `"/home/user/monorepo/legacy/CLAUDE.md"`: excludes one specific file by absolute path -Managed policy CLAUDE.md files cannot be excluded, so organization-wide instructions always apply. You can set `claudeMdExcludes` at any [settings scope](/docs/en/settings#where-settings-live): user, project, local, or managed. Arrays merge across scopes, so a team can set project-level defaults while individuals add local overrides. +You can set `claudeMdExcludes` at any [settings scope](/docs/en/settings#where-settings-live): user, project, local, or managed. Arrays merge across scopes, so a team can set project-level defaults while individuals add local overrides. If your organization deploys a [managed CLAUDE.md file](/docs/en/memory#deploy-organization-wide-claude-md), a pattern that matches it doesn't skip it, whichever scope sets the pattern. For the full exclusion documentation, see [Exclude specific CLAUDE.md files](/docs/en/memory#exclude-specific-claude-md-files). diff --git a/content/en/docs/claude-code/memory.md b/content/en/docs/claude-code/memory.md index 7be98878b3..39d9b96699 100644 --- a/content/en/docs/claude-code/memory.md +++ b/content/en/docs/claude-code/memory.md @@ -279,7 +279,7 @@ For organizations deploying Claude Code across teams, you can centralize instruc #### Deploy organization-wide CLAUDE.md -Organizations can deploy a centrally managed CLAUDE.md that applies to all users on a machine. This file cannot be excluded by individual settings. +Organizations can deploy a centrally managed CLAUDE.md that applies to all users on a machine. Developers can [exclude other CLAUDE.md files](#exclude-specific-claude-md-files) with the `claudeMdExcludes` setting, but not this one. If a developer starts a session with CLAUDE.md loading turned off altogether, that session doesn't load the managed content either. Use the file for guidance, and enforce rules with [managed settings](/docs/en/managed-settings) such as `permissions.deny`. **1. Create the file at the managed policy location** @@ -293,7 +293,7 @@ Use MDM, Group Policy, Ansible, or similar tools to distribute the file across d The `claudeMd` key lets you put managed CLAUDE.md content directly inside `managed-settings.json` instead of deploying a separate file. -**Scope**: every Claude Code session on the machine, in every repository. For repository-specific guidance, commit a project CLAUDE.md instead. +**Scope**: all users on the machine, in any repository. For repository-specific guidance, commit a project CLAUDE.md instead. **Precedence**: same as a managed CLAUDE.md file. Loads before user and project CLAUDE.md. @@ -323,7 +323,7 @@ Settings rules are enforced by the client regardless of what Claude decides to d #### Exclude specific CLAUDE.md files -In large monorepos, ancestor CLAUDE.md files may contain instructions that aren't relevant to your work. The `claudeMdExcludes` setting lets you skip specific files by path or glob pattern. +In large monorepos, ancestor CLAUDE.md files may contain instructions that aren't relevant to your work. The `claudeMdExcludes` setting lets you skip specific files by path or glob pattern. You can't exclude a [managed CLAUDE.md file](#deploy-organization-wide-claude-md) with `claudeMdExcludes`. This example excludes a top-level CLAUDE.md and a rules directory from a parent folder. Add it to `.claude/settings.local.json` so the exclusion stays local to your machine: @@ -340,8 +340,6 @@ Patterns are matched against absolute file paths using glob syntax. You can conf To exclude a rules file you reach through a [symlink](#share-rules-across-projects-with-symlinks), whether the file or its directory is the link, write the pattern against either path: the file's path under `.claude/rules/` or its link target. A pattern that matches either path excludes the file. Before v2.1.239, only a pattern that matched the link target excluded the file. -Managed policy CLAUDE.md files cannot be excluded. This ensures organization-wide instructions always apply regardless of individual settings. - ## AGENTS.md Claude Code can read [`AGENTS.md`](/docs/en/glossary#agents-md) as your project instructions, so a repository already set up for other coding agents works without adding a `CLAUDE.md`, an import, or a setting. This table shows what Claude reads by default for each combination of instruction files in your repository: diff --git a/content/en/docs/claude-code/plugins/troubleshooting.md b/content/en/docs/claude-code/plugins/troubleshooting.md index 28447688c7..b3550908e1 100644 --- a/content/en/docs/claude-code/plugins/troubleshooting.md +++ b/content/en/docs/claude-code/plugins/troubleshooting.md @@ -949,6 +949,10 @@ The **Errors** tab shows `commands path not found: ` with the gui Claude Code resolved a path from your `plugin.json` or marketplace entry against the plugin root and found nothing there. The path in the message is the absolute path it checked, so compare it with what's on disk. Fix the path or create the directory, then run `/reload-plugins`. +> [!NOTE] +> +> Before v2.1.299, this message could appear at startup on a row labeled with a tag such as `synced[0]`. That row is for a plugin [synced from claude.ai](/docs/en/plugins/loading#synced-plugins). It appeared when another Claude Code session on your machine had updated the plugin moments before and moved its files. To load the plugin, restart Claude Code. To keep the message from appearing for this reason, update to v2.1.299 or later. + Paths in the manifest are relative to the plugin root and start with `./`. A path that resolves outside the plugin root is reported as ` path escapes plugin directory` instead and is dropped. ### `--plugin-dir` at a marketplace root doesn't load the plugins under `plugins/` diff --git a/content/en/docs/claude-code/prompt-caching.md b/content/en/docs/claude-code/prompt-caching.md index ca774ffc7a..8f348ddc1c 100644 --- a/content/en/docs/claude-code/prompt-caching.md +++ b/content/en/docs/claude-code/prompt-caching.md @@ -171,11 +171,14 @@ Only a deny rule that matches in the tool-name position blocks a tool this way: ### Compacting the conversation -[Compaction](/docs/en/context-window#what-survives-compaction) replaces your message history with a summary. By design, this invalidates the conversation layer, since the next request has a new, shorter history that doesn't share a prefix with the old one. Claude Code reuses the system prompt layer unless the conversation was [resumed while keeping a system prompt that would otherwise have changed](#resuming-a-session); in that case the first compaction switches to the current prompt and that layer rebuilds once. It reloads project context from disk, which cache-hits only if CLAUDE.md and memory are unchanged since the session started. +[Compaction](/docs/en/context-window#what-survives-compaction) replaces your message history with a summary. By design, this invalidates the conversation layer: the next request has a new, shorter history that doesn't share a prefix with the old one. The system prompt and project context layers can stay cached: -To produce the summary, Claude Code sends a separate request with the same system prompt, tools, and history as your conversation, plus a summarization instruction appended as a final user message. While the cache is warm, that request reads your prefix from the cache, so a mid-session `/compact` costs a fraction of what the context size suggests and spends most of its time generating the summary. +* **System prompt**: the next request reads this layer from the cache, unless a [resumed conversation](#resuming-a-session) kept a system prompt that is now out of date. The first time that conversation is compacted, Claude Code switches it to the current prompt, and the next request rebuilds this layer's cache once. +* **Project context**: Claude Code reloads this layer from disk. The next request reads it from the cache only if CLAUDE.md and memory are unchanged since the session started. -After a break longer than the [cache lifetime](#cache-lifetime), there is no cache left to read, so the summarization request reprocesses the full history as uncached input. This is why `/compact` costs the most when you [resume an old session](/docs/en/sessions#resume-a-session). In both the warm and cold cases, the turn after compaction rebuilds the conversation cache for only the much shorter summary, so that turn is not the slow part. +To produce the summary, Claude Code sends a separate request. The request repeats your conversation's system prompt, tools, and the history being summarized. It ends with a summarization instruction. While the cache is warm, that request reads your prefix from the cache. A mid-session `/compact` then costs a fraction of what the context size suggests and spends most of its time generating the summary. + +After a break longer than the [cache lifetime](#cache-lifetime), there is no cache left to read, so the summarization request reprocesses that history as uncached input. This is why `/compact` costs the most when you [resume an old session](/docs/en/sessions#resume-a-session). In both the warm and cold cases, the turn after compaction rebuilds the conversation cache for only the much shorter summary, so that turn isn't the slow part. > [!TIP] > diff --git a/content/en/docs/claude-code/remote-control.md b/content/en/docs/claude-code/remote-control.md index 6a25e4920b..870f905183 100644 --- a/content/en/docs/claude-code/remote-control.md +++ b/content/en/docs/claude-code/remote-control.md @@ -26,6 +26,7 @@ Unlike [cloud sessions](/docs/en/claude-code-on-the-web), which run on cloud inf Before using Remote Control, confirm that your environment meets these conditions: * **Subscription**: available on Pro, Max, Team, and Enterprise plans. API keys are not supported. On Team and Enterprise, an Owner must first enable the Remote Control toggle in [Claude Code admin settings](https://claude.ai/admin-settings/claude-code). +* **Custom roles**: if your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), your roles must give you both the cloud sessions permission and the **Claude Code remote control** permission. If either is missing, starting Remote Control shows [`Remote Control is disabled by your organization's policy`](#remote-control-is-disabled-by-your-organizations-policy). Ask an Owner to check your roles and add what's missing at [**Organization settings > Roles**](https://claude.ai/admin-settings/roles). * **Authentication**: run `claude` and use `/login` to sign in through claude.ai if you haven't already. Without an eligible login, `claude remote-control` exits with an error, while `claude --remote-control` still starts an interactive session and shows a Remote Control failure notification shortly after launch. * **API endpoint**: not available in any of these configurations: * You use Amazon Bedrock, Google Cloud's Agent Platform, or Microsoft Foundry. @@ -33,7 +34,7 @@ Before using Remote Control, confirm that your environment meets these condition * You sign in through an enterprise [Claude apps gateway](/docs/en/claude-apps-gateway). * **Feature-flag evaluation**: if you set an [environment variable that turns off feature-flag evaluation](/docs/en/env-vars#features-that-need-feature-flag-fetching), whether Remote Control is available depends on which one: * If you set `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` or `DISABLE_GROWTHBOOK`, Remote Control is unavailable. Unset the variable wherever it's set, in your shell environment or in the `env` block of a [`settings.json` file](/docs/en/settings-reference#all-settings), to use Remote Control. - * If you set only `DISABLE_TELEMETRY` or `DO_NOT_TRACK`, Remote Control stays available unless your organization requires [Trusted Devices](#trusted-devices). If it does, unset the variable to use Remote Control. Using Remote Control with either variable set requires Claude Code v2.1.283 or later. + * If you set only `DISABLE_TELEMETRY` or `DO_NOT_TRACK`, Remote Control stays available unless your organization requires [Trusted Devices](#trusted-devices). If it does, unset the variable to use Remote Control. Using Remote Control with either variable set requires Claude Code v2.1.283 or later, or v2.1.304 or later in the Claude Desktop app. * **Workspace trust**: in a directory you haven't trusted yet, `claude remote-control` prints what trusting it turns on and asks `Trust ? [y/N]` before it starts. Answering `y` saves the choice, except in your home directory, where trust is never saved and the question returns on every run. When its standard input or output isn't a terminal, the command can't ask and exits with a [`Workspace not trusted`](/docs/en/errors#workspace-not-trusted-when-starting-remote-control) error. ## Start a Remote Control session @@ -203,7 +204,7 @@ With this setting on, each interactive Claude Code process registers one remote With only `DISABLE_TELEMETRY` or `DO_NOT_TRACK` set, your sessions don't auto-connect through your organization's admin default or Claude Code's own default. If something else makes Remote Control unavailable for you, such as `DISABLE_GROWTHBOOK` or an LLM gateway, start with [Requirements](#requirements) instead. -Turning auto-connect on with only `DISABLE_TELEMETRY` or `DO_NOT_TRACK` set requires Claude Code v2.1.283 or later. To auto-connect, check whether your organization requires [Trusted Devices](#trusted-devices): +Before you turn auto-connect on with only `DISABLE_TELEMETRY` or `DO_NOT_TRACK` set, confirm that your Claude Code version meets the [requirement for these variables](#requirements). Then check whether your organization requires [Trusted Devices](#trusted-devices): * **Not required**: set **Enable Remote Control for all sessions** to `true` in `/config`. * **Required**: Remote Control isn't available while `DISABLE_TELEMETRY` or `DO_NOT_TRACK` is set. Unset whichever of the two variables you set. If your sessions still don't auto-connect, set **Enable Remote Control for all sessions** to `true` in `/config`. @@ -435,7 +436,7 @@ Claude Code could not reach the feature-flag service to check whether Remote Con An [environment variable](/docs/en/env-vars#features-that-need-feature-flag-fetching) that turns off feature-flag evaluation is set, and the full message names the variable Claude Code found. On versions before 2.1.154, the same configuration produces "Remote Control is not yet enabled for your account" instead. What to do depends on the variable the message names: * **`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` or `DISABLE_GROWTHBOOK`**: unset the variable wherever it's set, in your shell environment or in the `env` block of a [`settings.json` file](/docs/en/settings-reference#all-settings). -* **`DISABLE_TELEMETRY` or `DO_NOT_TRACK`**: on a Pro, Max, Team, or Enterprise plan with `DISABLE_GROWTHBOOK` unset, these variables leave Remote Control available unless your organization requires [Trusted Devices](#trusted-devices). If it does, unset the variable wherever it's set to use Remote Control. From v2.1.154 through v2.1.282, either variable produced this message, so update Claude Code to v2.1.283 or later. +* **`DISABLE_TELEMETRY` or `DO_NOT_TRACK`**: on a Pro, Max, Team, or Enterprise plan with `DISABLE_GROWTHBOOK` unset, these variables leave Remote Control available unless your organization requires [Trusted Devices](#trusted-devices). If it does, unset the variable wherever it's set to use Remote Control. On v2.1.154 through v2.1.282, you see this message with either variable set, so update Claude Code to a version that meets the [requirement for these variables](#requirements). ### "Remote Control is only available when using Claude via api.anthropic.com" @@ -450,6 +451,7 @@ A policy blocks Remote Control. Check these causes in order: * **The error mentions `disableRemoteControl`**: your IT administrator has disabled Remote Control on this device through [managed settings](/docs/en/managed-settings), independent of the organization-wide toggle and of how you're signed in. * **Your claude.ai plan is Pro or Max**: Claude Code is still signed in under a Team or Enterprise organization from an earlier login, so it checks that organization's Remote Control policy. Run `/status` to see which plan and organization your sign-in uses. Run `claude auth logout` then `claude auth login` to sign in again under your current plan. * **The message doesn't say to contact your organization admin**: your organization has the [HIPAA configuration](/docs/en/hipaa-setup) applied, which turns Remote Control off. To confirm, run `/status` and look for `HIPAA` on the `Organization configuration` line. An Owner sees the **Remote Control** toggle grayed out in [admin settings](https://claude.ai/admin-settings/claude-code) and can't turn it on. If you have questions about the configuration, ask an Owner, who can contact your organization's Anthropic account team. Before v2.1.267, this case showed "Remote Control isn't available for your organization due to its compliance policy" instead. +* **Remote Control works for others in your organization but not for you**: if your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), your roles can be the cause. Remote Control needs both the cloud sessions permission and the **Claude Code remote control** permission. Ask an Owner to check whether your roles include both and add what's missing at [**Organization settings > Roles**](https://claude.ai/admin-settings/roles). * **Otherwise, an Owner hasn't enabled it for your organization**: Remote Control is off by default on Team and Enterprise plans. An Owner can enable it at [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) by turning on the **Remote Control** toggle. This toggle is a server-side organization setting. Before v2.1.281, this message also appeared when Claude Code hadn't loaded your organization's policy on this machine, for example after starting offline. Later versions report that state as [`Couldn't verify your organization's policy for remote control`](#couldnt-verify-your-organizations-policy-for-remote-control) instead. diff --git a/content/en/docs/claude-code/routines.md b/content/en/docs/claude-code/routines.md index 29c1bbfad9..d80e30402b 100644 --- a/content/en/docs/claude-code/routines.md +++ b/content/en/docs/claude-code/routines.md @@ -33,6 +33,8 @@ Scheduled tasks are available on Pro, Max, Team, and Enterprise plans. Create an Team and Enterprise Owners can turn off scheduled tasks for all members with the **Scheduled tasks (Was Routines)** toggle at [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities). When the toggle is off, existing scheduled tasks stop running and members can't create new ones. +If your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), you also need a role that includes the scheduled tasks permission. An Owner can add it in a role's **Remote sessions** section at [**Organization settings > Roles**](https://claude.ai/admin-settings/roles). + ## Example use cases Each example pairs a trigger type with the kind of work scheduled tasks are suited to: unattended, repeatable, and tied to a clear outcome. @@ -452,8 +454,9 @@ The cause is usually one of the following: * You are inside a cloud session, where submitting `/schedule` answers that the command isn't available in that environment. Manage scheduled tasks from the [web UI](https://claude.ai/code/routines) instead * Your organization's policy disables [cloud sessions](/docs/en/claude-code-on-the-web), which scheduled tasks require. In this case, submitting `/schedule` answers [`Cloud sessions are disabled by your organization's policy`](/docs/en/errors#cloud-sessions-are-disabled-by-your-organizations-policy) instead. Before v2.1.268, it returned `Unknown command: /schedule` * An Owner [turned off scheduled tasks](#routines-are-disabled-by-your-organizations-policy) for your Team or Enterprise organization. Before v2.1.227, the command still appeared in this case, and claude.ai rejected the task when Claude tried to create or run it +* Your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), and none of your roles includes the scheduled tasks permission under **Remote sessions**. Ask an Owner to add it to one of your roles -Unless your organization's policy disables scheduled tasks or cloud sessions, you can create and manage scheduled tasks at [claude.ai/code/routines](https://claude.ai/code/routines) regardless of how the CLI is configured. +If the cause is your CLI sign-in or being inside a cloud session, you can still create and manage scheduled tasks at [claude.ai/code/routines](https://claude.ai/code/routines). You need a Pro, Max, Team, or Enterprise account there. If scheduled tasks or cloud sessions are off for your organization or missing from your roles, you can't create them on the web either. ### "Routines are disabled by your organization's policy" diff --git a/content/en/docs/claude-code/scheduled-tasks.md b/content/en/docs/claude-code/scheduled-tasks.md index 9735cdcb6b..18dc4ae295 100644 --- a/content/en/docs/claude-code/scheduled-tasks.md +++ b/content/en/docs/claude-code/scheduled-tasks.md @@ -124,11 +124,14 @@ Edits to `loop.md` take effect on the next iteration, so you can refine the inst ### Stop a loop -To stop a [self-paced `/loop`](#let-claude-choose-the-interval) while it is waiting for the next iteration, press `Esc`. This clears the pending wakeup so the loop does not fire again. Tasks you scheduled by [asking Claude directly](#manage-scheduled-tasks) are not affected by `Esc` and stay in place until you delete them. +* **[Self-paced loop](#let-claude-choose-the-interval)**: while the loop is waiting for its next iteration, press `Esc` to stop it. You can also stop it with `Ctrl+C` while Claude is idle, except in a [background session you've attached to](#detach-without-stopping-a-loop). A `Pending wakeup cancelled` notice confirms that the loop won't fire again. +* **[Fixed-interval loop](#run-on-a-fixed-interval)**: to stop a loop such as `/loop 5m`, ask Claude to cancel it, for example `cancel the deploy check loop`. `Esc` and `Ctrl+C` don't stop it, or any task you [scheduled by asking Claude directly](#manage-scheduled-tasks). A loop you don't cancel ends when [seven days elapse](#seven-day-expiry). In [self-paced mode](#let-claude-choose-the-interval), Claude can also end the loop on its own once the task is complete. Claude calls the [`ScheduleWakeup` tool](/docs/en/tools-reference) with `stop: true`, which cancels the pending wakeup immediately. If an iteration ends without either rescheduling or stopping, Claude Code schedules one fallback wakeup about 20 minutes later and ends the loop when that iteration doesn't reschedule either. -Loops on a fixed interval keep running until you [cancel them like any other scheduled task](#manage-scheduled-tasks) or [seven days elapse](#seven-day-expiry). +#### Detach without stopping a loop + +When you're [attached to a background session](/docs/en/agent-view#attach-to-a-session) and Claude is idle, press `Ctrl+C` twice on an empty prompt to detach. A self-paced loop waiting there for its next iteration keeps running, and that iteration starts on schedule. To stop the loop instead, press `Esc` before you detach. Detaching with `Ctrl+C` without stopping the loop requires Claude Code v2.1.295 or later. ## Set a one-time reminder @@ -232,7 +235,10 @@ Session-scoped scheduling has inherent constraints: * Tasks only fire while Claude Code is running and idle. Closing the terminal or letting the session exit stops them firing. [Backgrounding the session](/docs/en/agent-view#from-inside-a-session) carries `/loop` tasks over to a background session, which keeps running without a terminal. * No catch-up for missed fires. If a task's scheduled time passes while Claude is busy on a long-running request, it fires once when Claude becomes idle, not once per missed interval. -* When you resume a session with `claude --resume` or `claude --continue`, Claude Code restores the tasks scheduled with `CronCreate`, except recurring tasks that have [expired](#seven-day-expiry) and one-shot tasks whose scheduled time has passed. A [self-paced `/loop`](#let-claude-choose-the-interval) isn't restored, so run `/loop` again to restart it. Background Bash and monitor tasks are never restored on resume. +* In a [background session](/docs/en/agent-view#from-inside-a-session), a [self-paced loop](#let-claude-choose-the-interval) stops if its next wakeup comes due while the session's process isn't running, such as after a crash. When the process starts again, the transcript shows a [notice that the wakeup won't fire](/docs/en/errors#restarted-after-its-next-loop-wakeup-was-due). To continue the loop, [reply to the session](/docs/en/agent-view#peek-and-reply) and ask Claude to keep it running. +* When you resume a session with `claude --resume` or `claude --continue`, Claude Code restores the tasks scheduled with `CronCreate`, except recurring tasks that have [expired](#seven-day-expiry) and one-shot tasks whose scheduled time has passed. A [self-paced `/loop`](#let-claude-choose-the-interval) isn't restored, so run `/loop` again to restart it. +* A restored recurring task doesn't fire for the runs it missed while the session wasn't running. Its next run is the first one due after you resume, and [jitter](#jitter) applies to that run. +* When you resume with `claude --resume` or `claude --continue`, Claude Code doesn't restart the background Bash commands and monitors that were running when the session ended. If you still need one, ask Claude to start it again. * With [feature-flag fetching off](/docs/en/env-vars#features-that-need-feature-flag-fetching), Claude Code stores a task you asked to keep across sessions in the project's `.claude/scheduled_tasks.json` file. When the `.claude` directory or that file is a symlink, Claude Code returns an error instead of scheduling the task. A saved task runs only in the project folder where you created it. If you copy the file into another folder, such as a new worktree, sessions there list the copied tasks but don't run them, so create the task again in that folder. For cron-driven automation that needs to run unattended: diff --git a/content/en/docs/claude-code/vs-code.md b/content/en/docs/claude-code/vs-code.md index d92d5d0c62..460dd765da 100644 --- a/content/en/docs/claude-code/vs-code.md +++ b/content/en/docs/claude-code/vs-code.md @@ -174,7 +174,9 @@ The prompt box supports several features: * **Bookmarks**: hover over a response and click **Bookmark response** to save it, or click **Remove bookmark** on a saved response to remove it. To review saved responses, open the Bookmarks panel. You can click the bookmark icon at the top of the Claude Code panel, select **Bookmarks** in the Context section of the command menu, or type `/bookmarks`. Requires Claude Code v2.1.286 or later. -* **Files Claude sends you**: when the session is connected to [Remote Control](/docs/en/remote-control#start-a-remote-control-session) and Claude sends you files with the [`SendUserFile` tool](/docs/en/tools-reference), the conversation shows a row such as **Sent report.md, chart.png**. Click a file's name to open it in the editor. +* **Files Claude sends you**: when the session is connected to [Remote Control](/docs/en/remote-control#start-a-remote-control-session) and Claude sends you files with the [`SendUserFile` tool](/docs/en/tools-reference), the conversation shows a row such as **Sent report.md, chart.png**. Click a file's name to open it in the editor. The row stays visible in Focus view. Requires Claude Code v2.1.295 or later. + + A file appears as a full path you can't click, such as `\\server\share\report.md`, when its path names a network host. Claude Code doesn't link that file because opening it would contact that host and, on Windows, [could send your Windows credentials to that host](/docs/en/permissions#read-only-commands). * **Context indicator**: the prompt box shows how much of Claude's context window you're using. Claude automatically compacts when needed, or you can run `/compact` manually. * **Prompt cache clock**: a clock icon next to the context indicator estimates how much time the conversation's [prompt cache](/docs/en/prompt-caching) has left before it expires. It counts down from the cache's five-minute or one-hour [lifetime](/docs/en/prompt-caching#cache-lifetime), and each response that uses the cache restarts the countdown. Apart from compaction, the [actions that invalidate the cache](/docs/en/prompt-caching#actions-that-invalidate-the-cache) don't reset the clock, so it can still show minutes left after you switch models. * Until the countdown runs out, the icon shows the minutes left, such as **12m**. diff --git a/content/en/docs/claude-code/web-scheduled-tasks.md b/content/en/docs/claude-code/web-scheduled-tasks.md index 29c1bbfad9..d80e30402b 100644 --- a/content/en/docs/claude-code/web-scheduled-tasks.md +++ b/content/en/docs/claude-code/web-scheduled-tasks.md @@ -33,6 +33,8 @@ Scheduled tasks are available on Pro, Max, Team, and Enterprise plans. Create an Team and Enterprise Owners can turn off scheduled tasks for all members with the **Scheduled tasks (Was Routines)** toggle at [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities). When the toggle is off, existing scheduled tasks stop running and members can't create new ones. +If your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), you also need a role that includes the scheduled tasks permission. An Owner can add it in a role's **Remote sessions** section at [**Organization settings > Roles**](https://claude.ai/admin-settings/roles). + ## Example use cases Each example pairs a trigger type with the kind of work scheduled tasks are suited to: unattended, repeatable, and tied to a clear outcome. @@ -452,8 +454,9 @@ The cause is usually one of the following: * You are inside a cloud session, where submitting `/schedule` answers that the command isn't available in that environment. Manage scheduled tasks from the [web UI](https://claude.ai/code/routines) instead * Your organization's policy disables [cloud sessions](/docs/en/claude-code-on-the-web), which scheduled tasks require. In this case, submitting `/schedule` answers [`Cloud sessions are disabled by your organization's policy`](/docs/en/errors#cloud-sessions-are-disabled-by-your-organizations-policy) instead. Before v2.1.268, it returned `Unknown command: /schedule` * An Owner [turned off scheduled tasks](#routines-are-disabled-by-your-organizations-policy) for your Team or Enterprise organization. Before v2.1.227, the command still appeared in this case, and claude.ai rejected the task when Claude tried to create or run it +* Your Enterprise organization manages your access with [custom roles](https://support.claude.com/en/articles/13930452), and none of your roles includes the scheduled tasks permission under **Remote sessions**. Ask an Owner to add it to one of your roles -Unless your organization's policy disables scheduled tasks or cloud sessions, you can create and manage scheduled tasks at [claude.ai/code/routines](https://claude.ai/code/routines) regardless of how the CLI is configured. +If the cause is your CLI sign-in or being inside a cloud session, you can still create and manage scheduled tasks at [claude.ai/code/routines](https://claude.ai/code/routines). You need a Pro, Max, Team, or Enterprise account there. If scheduled tasks or cloud sessions are off for your organization or missing from your roles, you can't create them on the web either. ### "Routines are disabled by your organization's policy" diff --git a/content/en/get-api-key.md b/content/en/get-api-key.md index 54e74b0fac..fb5fe50465 100644 --- a/content/en/get-api-key.md +++ b/content/en/get-api-key.md @@ -8,7 +8,7 @@ API keys for the Claude API (also called Anthropic API keys) live in the Claude ## Choose a key type -When you create a key, you choose its type, which determines what the key can do, where it works, and when it stops working. A **personal key** acts as you, and stops working if you leave an organization. A **service account key** represents a [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts) which can be used by workloads such as CI pipelines, production services, or agents. Use a personal key for your own development, and a service account key for anything shared. +When you create a key, you choose its type, which determines what the key can do, where it works, and when it stops working. A **personal key** acts as you, and stops working if you leave an organization. A **service account key** represents a [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts), which can be used by workloads such as CI pipelines, production services, or agents. Use a personal key for your own development, and a service account key for anything shared. You can also create a **workspace key**, a legacy key without an owner: it belongs to the workspace you create it in and keeps working after its creator leaves. It is preferable to use a personal or service account key, as these stop working automatically when their associated account is removed from the organization. @@ -24,7 +24,7 @@ You can also create a **workspace key**, a legacy key without an owner: it belon - Click **Create key**, name the key, choose an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration), and set **Linked account** to yourself or a service account. You can also choose a [workspace](https://platform.claude.com/settings/workspaces) in the Console to scope the key to. + Click **Create key**, name the key, select an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration), and set **Linked account** to yourself or a service account. You can also select a [workspace](https://platform.claude.com/settings/workspaces) in the Console to scope the key to. @@ -32,7 +32,7 @@ You can also create a **workspace key**, a legacy key without an owner: it belon -If the **Create key** button on the API keys page is disabled, your role may not allow you to create keys there. Ask an organization admin to change your role, or to create a service account key for your workload. +If the **Create key** button on the API keys page is disabled, your role might not allow you to create keys there. Ask an organization admin to change your role, or to create a service account key for your workload. ## Use your API key @@ -42,9 +42,9 @@ Set the key as an environment variable: export ANTHROPIC_API_KEY="sk-ant-api03-..." ``` -The [client SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) reads `ANTHROPIC_API_KEY` automatically. Direct HTTP requests send the key as `Authorization: Bearer `. If your API key works on multiple workspaces, you must also send the `anthropic-workspace-id` header on each Claude API request, as shown in [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). For the Admin API, see [API keys and the Admin API](https://platform.claude.com/docs/en/get-api-key#api-keys-and-the-admin-api). +The [client SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) reads `ANTHROPIC_API_KEY` automatically. Direct HTTP requests send the key as `Authorization: Bearer `. If your API key isn't scoped to a workspace, you must also send the `anthropic-workspace-id` header on each Claude API request, as shown in [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). For the Admin API, see [API keys and the Admin API](https://platform.claude.com/docs/en/get-api-key#api-keys-and-the-admin-api). -To make your first request, follow the [Quickstart](https://platform.claude.com/docs/en/get-started), and see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication) for the full picture, including short-lived credentials with Workload Identity Federation. +To make your first request, follow the [Quickstart](https://platform.claude.com/docs/en/get-started), and see [Authentication](https://platform.claude.com/docs/en/manage-claude/authentication) for complete details, including short-lived credentials with Workload Identity Federation. ## API keys and the Admin API diff --git a/content/en/get-started.md b/content/en/get-started.md index a1da846948..cff716452a 100644 --- a/content/en/get-started.md +++ b/content/en/get-started.md @@ -15,7 +15,7 @@ description: Make your first API call to Claude and build a simple web search as - Export your API key as an environment variable. The cURL command below reads it from `$ANTHROPIC_API_KEY`. + Export your API key as an environment variable. The cURL command in the following step reads it from `$ANTHROPIC_API_KEY`. ```bash export ANTHROPIC_API_KEY="your-api-key-here" @@ -290,9 +290,8 @@ description: Make your first API call to Claude and build a simple web search as MaxTokens = 1000, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "What should I search for to find the latest developments in renewable energy?", }, ], @@ -436,7 +435,7 @@ description: Make your first API call to Claude and build a simple web search as } dependencies { - implementation("com.anthropic:anthropic-java:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") } application { @@ -462,7 +461,7 @@ description: Make your first API call to Claude and build a simple web search as com.anthropic anthropic-java - 2.75.0 + 3.0.0 diff --git a/content/en/home.md b/content/en/home.md index 73438c98a2..423e14247c 100644 --- a/content/en/home.md +++ b/content/en/home.md @@ -152,8 +152,7 @@ with Claude" .Create(new() { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { - Role = Role.User, + Messages = [new UserMessageParam { Content = "Hello, Claude" }] }); diff --git a/content/en/intro.md b/content/en/intro.md index db693b056c..8f48456807 100644 --- a/content/en/intro.md +++ b/content/en/intro.md @@ -32,7 +32,7 @@ If you're unsure which model to use, start with [Claude Opus 5.5](https://platfo ## Recommended path for new developers -Follow these steps to go from zero to a working Claude integration. +Follow these steps to build a working Claude integration. @@ -77,7 +77,7 @@ Anthropic provides developer tools to help you build and scale applications with Explore and understand the API in your browser with playground. - + Explore the full Claude API and client SDK documentation. @@ -90,7 +90,7 @@ Anthropic provides developer tools to help you build and scale applications with ## Key capabilities -Claude can assist with many tasks that involve text, code, and images. +Claude can help with many tasks that involve text, code, and images. @@ -111,7 +111,7 @@ Claude can assist with many tasks that involve text, code, and images. Find answers to frequently asked account and billing questions. - + Check the status of Anthropic services. diff --git a/content/en/manage-claude/access-transparency-log.md b/content/en/manage-claude/access-transparency-log.md index 89910cd7a9..d0ef404180 100644 --- a/content/en/manage-claude/access-transparency-log.md +++ b/content/en/manage-claude/access-transparency-log.md @@ -20,9 +20,9 @@ Learn how to cryptographically verify that no [Access Transparency](https://plat A transparency log is a technique for making a record tamper-evident. Entries are only ever appended. Each time the log grows, its operator signs a short statement, called a checkpoint, that commits to every entry so far through a Merkle tree hash. Anyone who keeps a checkpoint can later demand proof that the current log still contains everything that checkpoint covered, unchanged and in the same order. Removing or rewriting an entry therefore cannot go unnoticed by a verifier who kept a checkpoint that covered that entry. Certificate Transparency and the Go module checksum database are built on the same technique. [C2SP tlog-tiles](https://c2sp.org/tlog-tiles) is an open specification for serving such a log as signed checkpoints plus static, cacheable tiles of hashes and entries, so that clients can fetch the hashes and compute every proof themselves. -When Access Transparency is enabled, Anthropic maintains a transparency log for your organization. It is an append-only, cryptographically signed record of Access Transparency events (`anthropic_access` and `cmek_preserve`). Each such event recorded for your organization after the log was created is appended to it. The log follows the C2SP tlog-tiles format, so tooling built for that standard understands its checkpoints, tiles, and proofs. +When Access Transparency is enabled, Anthropic maintains a transparency log for your organization. It is an append-only, cryptographically signed record of Access Transparency events (`anthropic_access` and `cmek_preserve`). Each such event recorded for your organization after the log was created is appended to it. The log follows the C2SP tlog-tiles format, so tooling built for that standard can parse its checkpoints, tiles, and proofs. -* **One log per organization.** Each organization's log has a fixed origin string: `axt.anthropic.com/`. The origin never changes for the life of the organization. +* **One log for each organization.** Each organization's log has a fixed origin string: `axt.anthropic.com/`. The origin never changes for the life of the organization. * **Every new event becomes a leaf.** When an Access Transparency event becomes eligible to appear on your Activity Feed, it is first appended to your log as a leaf, and only then served on the feed. A leaf is a deterministic serialization of the event's documented fields. The event on your feed carries `transparency_log_leaf_index`, its zero-based position in your log. * **Checkpoints commit to the whole history.** The log is a Merkle tree. Whenever it grows, Anthropic publishes a signed checkpoint: a short text document stating the log's origin, its current size, and the root hash that commits to every leaf. Each checkpoint carries exactly one signature from the log's signing key. * **Two proofs follow.** An inclusion proof shows that a specific event is present at its position under a checkpoint. A consistency proof shows that a later checkpoint is an append-only extension of an earlier one you saved, so nothing between them was removed or changed. @@ -53,7 +53,7 @@ You need: ## Timing -* **Events:** Access Transparency events appear on your Activity Feed within two business days of the access. An event enters the log only once it is eligible to be served, so the log never reveals an event early. Because the log is written before the feed serves the event, an entry can briefly appear in the log before its event appears on your feed. That gap is not a discrepancy. +* **Events:** Access Transparency events appear on your Activity Feed within 2 business days of the access. An event enters the log only once it is eligible to be served, so the log never reveals an event early. Because the log is written before the feed serves the event, an entry can briefly appear in the log before its event appears on your feed. That gap is not a discrepancy. * **Checkpoints:** A new checkpoint is published whenever your log grows. * **Inclusion proofs:** A proof for a newly served event is available once a checkpoint covering the event's position is published, normally very shortly after the event appears. If you request one sooner, you receive a `404` and retry after a short delay. * **Verification cadence:** Run your verification at least daily. Hourly is reasonable. @@ -96,7 +96,7 @@ A `404` means there is no log this key can read. An organization outside the key ### Errors -Errors use the standard Compliance API JSON error envelope on every endpoint, including the text and binary ones. See [Errors](https://platform.claude.com/docs/en/manage-claude/compliance-errors) for the envelope and the shared error types. +Errors use the standard Compliance API JSON error envelope on every endpoint, including the text and binary ones. See [Handle Compliance API errors](https://platform.claude.com/docs/en/manage-claude/compliance-errors) for the envelope and the shared error types. | Status | Meaning on this surface | | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -118,8 +118,8 @@ Responses are cacheable only by the requesting client. `Cache-Control` always in ```bash curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/transparency_log/checkpoint" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` The response is `text/plain`: a C2SP [signed note](https://c2sp.org/signed-note). The body lines are the origin, the tree size in decimal, and the base64 root hash. A blank line follows, then the signature line, which starts with an em dash (U+2014), names the origin, and ends with a base64 value. Values here are illustrative: @@ -132,7 +132,7 @@ C6C4HzGRqDNlbu54LWCvpDX0NcB5DRTmLcjM4u5vWUI= — axt.anthropic.com/25f6429a-3293-49bf-afed-cb312911554b q83vATBFAiEAvL8m…(base64)… ``` -* The first four bytes of the decoded signature value are the signing key's `key_hash`, which tells you which entry in the [verifier key set](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#read-the-verifier-keys) to verify with. The remaining bytes are an ASN.1 DER ECDSA P-256 signature over the SHA-256 of the note body: every byte before the blank line, including the body's trailing newline. +* The first 4 bytes of the decoded signature value are the signing key's `key_hash`, which tells you which entry in the [verifier key set](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#read-the-verifier-keys) to verify with. The remaining bytes are an ASN.1 DER ECDSA P-256 signature over the SHA-256 of the note body: every byte before the blank line, including the body's trailing newline. * A checkpoint can carry additional lines after the root hash. Ignore lines you do not understand. They are covered by the signature. * Ignore a signature line whose name is not your origin or whose key hash you do not hold. * Never cache a checkpoint. A stale one hides the log's current size, so newly served events look uncovered. @@ -144,8 +144,8 @@ C6C4HzGRqDNlbu54LWCvpDX0NcB5DRTmLcjM4u5vWUI= ```bash curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/transparency_log/keys" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json @@ -170,12 +170,12 @@ curl --fail-with-body -sS \ | `origin` | string | The origin line every checkpoint of this log carries. Informational: compare checkpoints against the origin you derive yourself, not against this field | | `log_keys` | array | The key that signs new checkpoints first, then every other key the log serves, newest first. Never empty | | `log_keys[].verifier_key` | string | The key as a C2SP note-verifier string, `++`, accepted by tlog-tiles tooling that supports ECDSA note keys (for example, the Go `github.com/transparency-dev/formats` module). The base64 part decodes to the algorithm byte `0x02` followed by the DER-encoded public key | -| `log_keys[].key_hash` | string | Eight lowercase hex digits. The 4-byte selector that matches this key to a checkpoint's signature line. It is the first four bytes of `fingerprint` and is not an identity | +| `log_keys[].key_hash` | string | Eight lowercase hex digits. The 4-byte selector that matches this key to a checkpoint's signature line. It is the first 4 bytes of `fingerprint` and is not an identity | | `log_keys[].fingerprint` | string | 64 lowercase hex digits: the SHA-256 of the DER `SubjectPublicKeyInfo` | | `log_keys[].algorithm` | string | The key type, currently `ecdsa_p256_sha256`. Values may be added. Skip a key whose algorithm you do not support | | `log_keys[].public_key` | string | The public key as base64 DER `SubjectPublicKeyInfo` | -The `key_hash` covers only the key bytes: it is the first four bytes of SHA-256 over the DER `SubjectPublicKeyInfo`, which is the rule the ECDSA note-verifier encoding uses. It is not the name-dependent key ID that the base signed-note format defines for Ed25519 keys, so it does not change with the origin. A valid signature by a key listed in [Published key fingerprints](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#published-key-fingerprints) proves the checkpoint came from Anthropic's transparency log service. The origin line inside the signed checkpoint is what binds it to your organization. That is why you compare that line against the origin you derive yourself. +The `key_hash` covers only the key bytes: it is the first 4 bytes of SHA-256 over the DER `SubjectPublicKeyInfo`, which is the rule the ECDSA note-verifier encoding uses. It is not the name-dependent key ID that the base signed-note format defines for Ed25519 keys, so it does not change with the origin. A valid signature by a key listed in [Published key fingerprints](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#published-key-fingerprints) proves the checkpoint came from Anthropic's transparency log service. The origin line inside the signed checkpoint is what binds it to your organization. That is why you compare that line against the origin you derive yourself. Keys can rotate: @@ -185,7 +185,7 @@ Keys can rotate: #### Published key fingerprints -Anthropic publishes the fingerprint of every key that signs checkpoints here, outside the API. This lets you check a key you hold locally against a source the serving path cannot alter. The key you hold may come from an earlier `GET /keys` response or from tooling that pins the key. +Anthropic publishes the fingerprint of every key that signs checkpoints here, outside the API. This lets you check a key you hold locally against a source the serving path cannot alter. The key you hold might come from an earlier `GET /keys` response or from tooling that pins the key. | Key hash | SHA-256 fingerprint | Algorithm | Signing since | Status | | ---------- | ------------------------------------------------------------------ | ------------------- | ------------- | ------------------- | @@ -208,8 +208,8 @@ A planned rotation is announced on this page at least 30 days before the new key curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/transparency_log/inclusion" \ --data-urlencode "leaf_index=41" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json @@ -254,8 +254,8 @@ A `leaf_index` that is missing or is not a non-negative integer returns `400`. curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/transparency_log/consistency" \ --data-urlencode "from=1180" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json @@ -286,7 +286,7 @@ curl --fail-with-body -sS -G \ `GET /v1/compliance/transparency_log/tile/{level}/{index}` -Returns `application/octet-stream`: concatenated 32-byte SHA-256 hashes, per tlog-tiles. Tile addressing follows tlog-tiles exactly, including the `{level}` and `{index}` path grammar, the `x001/234` index form for large trees, and the partial-tile suffix `.p/{width}`. Hash tiles are the unit from which tlog-tiles clients compute proofs themselves. +Returns `application/octet-stream`: concatenated 32-byte SHA-256 hashes, as tlog-tiles specifies. Tile addressing follows tlog-tiles exactly, including the `{level}` and `{index}` path grammar, the `x001/234` index form for large trees, and the partial-tile suffix `.p/{width}`. Hash tiles are the unit from which tlog-tiles clients compute proofs themselves. * Full tiles are immutable and are served with `Cache-Control: private, max-age=604800, immutable`. * Partial tiles are superseded as the tree grows and are served with `Cache-Control: private, no-store`. Once a tile fills, a request for its earlier partial form can return `404` even though the full tile exists. Falling back from the partial tile to the full tile is the client's job, as tlog-tiles specifies, and standard clients already do it. @@ -296,14 +296,14 @@ Returns `application/octet-stream`: concatenated 32-byte SHA-256 hashes, per tlo `GET /v1/compliance/transparency_log/tile/entries/{index}` -Returns `application/octet-stream`: consecutive leaf entries, each prefixed with its big-endian `uint16` length, per tlog-tiles. Entry bundles contain event plaintext: the [canonical bytes](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#how-an-event-becomes-a-leaf) of each Access Transparency event. That is why the whole surface requires the Activity Feed's scope. Addressing, the partial form, caching, and errors are identical to hash tiles. +Returns `application/octet-stream`: consecutive leaf entries, each prefixed with its big-endian `uint16` length, as tlog-tiles specifies. Entry bundles contain event plaintext: the [canonical bytes](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#how-an-event-becomes-a-leaf) of each Access Transparency event. That is why the whole surface requires the Activity Feed's scope. Addressing, the partial form, caching, and errors are identical to hash tiles. ## The `transparency_log_leaf_index` field on Activity Feed events `anthropic_access` and `cmek_preserve` events on `GET /v1/compliance/activities` carry `transparency_log_leaf_index`, an integer, whenever the event has a leaf. Other activity types never carry it. * **The key is absent, not `null`, when the event has no leaf.** A robust verifier treats an absent key and a `null` value the same way. -* **An event is served without `transparency_log_leaf_index` in only two cases.** The first is while your organization is not enrolled in Access Transparency, that is, before enrollment or between an un-enrollment and a re-enrollment. The second is when the event was recorded before your organization's log was created. For an organization enrolled before the transparency log was introduced, that includes its earlier history. Once your log exists and while you are enrolled, every event is appended to the log before the feed serves it. If a fault prevents the feed from learning the index, the feed delays the event rather than serving it without one. The event is not lost: it is already in the log and appears on the feed, index included, once the fault is remediated. An index-less event is not expected when it is dated after your log was created and falls inside a period when you were enrolled. +* **An event is served without `transparency_log_leaf_index` in only two cases.** The first is while your organization is not enrolled in Access Transparency, that is, before enrollment or between an un-enrollment and a re-enrollment. The second is when the event was recorded before your organization's log was created. For an organization enrolled before the transparency log was introduced, that includes its earlier history. Once your log exists and while you are enrolled, every event is appended to the log before the feed serves it. If a fault prevents the feed from obtaining the index, the feed delays the event rather than serving it without one. The event is not lost: it is already in the log and appears on the feed, index included, once the fault is remediated. An index-less event is not expected when it is dated after your log was created and falls inside a period when you were enrolled. * **A present index is a pointer, not a proof.** Verify inclusion before treating the event as committed in the log. The anomaly worth escalating is a present index whose inclusion proof still cannot be fetched long after a covering checkpoint should have been published. * The index is assigned when the event is appended to the log and is not one of the fields that make up the leaf. @@ -393,20 +393,20 @@ axt-verify --org 25f6429a-3293-49bf-afed-cb312911554b \ Each `run` fetches the latest checkpoint and verifies its signature and origin line. It then proves the log is an append-only extension of the checkpoint the previous run saved. Next it pages through the Access Transparency events on your Activity Feed. It starts seven days (by `created_at`) before the newest event the previous run read, so that events listed late or out of order are still picked up. It rebuilds each event's leaf, verifies an inclusion proof for it, and compares any event it verified before against what it recorded then. Finally, it saves the new checkpoint and its progress to the `--state` file, which the next run starts from. Run it at least daily. Hourly is reasonable. With a parent-organization key, run one copy per child organization, each with its own `--org` and `--state` file. Each child organization's UUID also comes from the Claude Console, not from the Compliance API responses you are verifying. To find it, switch to the child organization in the account menu at the bottom of the Console sidebar, then open the [Organization](https://platform.claude.com/settings/organization) page (`platform.claude.com/settings/organization`). You can also find it in your parent organization's list of organizations in the Console. `axt-verify checkpoint` does only the checkpoint and append-only steps. `axt-verify events FILE` verifies events you already hold, such as an auditor's sample or your own export. It proves that each event in the file is still committed in the log under the current checkpoint. It does not read the feed or touch the state file. -One limit follows from that window: `run` re-reads only the last seven days of events, so it re-checks recently served events (step 7), not your whole history. Keep the events you export (see [Keep your own checkpoint archive](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#keep-your-own-checkpoint-archive)). `axt-verify events FILE` proves at any later date that those copies are still committed in the log, but it does not re-read the feed. To detect an older event removed from or rewritten on the feed, re-export that range from the Activity Feed and compare it with the copies you kept. You can also verify the re-export itself with `axt-verify events FILE`. The seven-day overlap is longer than the feed's two-business-day delivery time, so a late-arriving event still falls inside a later run's window. `--overlap` changes the duration if you need to. +One limit follows from that window: `run` re-reads only the last 7 days of events, so it re-checks recently served events (step 7), not your whole history. Keep the events you export (see [Keep your own checkpoint archive](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#keep-your-own-checkpoint-archive)). `axt-verify events FILE` proves at any later date that those copies are still committed in the log, but it does not re-read the feed. To detect an older event removed from or rewritten on the feed, re-export that range from the Activity Feed and compare it with the copies you kept. You can also verify the re-export itself with `axt-verify events FILE`. The 7-day overlap is longer than the feed's 2-business-day delivery time, so a late-arriving event still falls inside a later run's window. `--overlap` changes the duration if you need to. If you need your own implementation instead, follow the preceding checklist with a tlog-tiles library that supports ECDSA note keys. ### Interpret the result -`axt-verify` prints your origin, the tree size and root hash of the checkpoint it verified, the tree size the append-only check started from, and a count of events by outcome. Pass `--json` to get the same report as one JSON object per line. Each event has one of four outcomes: +`axt-verify` prints your origin, the tree size and root hash of the checkpoint it verified, the tree size the append-only check started from, and a count of events by outcome. Pass `--json` to get the same report as one JSON object on each line. Each event has one of four outcomes: * **Verified:** the leaf rebuilt from the served event is committed at the event's index in the signed log. * **Pending:** the event's index is beyond the latest published checkpoint. This is normal for a short time after an event appears. In `run`, `axt-verify` remembers the event, verifies it on a later run once a checkpoint covers it, and fails it if that takes longer than 24 hours. `events FILE` has no later run to settle it, so it waits up to a minute for a covering checkpoint to be published. If none arrives, it reports the event as not yet covered and ends with exit status `3`. Run it again later. If `events FILE` reports the same event as not yet covered on two runs at least a day apart, treat it as a verification failure and escalate as for exit status `1`. * **Not logged:** the event was served without an index. An event is served without `transparency_log_leaf_index` only while your organization is not enrolled in Access Transparency, or when it was recorded before your organization's log was created (see [The `transparency_log_leaf_index` field on Activity Feed events](https://platform.claude.com/docs/en/manage-claude/access-transparency-log#the-transparency-log-leaf-index-field-on-activity-feed-events)). `axt-verify` reports such events as not logged and does not fail the run on them. An index-less event is not expected when it is dated after your log was created and falls inside a period when you were enrolled. Review the not-logged list in the run's summary or `--json` output rather than relying on the exit status alone. * **Failed:** see exit status `1`. -The exit status tells your scheduler what happened: +The exit status tells your scheduler what occurred: * **`0`:** Nothing failed. Not-logged events are reported, not failed, and so are pending events in `run`. @@ -422,7 +422,7 @@ The exit status tells your scheduler what happened: * An event still pending 24 hours after the run first saw it. * A refused inclusion proof (`400`, `401`, or `403`) for an event the feed served you. * An inclusion proof returned for a different `leaf_index` from the one requested. - * In `events FILE`, an event at an index the latest checkpoint already covered when the check began, for which no inclusion proof is served before the wait runs out. + * In `events FILE`, an event at an index the latest checkpoint already covered when the check started, for which no inclusion proof is served before the wait runs out. * An event whose `organization_uuid` is not the organization UUID you passed with `--org`. When a parent organization runs `events FILE` on an export that covers several child organizations, every other organization's event fails this way, so split the export by organization first and verify each part with its own `--org`. * The same activity `id` at two different indices, or twice at one index with different content, within one run or one `events FILE` input. * An event whose leaf cannot be rebuilt: for example, a documented field that is not a string, a field name that appears twice, or a `type` that is missing or is an unrecognized variant of an Access Transparency type. `events FILE` skips rows of other activity types and does not fail them. @@ -441,7 +441,7 @@ The exit status tells your scheduler what happened: * An unexpected response. * A state or `--save` file that could not be written. - An exit status `3` with `404` responses is expected until Anthropic has recorded a first Access Transparency event for your organization, because every transparency log endpoint returns `404` until that event creates the log. Escalate if the transparency log endpoints still return `404` more than a few days after your Activity Feed first shows an Access Transparency event, whether or not that event carries a `transparency_log_leaf_index`. That combination is not expected. Once a run has succeeded, escalate an exit status `3` that persists. + An exit status `3` with `404` responses is expected until Anthropic has recorded a first Access Transparency event for your organization, because every transparency log endpoint returns `404` until that event creates the log. Escalate if the transparency log endpoints still return `404` more than a few days after your Activity Feed first shows an Access Transparency event, regardless of whether that event carries a `transparency_log_leaf_index`. That combination is not expected. Once a run has succeeded, escalate an exit status `3` that persists. ### Keep your own checkpoint archive @@ -471,7 +471,7 @@ The strongest evidence you can hold is your own record of what the log said on a - Yes. A parent-organization key reads any enrolled child organization's log by passing `organization_id`. Each child organization has its own log, origin, and saved checkpoint. Run one verification per child organization, each with its own state. + Yes. A parent-organization key reads any enrolled child organization's log by passing `organization_id`. Each child organization has its own log, origin, and saved checkpoint. Run a separate verification, with its own state, for each child organization. @@ -480,7 +480,7 @@ The strongest evidence you can hold is your own record of what the log said on a * [Access Transparency](https://platform.claude.com/docs/en/manage-claude/access-transparency) * [Query the Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) * [Compliance API overview](https://platform.claude.com/docs/en/manage-claude/compliance-api) -* [Errors](https://platform.claude.com/docs/en/manage-claude/compliance-errors) +* [Handle Compliance API errors](https://platform.claude.com/docs/en/manage-claude/compliance-errors) * [axt-verify](https://github.com/anthropics/axt-verify), Anthropic's open-source verifier for the transparency log * [C2SP tlog-tiles](https://c2sp.org/tlog-tiles) and [C2SP signed note](https://c2sp.org/signed-note), the wire formats for tiles, entry bundles, and checkpoints * [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162), the Merkle tree, inclusion proof, and consistency proof algorithms diff --git a/content/en/manage-claude/access-transparency.md b/content/en/manage-claude/access-transparency.md index 074ca90da2..ad1984d00f 100644 --- a/content/en/manage-claude/access-transparency.md +++ b/content/en/manage-claude/access-transparency.md @@ -19,7 +19,7 @@ Learn how Access Transparency creates a record of human access to your organizat Anthropic personnel access customer content only under defined conditions. Access Transparency is designed to make such access visible to you. The design rests on the following principles: -* **Human access happens only under a published reason code.** +* **Human access occurs only under a published reason code.** * **Human views of your covered content are recorded.** Anthropic's internal tooling that can reach your covered content is instrumented to emit an event on each view. * **Events represent human access, not automated processing.** Anthropic's automated safety systems process your content in a secured pipeline with no interactive human access; that processing does not generate `anthropic_access` events. The one event automated processing can initiate is a `cmek_preserve` preservation record (see [CMEK content preservation](https://platform.claude.com/docs/en/manage-claude/access-transparency#cmek-content-preservation)). * **Events arrive on your existing feed.** Activities are accessible through your [Compliance API Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed). Existing credentials, audit, export, and SIEM integrations for the Compliance API still apply. @@ -27,7 +27,7 @@ Anthropic personnel access customer content only under defined conditions. Acces ## What Access Transparency covers -* **Covered content:** Access Transparency covers prompt and response content sent through the Claude Messages API or Claude Code sessions. Anthropic's [general ZDR documentation](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention) explains which APIs and features are covered by ZDR. The same APIs and features are covered by Access Transparency. +* **Covered content:** Access Transparency covers prompt and response content sent through the Claude Messages API or Claude Code sessions. The [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention) page explains which APIs and features are covered by ZDR. The same APIs and features are covered by Access Transparency. * **Manual views by Anthropic personnel:** Manual views of your covered content by Anthropic reviewers generate events. ## What Access Transparency does not cover @@ -68,8 +68,8 @@ curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/activities" \ --data-urlencode "activity_types[]=anthropic_access" \ --data-urlencode "limit=50" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` Pagination, date-range filtering (`created_at.gte` / `.lt`), and the response envelope (`has_more`, `first_id`, `last_id`) are shared with the rest of the Activity Feed. See [Query the Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed). @@ -126,8 +126,8 @@ curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/activities" \ --data-urlencode "activity_types[]=cmek_preserve" \ --data-urlencode "limit=50" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` Example JSON message: @@ -182,11 +182,11 @@ The following table lists which surfaces are covered by Access Transparency. Cov ### Coverage timing -Access Transparency applies from the time it is enabled for your organization. Content already in your retention window at enablement might also generate events when accessed, but Anthropic does not guarantee coverage for content written before enablement. Treat your enablement date as the start of reliable coverage. There might be a delay of up to two hours between enabling Access Transparency and your content being covered. +Access Transparency applies from the time it is enabled for your organization. Content already in your retention window at enablement might also generate events when accessed, but Anthropic does not guarantee coverage for content written before enablement. Treat your enablement date as the start of reliable coverage. There might be a delay of up to 2 hours between enabling Access Transparency and your content being covered. ### Notification timing -`anthropic_access` and `cmek_preserve` events are delivered to your Compliance API feed within two business days of the access or preservation they record. This feed should not be treated as a real-time alerting channel, and the `accessed_at` timestamp reflects when the access occurred, which might be up to two business days before the activity becomes visible in your feed. The `created_at` field reflects the time Anthropic recorded the event, and the event usually becomes visible in your feed shortly after that time. These events do not follow the Activity Feed's usual 1-minute [indexing lag](https://platform.claude.com/docs/en/manage-claude/compliance-integration-patterns#window-polling): an event can become visible up to two business days after its `created_at`. If you poll the feed by `created_at` window, overlap consecutive windows by at least two business days for `anthropic_access` and `cmek_preserve` events so that a late-indexed event is not dropped. +`anthropic_access` and `cmek_preserve` events are delivered to your Compliance API feed within 2 business days of the access or preservation they record. This feed should not be treated as a real-time alerting channel, and the `accessed_at` timestamp reflects when the access occurred, which might be up to 2 business days before the activity becomes visible in your feed. The `created_at` field reflects the time Anthropic recorded the event, and the event usually becomes visible in your feed shortly after that time. These events do not follow the Activity Feed's usual 1-minute [indexing lag](https://platform.claude.com/docs/en/manage-claude/compliance-integration-patterns#window-polling): an event can become visible up to 2 business days after its `created_at`. If you poll the feed by `created_at` window, overlap consecutive windows by at least 2 business days for `anthropic_access` and `cmek_preserve` events so that a late-indexed event is not dropped. ### Automated processing does not generate access events @@ -215,12 +215,12 @@ For organizations that also enable CMEK, your cloud KMS audit log (CloudTrail, C Access Transparency is not available for platform deployments. Contact your Anthropic account representative to discuss your use case. - + Access Transparency is not guaranteed to be retroactive. It covers human access to content written to the Claude API on or after your enrollment date. You might see events for access to content that was written before enrollment. - Within two business days of the access. Configure any SIEM alerting or scheduled exports with a matching lookback window rather than assuming real-time arrival. + Within 2 business days of the access. Configure any SIEM alerting or scheduled exports with a matching lookback window rather than assuming real-time arrival. @@ -232,7 +232,7 @@ For organizations that also enable CMEK, your cloud KMS audit log (CloudTrail, C - They are independent. With CMEK, safety preservation outside your key emits a separate `cmek_preserve` event on the same feed. See [CMEK content preservation](https://platform.claude.com/docs/en/manage-claude/access-transparency#cmek-content-preservation) and [CMEK](https://platform.claude.com/docs/en/manage-claude/cmek). + They are independent. With CMEK, safety preservation outside your key emits a separate `cmek_preserve` event on the same feed. See [CMEK content preservation](https://platform.claude.com/docs/en/manage-claude/access-transparency#cmek-content-preservation) and [Customer-managed encryption keys](https://platform.claude.com/docs/en/manage-claude/cmek). @@ -250,6 +250,6 @@ For organizations that also enable CMEK, your cloud KMS audit log (CloudTrail, C * [Compliance API overview](https://platform.claude.com/docs/en/manage-claude/compliance-api) * [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) * [API and data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention) -* [Customer-Managed Encryption Keys (CMEK)](https://platform.claude.com/docs/en/manage-claude/cmek) +* [Customer-managed encryption keys (CMEK)](https://platform.claude.com/docs/en/manage-claude/cmek) * [Claude Code data usage](https://code.claude.com/docs/en/data-usage) * [Trust Center](https://trust.anthropic.com/resources) diff --git a/content/en/manage-claude/admin-api-keys.md b/content/en/manage-claude/admin-api-keys.md index f0df09935b..61859190ff 100644 --- a/content/en/manage-claude/admin-api-keys.md +++ b/content/en/manage-claude/admin-api-keys.md @@ -29,7 +29,7 @@ A key created in one organization cannot be used to manage a different organizat - Click **Create admin key**, give it a name, choose a [key expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration), and click **Add**. Claude Console keys do not have selectable scopes; every key carries full access to all endpoints that accept Admin API keys (the service-account and federation endpoints noted at the top of this page do not accept Admin API keys). + Click **Create admin key**, give it a name, select a [key expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration), and click **Add**. Claude Console keys do not have selectable scopes; every key carries full access to all endpoints that accept Admin API keys (the service-account and federation endpoints noted at the top of this page do not accept Admin API keys). @@ -64,7 +64,7 @@ When you create a Claude Enterprise key, select every scope that the APIs you pl | To call... | Select these scopes | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management): list and look up members and invites; read custom roles and their permissions | `read:members` | -| Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management): change member roles, remove members, create and withdraw invites (to assign the `managed` role on a role change or an invite, also select `write:rbac_groups`) | `write:members` | +| Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management): change member roles, remove members, and create and withdraw invites (to assign the `managed` role on a role change or an invite, also select `write:rbac_groups`) | `write:members` | | Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management): read groups and their members | `read:rbac_groups` | | Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management): create, rename, and delete groups; add and remove group members; with `write:members`, assign the `managed` role (on an invite or a role change) or assign groups on an invite | `write:rbac_groups` | | [Plugins API](https://platform.claude.com/docs/en/manage-claude/plugins-api): read plugins, versions, installation settings, shares, and marketplaces; download plugin files, including the files of members' personal plugins; validate a marketplace before you connect it | `read:plugins` | @@ -75,8 +75,8 @@ When you create a Claude Enterprise key, select every scope that the APIs you pl | [Compliance API Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed): organization-wide activity events | `read:compliance_activities` | | [Compliance API chat, file, and project endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-content-data) and [Compliance API session endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-sessions): read chats, files, projects, session transcripts, and [organization users](https://platform.claude.com/docs/en/manage-claude/compliance-org-data#list-organization-users) | `read:compliance_user_data` | | [Compliance API chat, file, and project endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-content-data): delete chats, files, and projects | `delete:compliance_user_data` | -| [Compliance API organization endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-org-data): read organization metadata and effective settings | `read:compliance_org_data` | -| Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management) read endpoints and every Compliance API read endpoint, with a single read-only scope (for security-audit integrations; does not include the Spend Limits or Analytics APIs) | `read:org_audit` | +| [Compliance API organization endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-org-data): read organization metadata and effective settings; [Plugins API](https://platform.claude.com/docs/en/manage-claude/plugins-api): every `GET` endpoint, including file downloads | `read:compliance_org_data` | +| Admin API [user management](https://platform.claude.com/docs/en/manage-claude/user-management) read endpoints, every Compliance API read endpoint, and every [Plugins API](https://platform.claude.com/docs/en/manage-claude/plugins-api) `GET` endpoint, including file downloads, with a single read-only scope (for security-audit integrations; does not include the Spend Limits or Analytics APIs) | `read:org_audit` | The Compliance and Analytics APIs must be enabled for your organization before keys with those scopes can be used. See [Set up the Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api-access#set-up-the-compliance-api) and [Get access to the Claude Enterprise Analytics API](https://platform.claude.com/docs/en/manage-claude/analytics-api#get-access-to-the-claude-enterprise-analytics-api). diff --git a/content/en/manage-claude/admin-api.md b/content/en/manage-claude/admin-api.md index 5dd2a4f433..15c969f673 100644 --- a/content/en/manage-claude/admin-api.md +++ b/content/en/manage-claude/admin-api.md @@ -30,7 +30,7 @@ The Admin API accepts any of these three credentials: An Admin API key covers most endpoints. The service-account, federation-issuer, and federation-rule endpoints accept only an `org:admin` OAuth token. Send a personal key or service account key in the `x-api-key` header, as you would an Admin API key. The following examples call the [organization info endpoint](https://platform.claude.com/docs/en/manage-claude/admin-api#accessing-organization-info) with an OAuth token and with an Admin API key. -The Python, TypeScript, C#, Go, Java, PHP, and Ruby SDKs expose the endpoints on this page under `client.organization` (csharp, go: `client.Organization`; java: `client.organization()`; php: `$client->organization`), and the `ant` CLI under `ant organization`. The examples on this page use the default client, which reads an Admin API key from `ANTHROPIC_API_KEY` or an OAuth bearer token from `ANTHROPIC_AUTH_TOKEN`. SDK list methods in Python, TypeScript, C#, Go, and Java return an iterator that fetches more pages on demand, so `limit` sets the page size, not the total. The PHP, Ruby, and curl examples return one page. In the CLI, `--limit` caps the results on the member, invite, workspace, workspace-member, and API-key lists. For each endpoint's parameters and responses, see the [Admin API reference](https://platform.claude.com/docs/en/api/organization). +The SDK exposes the endpoints on this page under `client.organization` (csharp, go: `client.Organization`; java: `client.organization()`; php: `$client->organization`), and the `ant` CLI under `ant organization`. The examples on this page use the default client, which reads an Admin API key from `ANTHROPIC_API_KEY` or an OAuth bearer token from `ANTHROPIC_AUTH_TOKEN`. SDK list methods in Python, TypeScript, C#, Go, and Java return an iterator that fetches more pages on demand, so `limit` sets the page size, not the total. The PHP, Ruby, and curl examples return one page. In the CLI, `--limit` caps the results on the member, invite, workspace, workspace-member, and API-key lists. For each endpoint's parameters and responses, see the [Admin API reference](https://platform.claude.com/docs/en/api/organization). ### OAuth bearer token @@ -43,7 +43,7 @@ export ANTHROPIC_AUTH_TOKEN=$(ant auth print-credentials --profile admin --acces Interactive tokens are short-lived. If requests start returning 401, re-run the `export` command to refresh the token. -The SDKs and the `ant` CLI read `ANTHROPIC_AUTH_TOKEN` automatically. Leave `ANTHROPIC_API_KEY` unset in the same shell so they send the bearer token. Automated workloads skip the login: they authenticate through workload identity federation, and the SDKs and CLI perform the token exchange from the federation environment variables. See [Bootstrap a workload to manage WIF](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#bootstrap-a-workload-to-manage-wif). +The SDK and the `ant` CLI read `ANTHROPIC_AUTH_TOKEN` automatically. Leave `ANTHROPIC_API_KEY` unset in the same shell so they send the bearer token. Automated workloads skip the login: they authenticate through workload identity federation, and the SDK and CLI perform the token exchange from the federation environment variables. See [Bootstrap a workload to manage WIF](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#bootstrap-a-workload-to-manage-wif). Call the Admin API with the exported token: @@ -1342,7 +1342,7 @@ Remove a member from a workspace: ### API keys -Monitor and manage [API keys](https://platform.claude.com/docs/en/api/organization/api_keys/list). Each key in the response includes its `expires_at` timestamp (`null` for keys without an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration)) and `principal`, the identity it acts as (see [Key types](https://platform.claude.com/docs/en/manage-claude/authentication#key-types)). For a personal key, `principal` is `{"type": "user_actor", "user_id": "user_..."}`; for a service account key, `{"type": "service_account_actor", "service_account_id": "svac_..."}`; and for a workspace key, `null`. Each key also has a `scope` object: `{"type": "workspace", "workspace_id": "wrkspc_..."}` for a key bound to one workspace, or `{"type": "organization"}` for a key that can work across any workspace the account has access to. The top-level `workspace_id` field is deprecated and is `null` both for keys bound to the Default Workspace and for keys without a workspace scope; use `scope` to tell them apart. Filtering the list by `workspace_id` with the Default Workspace's ID returns only keys bound to the Default Workspace; keys without a workspace scope aren't returned under any `workspace_id` filter. +Monitor and manage [API keys](https://platform.claude.com/docs/en/api/organization/api_keys/list). Each key in the response includes its `expires_at` timestamp (`null` for keys without an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration)) and `principal`, the identity it acts as (see [Key types](https://platform.claude.com/docs/en/manage-claude/authentication#key-types)). For a personal key, `principal` is `{"type": "user_actor", "user_id": "user_..."}`. For a service account key, it is `{"type": "service_account_actor", "service_account_id": "svac_..."}`. For a workspace key, it is `null`. Each key also has a `scope` object: `{"type": "workspace", "workspace_id": "wrkspc_..."}` for a key bound to one workspace, or `{"type": "organization"}` for a key that can work across any workspace the account has access to. Filtering the list by `workspace_id` with the Default Workspace's ID returns only keys bound to the Default Workspace; keys without a workspace scope aren't returned under any `workspace_id` filter. List the active API keys in a workspace: @@ -1612,15 +1612,15 @@ Rename or deactivate an API key: ### Service accounts -Create and manage service accounts (`svac_...`), the non-human identities that [service account keys](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) and [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) tokens act as. These endpoints, like the federation-issuer and federation-rule endpoints, require an `org:admin` OAuth token. See [Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#service-accounts). +Create and manage service accounts (`svac_...`), the non-human identities that [service account keys](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) and [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) tokens act as. These endpoints, like the federation-issuer and federation-rule endpoints, require an `org:admin` OAuth token. See [Service accounts in Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#service-accounts). ### Federation issuers -Register the OIDC identity providers (`fdis_...`) whose tokens may assert workload identity for your organization. See [Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#federation-issuers). +Register the OIDC identity providers (`fdis_...`) whose tokens may assert workload identity for your organization. See [Federation issuers in Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#federation-issuers). ### Federation rules -Manage the rules (`fdrl_...`) that map issuer tokens to service accounts and scopes. See [Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#federation-rules). +Manage the rules (`fdrl_...`) that map issuer tokens to service accounts and scopes. See [Federation rules in Manage WIF with the Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#federation-rules). ## Accessing organization info diff --git a/content/en/manage-claude/analytics-api.md b/content/en/manage-claude/analytics-api.md index 987dbec9d0..d851fd9f49 100644 --- a/content/en/manage-claude/analytics-api.md +++ b/content/en/manage-claude/analytics-api.md @@ -46,13 +46,13 @@ The Claude Code Analytics API is available to every organization with access to ```bash curl "https://api.anthropic.com/v1/organizations/usage_report/claude_code?starting_at=2025-09-08" \ - --header "anthropic-version: 2023-06-01" \ - --header "x-api-key: $ANTHROPIC_ADMIN_KEY" + -H "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_ADMIN_KEY" ``` -For the available metrics, request parameters, and response schema, see the [Claude Code Analytics API guide](https://platform.claude.com/docs/en/manage-claude/claude-code-analytics-api) and the [API reference](https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_claude_code). +For the available metrics, request parameters, and response schema, see the [Claude Code Analytics API](https://platform.claude.com/docs/en/manage-claude/claude-code-analytics-api) guide and the [API reference](https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_claude_code). ## Get access to the Claude Enterprise Analytics API @@ -85,9 +85,9 @@ For endpoint details, parameters, and response schemas, see the [Claude Enterpri Claude Enterprise Analytics API data is available for dates on or after January 1, 2026. -**Engagement and adoption endpoints** (user activity, summaries, projects, skills, connectors) return a per-day snapshot for the date you specify. Data for a given day is typically available by about 13:00–13:30 UTC the following day (a 1-day lag); until then, the most recent available day is usually two days before the current UTC date. Data arrives later on days when an upstream data pipeline runs late, and exact freshness varies by query, so rather than assuming a fixed time, check the error response: requesting a date that is not yet available returns a 400 error naming the most recent available day. If data is not available well past the typical lag, it usually indicates a data pipeline failure on Anthropic's side; contact support if the gap persists. +**Engagement and adoption endpoints** (user activity, summaries, projects, skills, connectors) return a per-day snapshot for the date you specify. Data for a given day is typically available by about 13:00–13:30 UTC the following day (a 1-day lag); until then, the most recent available day is usually 2 days before the current UTC date. Data arrives later on days when an upstream data pipeline runs late, and exact freshness varies by query, so rather than assuming a fixed time, check the error response: requesting a date that is not yet available returns a 400 error naming the most recent available day. If data is not available well past the typical lag, it usually indicates a data pipeline failure on Anthropic's side; contact support if the gap persists. -**Cost and usage endpoints** follow a different freshness model. Data is typically available within four hours of the underlying usage but may take up to 24 hours. Values can be revised as late events arrive and reconciliation runs, until about 7 days after the end of the calendar month. For example, values for October 1 can change until about November 7. For invoicing-grade totals, query only months that ended at least 7 days ago. +**Cost and usage endpoints** follow a different freshness model. Data is typically available within 4 hours of the underlying usage but might take up to 24 hours. Values can be revised as late events arrive and reconciliation runs, until about 7 days after the end of the calendar month. For example, values for October 1 can change until about November 7. For invoicing-grade totals, query only months that ended at least 7 days ago. Cost and usage responses include a `data_refreshed_at` timestamp. When `ending_at` is omitted (the default is the current time), the response includes a tail of data after `data_refreshed_at` that is incomplete. For stable results across repeated calls, set `ending_at` to a value at or before a previously returned `data_refreshed_at`. @@ -105,7 +105,7 @@ As more users start using Chat and Cowork unified, usage moves out of your chat Some activity from users of Chat and Cowork unified, such as voice mode, can still be reported under chat or Cowork. A user's activity can also be split between products on the day they start using Chat and Cowork unified. The same is true on the day it is turned off for them. How the activity splits is not guaranteed. -A user can appear in both the chat or Cowork counts and the Chat and Cowork unified counts. This can happen on a day when they use Chat and Cowork unified and some of their activity is still reported under chat or Cowork. Weekly and monthly counts can include them in both when the window has activity of both kinds, even on different days. For example, the window might cover days before and after they started using Chat and Cowork unified. +A user can appear in both the chat or Cowork counts and the Chat and Cowork unified counts. This can occur on a day when they use Chat and Cowork unified and some of their activity is still reported under chat or Cowork. Weekly and monthly counts can include them in both when the window has activity of both kinds, even on different days. For example, the window might cover days before and after they started using Chat and Cowork unified. When you filter user activity by project, each day's project activity is counted in one place only. If a user sent a chat message in Chat and Cowork unified that day, all their project activity is counted in `chat_cowork_unified_metrics.chat`. Otherwise, it is counted in `chat_metrics`. @@ -119,9 +119,9 @@ When you filter user activity by project, each day's project activity is counted **List parameters use bracket notation.** Repeat the parameter for each value, for example `products[]=chat&products[]=claude_code`. -**Amount fields are decimal strings in cents.** Currency amounts are returned as decimal strings such as `"41280.000000"` (which represents $412.80). To convert to dollars, parse as a decimal and divide by 100. Avoid binary floating-point parsing for values that may exceed several million dollars. +**Amount fields are decimal strings in cents.** Currency amounts are returned as decimal strings such as `"41280.000000"` (which represents $412.80 USD). To convert to dollars, parse as a decimal and divide by 100. Avoid binary floating-point parsing for values that might exceed several million dollars. -**Rate limits apply at the organization level**, not per key, with a default of 60 requests per minute across all endpoints in this API. If that is not sufficient for your use case, contact your Anthropic account team to discuss adjusting the limit. +**Rate limits apply at the organization level**, not for each key, with a default of 60 requests per minute across all endpoints in this API. If that is not sufficient for your use case, contact your Anthropic account team to discuss adjusting the limit. ## Versioning diff --git a/content/en/manage-claude/api-and-data-retention.md b/content/en/manage-claude/api-and-data-retention.md index 07a9b60a54..5cc2d75e47 100644 --- a/content/en/manage-claude/api-and-data-retention.md +++ b/content/en/manage-claude/api-and-data-retention.md @@ -10,7 +10,7 @@ Anthropic offers two data handling arrangements for the Claude API: [zero data r ## How Anthropic approaches data retention -Different APIs and features have different storage needs. Where a feature does not require storage of customer prompts or responses, it may be eligible for ZDR. Where a feature necessarily requires storage, Anthropic designs for the smallest possible retention footprint under the following commitments: +Different APIs and features have different storage needs. Where a feature does not require storage of customer prompts or responses, it might be eligible for ZDR. Where a feature necessarily requires storage, Anthropic designs for the smallest possible retention footprint under the following commitments: * Retained data is never used for model training without your express permission. * Only what is technically necessary for the feature to work is retained. Conversation content (your prompts and Claude's outputs) is not retained by default; the exception is [Covered Models](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements), which require 30-day retention. @@ -24,7 +24,7 @@ Under a ZDR arrangement, Anthropic does not store customer prompts or responses ### What ZDR covers -* **Claude Messages and Token Counting APIs:** ZDR applies to these endpoints for eligible features listed in the [feature eligibility table](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#feature-eligibility). Features that ride on `/v1/messages` but are marked "No" in the table (such as code execution) are not covered. +* **Claude Messages and Token Counting APIs:** ZDR applies to these endpoints for eligible features listed in the [feature eligibility table](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#feature-eligibility). Features that use `/v1/messages` but are marked "No" in the table (such as code execution) are not covered. * **Claude Code with API keys:** ZDR applies when Claude Code is used with API keys from a Commercial organization (an organization under Anthropic's Commercial Terms of Service, as distinct from a consumer Claude account). If metrics logging is enabled in Claude Code, productivity data such as usage statistics is exempted from ZDR and may be retained. Claude Code on Claude Enterprise is not covered by this arrangement and has a separate ZDR offering; see [What ZDR does not cover](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#what-zdr-does-not-cover). * **Claude Platform on AWS:** [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws) follows the same data retention policy as the first-party Claude API. ZDR is available on request; contact your Anthropic account representative to enable it. @@ -165,45 +165,45 @@ Each eligibility column uses three values: * **Yes (qualified):** Your prompts and Claude's outputs are not stored, but a bounded technical artifact (named in the Details column) is retained briefly for the feature to function. See [How Anthropic approaches data retention](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#how-anthropic-approaches-data-retention) for the commitments that govern these features. * **No:** The feature is not eligible. Under HIPAA readiness, the API blocks requests that include a "No" feature and returns a `400` error, unless the feature's Details column says otherwise. Under ZDR, the API does **not** block these features; using one is a choice to step outside your ZDR arrangement for that specific data, and the feature's own documented retention policy applies. Features marked "No" for ZDR are typically stateful (they store jobs, files, or container state), which is why they cannot be zero-retention. -| Feature | Endpoint | ZDR eligible | HIPAA eligible | Details | -| -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) | `/v1/messages` | Yes | Yes | | -| [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | `/v1/messages` | Yes | Yes | | -| [Advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) | `/v1/messages`
with `advisor` tool | Yes | No | Advisor model output is returned in the API response; nothing is stored server-side after the response. | -| [Agent skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) | `/v1/skills`
`/v1/messages` with `skills` | No | No | Skill data retained per standard policy. See [Agent skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#data-retention). | -| [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) | `/v1/messages`
with `bash` tool | Yes | Yes | Client-side tool executed in your environment. | -| [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) | `/v1/messages/batches` | No | No | 29-day retention; async storage required. See [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing#data-retention). | -| [Browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) | `/v1/messages`
with `browser` toolset | Yes | No | Client-side tool. Anthropic does not run browser actions or retain page content beyond standard API handling. Not covered under HIPAA readiness; requests that include the browser use tool are not blocked. See [Browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#data-retention). | -| [Cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) | `/v1/messages`
with `diagnostics` | Yes (qualified) | No | Your prompts and Claude's outputs are not stored. A fingerprint of cryptographic hashes and token-count estimates is retained briefly to enable comparison against the next request. See [Cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#data-retention). | -| [Citations](https://platform.claude.com/docs/en/build-with-claude/citations) | `/v1/messages` | Yes | Yes | | -| [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) | `/v1/agents`
`/v1/sessions`
`/v1/environments` | No | No | Sessions are stateful resources; transcripts persist until you delete them. Applies to all Managed Agents sub-features, including [Self-hosted sandboxes](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes). | -| [Code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) | `/v1/messages`
with `code_execution` tool | No | No | Container data retained up to 30 days. See [Code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#data-retention). | -| [Computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) | `/v1/messages`
with `computer` toolset or tool | Yes | Yes | Client-side tool where screenshots and files are captured and stored in your environment, not by Anthropic. See [Computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#data-retention). | -| [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) | `/v1/messages`
with `context_management` | Yes | No | Context edits (tool use clearing and thinking clearing) are applied in real time. | -| [Context management (compaction)](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) | `/v1/messages`
with `context_management` | Yes | No | Server-side compaction results are returned and round-tripped statelessly through the API response. | -| [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) | `/v1/messages`
with `inference_geo` | Yes | Yes | | -| [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) | `/v1/messages`
with `effort` | Yes | Yes | | -| [Fast mode](https://platform.claude.com/docs/en/build-with-claude/fast-mode) | `/v1/messages`
with `speed: "fast"` | Yes | Yes | Same Messages API endpoint with faster inference. ZDR applies regardless of speed setting. | -| [Files API](https://platform.claude.com/docs/en/build-with-claude/files) | `/v1/files` | No | No | Files retained until explicitly deleted or they reach their configured expiration. See [Files API](https://platform.claude.com/docs/en/build-with-claude/files#data-retention). | -| [Fine-grained tool streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming) | `/v1/messages` | Yes | Yes | | -| [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) | `/v1/messages`
with `mcp_servers` | No | No | Data retained per standard policy. See [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#data-retention). | -| [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) | `/v1/tunnels` | No | No | Research preview. See [MCP tunnels security](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/security) for the data-flow boundary and subprocessor details. | -| [Memory tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool) | `/v1/messages`
with `memory` tool | Yes | Yes | Client-side memory storage where you control data retention. | -| [Messages API](https://platform.claude.com/docs/en/build-with-claude/working-with-messages) | `/v1/messages` | Yes | Yes | Standard API calls for generating Claude responses. | -| [Mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) | `/v1/messages`
with `role: "system"` messages | Yes | Yes | Request-shape capability of the Messages API; mid-conversation system messages flow through the standard inference path and nothing is stored server-side after the response. | -| [OpenTelemetry export](https://platform.claude.com/docs/en/manage-claude/opentelemetry) | `/v1/organizations/telemetry_destinations` | Yes | No | Beta. Spans have the same ZDR eligibility as the feature that produces them. HIPAA organizations can export metadata. SDK spans go directly from your environment to your exporter. After delivery, the data is held by the service that you chose, outside Anthropic, under that service's retention and access controls. | -| [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support) | `/v1/messages` | Yes | Yes | HIPAA eligibility applies to PDFs sent inline through the Messages API, not through the Files API. | -| [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) | `/v1/messages`
with `code_execution` tool | No | No | Built on code execution containers; data retained up to 30 days. See [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling#data-retention). | -| [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) | `/v1/messages` | Yes | Yes | Your prompts and Claude's outputs are not stored. KV cache representations and cryptographic hashes are held in memory for the cache TTL and promptly deleted after expiry. See [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#data-retention). | -| [Search results](https://platform.claude.com/docs/en/build-with-claude/search-results) | `/v1/messages`
with `search_results` source | Yes | Yes | | -| [Structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) | `/v1/messages` | Yes (qualified) | Yes | Your prompts and Claude's outputs are not stored. Only the JSON schema is cached, for up to 24 hours since last use. This also covers [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use) (`strict: true` on tools), which uses the same grammar pipeline. PHI must not be included in JSON schema definitions; see [PHI handling guidelines](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#phi-handling-guidelines). See [Structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#data-retention). | -| [Text editor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/text-editor-tool) | `/v1/messages`
with `text_editor` tool | Yes | Yes | Client-side tool executed in your environment. | -| [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | `/v1/messages`
with `thinking` | Yes | Yes | | -| [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) | `/v1/messages/count_tokens` | Yes | Yes | Count tokens before sending requests. | -| [Tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) | `/v1/messages`
with `tool_search` tool | Yes | No | Server-side tool executed by Anthropic; the tool definitions in the request are searched in memory per call and nothing is stored after the response. | -| [User profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles) | `/v1/user_profiles` | No | No | Profiles are metadata about your end customers and don't contain prompts or outputs. The profile data you send is retained per standard policy until you delete the profile. Not covered under HIPAA readiness; requests to `/v1/user_profiles` are not blocked. See [User profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles#what-a-profile-contains-and-how-anthropic-uses-it). | -| [Web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) | `/v1/messages`
with `web_fetch` tool | Yes | No | Fetched web content returned in the API response. [Dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#dynamic-filtering) is not eligible for ZDR or HIPAA. Website publishers may retain request data (such as fetched URLs and request metadata) according to their own policies. | -| [Web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) | `/v1/messages`
with `web_search` tool | Yes | Yes | Real-time web search results returned in the API response. [Dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering) is not eligible for ZDR or HIPAA. | +| Feature | Endpoint | ZDR eligible | HIPAA eligible | Details | +| -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) | `/v1/messages` | Yes | Yes | | +| [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | `/v1/messages` | Yes | Yes | | +| [Advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) | `/v1/messages`
with `advisor` tool | Yes | No | Advisor model output is returned in the API response; nothing is stored server-side after the response. | +| [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) | `/v1/skills`
`/v1/messages` with `skills` | No | No | Skill data retained per standard policy. See [Agent Skills data retention](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview#data-retention). | +| [Bash tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/bash-tool) | `/v1/messages`
with `bash` tool | Yes | Yes | Client-side tool run in your environment. | +| [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) | `/v1/messages/batches` | No | No | 29-day retention; async storage required. See [Batch processing data retention](https://platform.claude.com/docs/en/build-with-claude/batch-processing#data-retention). | +| [Browser use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) | `/v1/messages`
with `browser` toolset | Yes | No | Client-side tool. Anthropic does not run browser actions or retain page content beyond standard API handling. Not covered under HIPAA readiness; requests that include the browser use tool are not blocked. See [Browser use data retention](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool#data-retention). | +| [Cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) | `/v1/messages`
with `diagnostics` | Yes (qualified) | No | Your prompts and Claude's outputs are not stored. A fingerprint of cryptographic hashes and token-count estimates is retained briefly to allow comparison against the next request. See [Cache diagnostics data retention](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics#data-retention). | +| [Citations](https://platform.claude.com/docs/en/build-with-claude/citations) | `/v1/messages` | Yes | Yes | | +| [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) | `/v1/agents`
`/v1/sessions`
`/v1/environments` | No | No | Sessions are stateful resources; transcripts persist until you delete them. Applies to all Managed Agents sub-features, including [Self-hosted sandboxes](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes). | +| [Code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) | `/v1/messages`
with `code_execution` tool | No | No | Container data retained up to 30 days. See [Code execution data retention](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#data-retention). | +| [Computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) | `/v1/messages`
with `computer` toolset or tool | Yes | Yes | Client-side tool where screenshots and files are captured and stored in your environment, not by Anthropic. See [Computer use data retention](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#data-retention). | +| [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) | `/v1/messages`
with `context_management` | Yes | No | Context edits (tool use clearing and thinking clearing) are applied in real time. | +| [Context management (compaction)](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold) | `/v1/messages`
with `context_management` | Yes | No | Server-side compaction results are returned and round-tripped statelessly through the API response. | +| [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) | `/v1/messages`
with `inference_geo` | Yes | Yes | | +| [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) | `/v1/messages`
with `effort` | Yes | Yes | | +| [Fast mode](https://platform.claude.com/docs/en/build-with-claude/fast-mode) | `/v1/messages`
with `speed: "fast"` | Yes | Yes | Same Messages API endpoint with faster inference. ZDR applies regardless of speed setting. | +| [Files API](https://platform.claude.com/docs/en/build-with-claude/files) | `/v1/files` | No | No | Files retained until explicitly deleted or they reach their configured expiration. See [Files API file lifecycle](https://platform.claude.com/docs/en/build-with-claude/files#data-retention). | +| [Fine-grained tool streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming) | `/v1/messages` | Yes | Yes | | +| [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector) | `/v1/messages`
with `mcp_servers` | No | No | Data retained per standard policy. See [MCP connector data retention](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#data-retention). | +| [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) | `/v1/tunnels` | No | No | Research preview. See [MCP tunnels security](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/security) for the data-flow boundary and subprocessor details. | +| [Memory tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool) | `/v1/messages`
with `memory` tool | Yes | Yes | Client-side memory storage where you control data retention. | +| [Messages API](https://platform.claude.com/docs/en/build-with-claude/working-with-messages) | `/v1/messages` | Yes | Yes | Standard API calls for generating Claude responses. | +| [Mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) | `/v1/messages`
with `role: "system"` messages | Yes | Yes | Request-shape capability of the Messages API; mid-conversation system messages flow through the standard inference path and nothing is stored server-side after the response. | +| [OpenTelemetry export](https://platform.claude.com/docs/en/manage-claude/opentelemetry) | `/v1/organizations/telemetry_destinations` | Yes | No | Beta. Spans have the same ZDR eligibility as the feature that produces them. HIPAA organizations can export metadata. SDK spans go directly from your environment to your exporter. After delivery, the data is held by the service that you chose, outside Anthropic, under that service's retention and access controls. | +| [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support) | `/v1/messages` | Yes | Yes | HIPAA eligibility applies to PDFs sent inline through the Messages API, not through the Files API. | +| [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) | `/v1/messages`
with `code_execution` tool | No | No | Built on code execution containers; data retained up to 30 days. See [Programmatic tool calling data retention](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling#data-retention). | +| [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) | `/v1/messages` | Yes | Yes | Your prompts and Claude's outputs are not stored. KV cache representations and cryptographic hashes are held in memory for the cache TTL and promptly deleted after expiry. See [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#data-retention). | +| [Search results](https://platform.claude.com/docs/en/build-with-claude/search-results) | `/v1/messages`
with `search_results` source | Yes | Yes | | +| [Structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) | `/v1/messages` | Yes (qualified) | Yes | Your prompts and Claude's outputs are not stored. Only the JSON schema is cached, for up to 24 hours since last use. This also covers [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use) (`strict: true` on tools), which uses the same grammar pipeline. PHI must not be included in JSON schema definitions; see [PHI handling guidelines](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#phi-handling-guidelines). See [Structured outputs data retention](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#data-retention). | +| [Text editor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/text-editor-tool) | `/v1/messages`
with `text_editor` tool | Yes | Yes | Client-side tool run in your environment. | +| [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) | `/v1/messages`
with `thinking` | Yes | Yes | | +| [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) | `/v1/messages/count_tokens` | Yes | Yes | Count tokens before sending requests. | +| [Tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) | `/v1/messages`
with `tool_search` tool | Yes | No | Server-side tool run by Anthropic; the tool definitions in the request are searched in memory per call and nothing is stored after the response. | +| [User profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles) | `/v1/user_profiles` | No | No | Profiles are metadata about your end customers and don't contain prompts or outputs. The profile data you send is retained per standard policy until you delete the profile. Not covered under HIPAA readiness; requests to `/v1/user_profiles` are not blocked. See [What a profile contains and how Anthropic uses it](https://platform.claude.com/docs/en/manage-claude/user-profiles#what-a-profile-contains-and-how-anthropic-uses-it). | +| [Web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) | `/v1/messages`
with `web_fetch` tool | Yes | No | Fetched web content returned in the API response. [Dynamic filtering for web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#dynamic-filtering) is not eligible for ZDR or HIPAA. Website publishers might retain request data (such as fetched URLs and request metadata) according to their own policies. | +| [Web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) | `/v1/messages`
with `web_search` tool | Yes | Yes | Real-time web search results returned in the API response. [Dynamic filtering for web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#dynamic-filtering) is not eligible for ZDR or HIPAA. | ## Retention regardless of arrangement diff --git a/content/en/manage-claude/app-attest.md b/content/en/manage-claude/app-attest.md index 663a13a7fa..c3e98ce550 100644 --- a/content/en/manage-claude/app-attest.md +++ b/content/en/manage-claude/app-attest.md @@ -16,7 +16,7 @@ App Attest authentication is available only when your app calls the Claude API d The first time your app uses Claude on a device, the app requests a challenge from Anthropic, attests the device with Apple's `DCAppAttestService`, and exchanges the verified attestation for an access token. The Claude for Foundation Models package runs this flow automatically and requests new tokens as they expire; there is no attestation code for you to write. -Tokens are scoped to your workspace, expire after one hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. They carry no end-user identity: App Attest identifies your app, not the person using it, so handle any per-user logic in your app. +Tokens are scoped to your workspace, expire after 1 hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. They carry no end-user identity: App Attest identifies your app, not the person using it, so handle any per-user logic in your app. ## Set up App Attest diff --git a/content/en/manage-claude/authentication.md b/content/en/manage-claude/authentication.md index ddffbf2205..26434b5842 100644 --- a/content/en/manage-claude/authentication.md +++ b/content/en/manage-claude/authentication.md @@ -22,13 +22,13 @@ API keys are static secrets that you generate in the Claude Console and send on When you create a key, you choose its type, which determines what the key can do, where it works, and when it stops working: -| Key type | Acts as | Works in | Stops working when | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Personal key** | You, the user, with your roles and permissions | Either a single workspace or the workspaces where your role allows API use, chosen when the key is created | You lose access to the organization or, for a single-workspace key, to that workspace. Personal keys are archived when you are removed from the organization. If you are re-invited, create new keys; archived keys are not restored | -| **Service account key** | A [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts) | Either a single workspace or anything the service account has access to, chosen when the key is created. A service account has access to the Default Workspace and to workspaces it has been added to | The service account is archived or, for a single-workspace key, is removed from that workspace | -| **Workspace key** (legacy) | No one: it belongs to the workspace it was created in | That workspace | It expires, is disabled or deleted, or its workspace is archived, regardless of whether its creator leaves the organization | +| Key type | Acts as | Works in | Stops working when | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Personal key** | You, the user, with your roles and permissions | Either a single workspace or the workspaces where your role allows API use, chosen when the key is created | You lose access to the organization. A single-workspace key also stops working when you lose access to that workspace or that workspace is archived. Personal keys are archived when you are removed from the organization. If you are re-invited, create new keys; archived keys are not restored | +| **Service account key** | A [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts) | Either a single workspace or anything the service account has access to, chosen when the key is created. A service account has access to the Default Workspace and to workspaces it has been added to | The service account is archived. A single-workspace key also stops working when the service account is removed from that workspace or that workspace is archived | +| **Workspace key** (legacy) | No one: it belongs to the workspace it was created in | That workspace | It expires, is disabled or deleted, or its workspace is archived, regardless of whether its creator leaves the organization | -Personal keys and service account keys are identity-backed: each belongs to a user or service account your organization already manages, and every request acts as that identity. When that identity is removed from the organization, the key stops working. This means that keys won't accidentally outlive the people or workloads that own them. Prefer them over workspace keys for new integrations. +Personal keys and service account keys are identity-backed: each belongs to a user or service account your organization already manages, and every request acts as that identity. When that identity is removed from the organization, the key stops working. This means that keys don't accidentally outlive the people or workloads that own them. Prefer them over workspace keys for new integrations. Use a personal key for your own development and scripts. A shared personal key acts as one person and breaks when they leave. For shared or automated workloads (CI, production services), have an organization admin create a service account so the workload has its own identity. @@ -36,8 +36,8 @@ Workspace API keys still work but should be considered legacy; identity-backed k ### Create and use a key -* **Create a key:** In the Claude Console, go to the [API keys](https://platform.claude.com/settings/keys) page (`platform.claude.com/settings/keys`) and click **Create key**. Name the key and choose an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration). Set **Linked account** to yourself for a personal key, or to a service account for a key shared across multiple users. You can also scope the key to a specific workspace, which lets you skip setting a workspace ID manually in future requests. -* **Use the key:** Send it as `Authorization: Bearer ` on direct HTTP requests, or set the `ANTHROPIC_API_KEY` environment variable and the [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) pick it up automatically. +* **Create a key:** In the Claude Console, go to the [API keys](https://platform.claude.com/settings/keys) page (`platform.claude.com/settings/keys`) and click **Create key**. Name the key and select an [expiration](https://platform.claude.com/docs/en/manage-claude/authentication#key-expiration). Set **Linked account** to yourself for a personal key, or to a service account for a key shared across multiple users. You can also scope the key to a specific workspace, which lets you skip setting a workspace ID manually in future requests. +* **Use the key:** Send it as `Authorization: Bearer ` on direct HTTP requests, or set the `ANTHROPIC_API_KEY` environment variable and the [client SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) picks it up automatically. ```http POST /v1/messages @@ -63,6 +63,11 @@ Store API keys in a secrets manager, rotate them periodically, and disable or de }' ``` + ```bash CLI + # See /docs/en/cli-sdks-libraries/cli/authentication#api-key for zsh, bash, and Windows variants + export ANTHROPIC_API_KEY=sk-ant-api03-... + ``` + ```python Python client = Anthropic(api_key="my-anthropic-api-key") # or, with ANTHROPIC_API_KEY set in the environment: @@ -114,18 +119,13 @@ Store API keys in a secrets manager, rotate them periodically, and disable or de # or, with ANTHROPIC_API_KEY set in the environment: anthropic = Anthropic::Client.new ``` - - ```bash CLI - # See /docs/en/cli-sdks-libraries/cli/authentication#api-key for zsh, bash, and Windows variants - export ANTHROPIC_API_KEY=sk-ant-api03-... - ``` ### Select a workspace API keys that are created for a specific workspace only work in that workspace, and API requests using these keys can omit the workspace ID. -If your API key isn't scoped to a workspace, you must specify the workspace ID in the `anthropic-workspace-id` header for each request. See the following example for how to set this header in a request or in SDKs. +If your API key isn't scoped to a workspace, you must specify the workspace ID in the `anthropic-workspace-id` header for each request. See the following example for how to set this header in a request or in the SDK. The [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) accepts a personal key or service account key only if the key isn't scoped to a specific workspace. @@ -204,7 +204,7 @@ You can find a workspace's ID in the **ID** column on the [Workspaces](https://p { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }; // Required on every request for a multi-workspace key. @@ -316,7 +316,7 @@ If a request made with a key that isn't scoped to a workspace omits the header, "type": "error", "error": { "type": "invalid_request_error", - "message": "anthropic-workspace-id is required when authenticating with an identity-linked API key; send the id of the workspace this request acts in." + "message": "This API key is not scoped to a workspace, so this request must include the anthropic-workspace-id header with the ID of the workspace to use. Add the header, or use an API key that is scoped to a workspace." }, "request_id": "req_011CSHoEeqs5C35K2UUqR7Fy" } @@ -342,27 +342,27 @@ Expiration limits the lifetime of a leaked credential, but it is not a substitut If you have a workspace key, you may want to replace it with [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/wif-reference) or a personal or service account key. This provides better security and observability. -See [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/wif-reference) for details on configuring Workload Identity Federation, which is preferred over long-lived keys. +See the [WIF reference](https://platform.claude.com/docs/en/manage-claude/wif-reference) for details on configuring Workload Identity Federation, which is preferred over long-lived keys. To replace a workspace key with a personal or service account key: 1. **Decide the key type.** Your own tooling should use a personal key. A shared or unattended workload should use a service account key. -2. **Create a service account** if necessary. You may have to ask an organization admin to create one on the [Service accounts](https://platform.claude.com/settings/service-accounts) page (`platform.claude.com/settings/service-accounts`) in the Claude Console and add it to the relevant workspace. +2. **Create a service account** if necessary. You might have to ask an organization admin to create one on the [Service accounts](https://platform.claude.com/settings/service-accounts) page (`platform.claude.com/settings/service-accounts`) in the Claude Console and add it to the relevant workspace. 3. **Create the new key.** Create it specifically for the integration's workspace unless multiple workspaces are needed. -4. **Deploy the new key.** Replace the old key wherever the integration reads it, typically the `ANTHROPIC_API_KEY` environment variable or a secrets manager entry. For a multi-workspace key, also send the `anthropic-workspace-id` header as shown in [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). +4. **Deploy the new key.** Replace the old key wherever the integration reads it, typically the `ANTHROPIC_API_KEY` environment variable or a secrets manager entry. For a key that isn't scoped to a workspace, also send the `anthropic-workspace-id` header as shown in [Select a workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace). 5. **Delete the old key.** Confirm that requests succeed, then delete the workspace key on the [API keys page](https://platform.claude.com/settings/keys) in the Claude Console. ## Workload Identity Federation Workload Identity Federation (WIF) lets a workload authenticate with a short-lived identity token issued by an identity provider (IdP) you already trust, such as AWS IAM, Google Cloud, or any standards-compliant OIDC issuer (such as GitHub Actions, Kubernetes service accounts, SPIFFE, Microsoft Entra ID, or Okta). The workload exchanges its IdP-issued JWT at `POST /v1/oauth/token` for a short-lived Claude API access token, and the SDK refreshes that token automatically before it expires. There is no `sk-ant-api...` string to mint, distribute, or rotate. -Federation removes long-lived Claude API keys from your environment, which shrinks the blast radius of a leaked credential and lets you manage access with the same IdP controls you already use for cloud resources. It does not, on its own, guarantee end-to-end security: the trust chain is only as strong as your identity provider's configuration, and a long-lived secret one hop upstream (for example, a static cloud credential that can mint IdP tokens) can still undermine it. Pair federation with your provider's controls, such as IP allowlists, MFA, and audit logging. +Federation removes long-lived Claude API keys from your environment, which limits the damage that a leaked credential can cause and lets you manage access with the same IdP controls you already use for cloud resources. It does not, on its own, guarantee end-to-end security: the trust chain is only as strong as your identity provider's configuration, and a long-lived secret one step earlier in that chain (for example, a static cloud credential that can mint IdP tokens) can still undermine it. Pair federation with your provider's controls, such as IP allowlists, MFA, and audit logging. To configure federation, you create three resources in the Claude Console (a service account, a federation issuer, and a federation rule) and then point your SDK at the rule. See [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) for the full setup walkthrough. ## App Attest -App Attest authenticates iOS and macOS apps that call the Claude API directly from the device. Each installation proves that it is a genuine, unmodified build of an app you registered in the Claude Console, using Apple's App Attest service. Anthropic then issues the device a short-lived access token that bills usage to your workspace. Tokens are scoped to your workspace, expire after one hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. +App Attest authenticates iOS and macOS apps that call the Claude API directly from the device. Each installation proves that it is a genuine, unmodified build of an app you registered in the Claude Console, using Apple's App Attest service. Anthropic then issues the device a short-lived access token that bills usage to your workspace. Tokens are scoped to your workspace, expire after 1 hour, and authorize only [Messages API](https://platform.claude.com/docs/en/api/messages/create) calls. To register your app and get a client ID, see [App Attest for iOS and macOS apps](https://platform.claude.com/docs/en/manage-claude/app-attest). diff --git a/content/en/manage-claude/claude-code-analytics-api.md b/content/en/manage-claude/claude-code-analytics-api.md index 7cf19ce30a..23bb59b726 100644 --- a/content/en/manage-claude/claude-code-analytics-api.md +++ b/content/en/manage-claude/claude-code-analytics-api.md @@ -8,9 +8,9 @@ description: Programmatically access your organization's Claude Code usage analy **The Admin API is unavailable for individual accounts.** To collaborate with teammates and add members, set up your organization on the [Organization](https://platform.claude.com/settings/organization) page (`platform.claude.com/settings/organization`) in the Claude Console. -The Claude Code Analytics Admin API provides programmatic access to daily aggregated usage metrics for Claude Code users, enabling organizations to analyze developer productivity and build custom dashboards. This API provides more detail than the basic [Analytics dashboard](https://platform.claude.com/claude-code) in the Claude Console, without the complexity of the OpenTelemetry integration. +The Claude Code Analytics Admin API provides programmatic access to daily aggregated usage metrics for Claude Code users, allowing organizations to analyze developer productivity and build custom dashboards. This API provides more detail than the basic [Analytics dashboard](https://platform.claude.com/claude-code) in the Claude Console, without the complexity of the OpenTelemetry integration. -This API enables you to better monitor, analyze, and optimize your Claude Code adoption: +This API allows you to better monitor, analyze, and optimize your Claude Code adoption: * **Developer productivity analysis:** Track sessions, lines of code added/removed, commits, and pull requests created using Claude Code * **Tool usage metrics:** Monitor acceptance and rejection rates for different Claude Code tools (Edit, MultiEdit, Write, NotebookEdit) @@ -63,7 +63,7 @@ Track Claude Code usage, productivity metrics, and developer activity across you * **Productivity metrics:** Track sessions, lines of code, commits, pull requests, and tool usage * **Token and cost data:** Monitor usage and estimated costs broken down by Claude model * **Cursor-based pagination:** Handle large datasets with stable pagination using opaque cursors -* **Data freshness:** Metrics are available with up to 1-hour delay for consistency +* **Data freshness:** Metrics are available with up to a 1-hour delay for consistency For complete parameter details and response schemas, see the [Claude Code Analytics API reference](https://platform.claude.com/docs/en/api/beta/organization/usage_report/retrieve_claude_code). @@ -212,7 +212,7 @@ The API returns data in the following format: The API supports cursor-based pagination for organizations with large numbers of users: -1. Make your initial request with optional `limit` parameter. +1. Make your initial request with the optional `limit` parameter. 2. If `has_more` is `true` in the response, use the `next_page` value in your next request. 3. Continue until `has_more` is `false`. @@ -270,7 +270,7 @@ The Claude Code Analytics API is free to use for all organizations with access t ### How do I calculate tool acceptance rates? -Tool acceptance rate = `accepted / (accepted + rejected)` for each tool type. For example, if the edit tool shows 45 accepted and 5 rejected, the acceptance rate is 90%. +Tool acceptance rate = `accepted / (accepted + rejected)` for each tool type. For example, if the edit tool shows 45 accepted and 5 rejected, the acceptance rate is 90 percent. ### What time zone is used for the date parameter? diff --git a/content/en/manage-claude/compliance-activity-feed.md b/content/en/manage-claude/compliance-activity-feed.md index 932145d56c..c609c07d0e 100644 --- a/content/en/manage-claude/compliance-activity-feed.md +++ b/content/en/manage-claude/compliance-activity-feed.md @@ -19,8 +19,8 @@ The Activity Feed records authentication, chat, file, project, administrative, a ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/activities?limit=1" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json Response @@ -61,8 +61,8 @@ curl --fail-with-body -sS -G \ --data-urlencode "activity_types[]=claude_file_uploaded" \ --data-urlencode "activity_types[]=claude_chat_created" \ --data-urlencode "created_at.gte=2026-04-01T00:00:00Z" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` The Activity Feed produces hundreds of distinct activity types. See [Query compliance activities](https://platform.claude.com/docs/en/api/compliance/activities/list) in the API reference for the full list of values that `activity_types[]` accepts. @@ -102,14 +102,14 @@ The cursor parameter sets the page direction; the endpoint's sort order sets the # Fetch the first page (newest activities first). curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/activities?limit=2" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" # LAST_ID is the last_id from the first response. Pass it back unchanged to fetch the next (older) page. curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/activities" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "limit=2" \ --data-urlencode "after_id=$LAST_ID" ``` diff --git a/content/en/manage-claude/compliance-api-access.md b/content/en/manage-claude/compliance-api-access.md index 13f3918db3..cde81c62db 100644 --- a/content/en/manage-claude/compliance-api-access.md +++ b/content/en/manage-claude/compliance-api-access.md @@ -41,7 +41,7 @@ Setup is one flow: enable the Compliance API for your organization, then create Where you enable the Compliance API depends on how your organization is set up: - * **Claude Enterprise organizations:** The primary owner enables the Compliance API at [claude.ai > Organization settings > API](https://claude.ai/admin-settings/api-access). Enablement happens at the parent organization level and cascades to every linked organization, both claude.ai and Claude Console. + * **Claude Enterprise organizations:** The primary owner enables the Compliance API at [claude.ai > Organization settings > API](https://claude.ai/admin-settings/api-access). Enablement occurs at the parent organization level and cascades to every linked organization, both claude.ai and Claude Console. * **Standalone Claude Console organizations:** An organization admin turns on the **Compliance API** toggle on the [Compliance](https://platform.claude.com/settings/security) page (`platform.claude.com/settings/security`) in the Claude Console. Enablement is self-service for eligible organizations, and the change takes effect immediately. If the page shows a page-not-found error, or doesn't show the **Compliance API** section, you do not have the admin role, your organization is linked to a parent organization (the Compliance API is enabled from the parent organization instead), or your organization is not eligible for self-service enablement; contact your account team or [Anthropic support](https://support.claude.com) if you are not sure which applies. * **Claude Console organizations linked to a parent organization:** There is nothing to turn on in Claude Console. Ask the primary owner of your parent organization to enable the Compliance API in claude.ai, or contact your account team. diff --git a/content/en/manage-claude/compliance-api.md b/content/en/manage-claude/compliance-api.md index d4407638a0..23534216df 100644 --- a/content/en/manage-claude/compliance-api.md +++ b/content/en/manage-claude/compliance-api.md @@ -15,8 +15,8 @@ The following call returns the most recent activity event in your organization. ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/activities?limit=1" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` A successful response returns a JSON object containing `data` (an array of `Activity` records), `has_more`, `first_id`, and `last_id`: @@ -57,7 +57,7 @@ The Activity Feed (`GET /v1/compliance/activities`) is available to any key that A Claude Enterprise tenant has one parent organization (the top-level container that centralizes identity) with linked organizations of two kinds: claude.ai organizations, where users chat and store content, and Claude Console organizations, where users manage Claude API workloads. For a key that covers the parent organization, the directory endpoints (organizations, users, roles, and groups) return data from every linked organization of either kind. The content endpoints (chats, files, projects, project attachments, and sessions) serve Claude Enterprise data only. The chat, file, and project endpoints return claude.ai chats, files, and projects. The session endpoints return transcripts of sessions on users' machines (local sessions), captured while users are signed in with their Claude Enterprise account: sessions in Cowork, Claude Code, Claude Science, Claude for Microsoft 365, the Claude add-ins for Google Docs, Google Sheets, and Google Slides, and Claude in Chrome. They also return transcripts of Cowork sessions started on claude.ai web or mobile, which run in the cloud in Anthropic-managed environments (remote sessions). A standalone Claude Console organization (one with no parent organization) is not part of a Claude Enterprise tenant; it uses Admin API keys and can query the Activity Feed only. -All `/v1/compliance/*` endpoints share a rate limit of 600 requests per minute per parent organization (for a standalone Claude Console organization, per organization). The local session endpoints count only against that shared limit, and the remote session endpoints carry a second request budget on top. See [429 Too Many Requests](https://platform.claude.com/docs/en/manage-claude/compliance-errors#429-too-many-requests) for the response headers and retry contract. +All `/v1/compliance/*` endpoints share a rate limit of 600 requests per minute for each parent organization (for a standalone Claude Console organization, for each organization). The local session endpoints count only against that shared limit, and the remote session endpoints carry a second request budget on top. See [429 Too Many Requests](https://platform.claude.com/docs/en/manage-claude/compliance-errors#429-too-many-requests) for the response headers and retry contract. *** @@ -81,7 +81,7 @@ Anthropic provides two analytics APIs: the Claude Enterprise Analytics API and t ### OpenTelemetry logging -[Cowork's OpenTelemetry logging](https://support.claude.com/en/articles/14477985-monitor-claude-cowork-activity-with-opentelemetry) and [Claude Code monitoring](https://code.claude.com/docs/en/monitoring-usage) stream per-event telemetry, including token, cost, and host metadata, to a collector you run as activity happens, whereas the Compliance API returns retained per-session transcripts from Anthropic on request and works with your existing Compliance Access Key. OpenTelemetry logging can also capture prompts and responses, but Anthropic recommends the Compliance API for retrieving the content of Cowork and Claude Code sessions. For a table comparing local sessions, remote sessions, and OpenTelemetry logging, see the introduction to [Retrieve session transcripts](https://platform.claude.com/docs/en/manage-claude/compliance-sessions). +[Cowork's OpenTelemetry logging](https://support.claude.com/en/articles/14477985-monitor-claude-cowork-activity-with-opentelemetry) and [Claude Code monitoring](https://code.claude.com/docs/en/monitoring-usage) stream per-event telemetry, including token, cost, and host metadata, to a collector you run as activity occurs, whereas the Compliance API returns retained per-session transcripts from Anthropic on request and works with your existing Compliance Access Key. OpenTelemetry logging can also capture prompts and responses, but Anthropic recommends the Compliance API for retrieving the content of Cowork and Claude Code sessions. For a table comparing local sessions, remote sessions, and OpenTelemetry logging, see the introduction to [Retrieve session transcripts](https://platform.claude.com/docs/en/manage-claude/compliance-sessions). ### Inference hooks diff --git a/content/en/manage-claude/compliance-content-data.md b/content/en/manage-claude/compliance-content-data.md index 1a128b0cd6..7e07c61a6c 100644 --- a/content/en/manage-claude/compliance-content-data.md +++ b/content/en/manage-claude/compliance-content-data.md @@ -31,8 +31,8 @@ The chat list endpoint defaults to organization-wide scope: leave off `user_ids[ ```bash cURL curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/apps/chats" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "order_by=updated_at" \ --data-urlencode "updated_at.gte=2025-06-01T00:00:00Z" \ --data-urlencode "limit=100" @@ -69,7 +69,7 @@ That forward walk is also how you keep an export current across runs: persist th A few constraints apply to these organization-wide queries. Cursors are opaque and bound to the sort key, so an `after_id` issued under one `order_by` value is rejected with a 400 error under the other. Time-filter bounds must match the sort key too: pair `updated_at.*` bounds with `order_by=updated_at`, and `created_at.*` bounds with the default `order_by=created_at`. Backward pagination with `before_id` is not supported, and the `project_ids[]` filter is not available. See [List chats](https://platform.claude.com/docs/en/api/compliance/apps/chats/list) for the full filter reference. -To scope the list to specific users instead (for example, a legal hold on named custodians), pass 1–10 `user_ids[]` values. Obtain the IDs from [List organization users](https://platform.claude.com/docs/en/manage-claude/compliance-org-data#list-organization-users). User-filtered queries always sort by `created_at` (passing `order_by=updated_at` returns a 400 error) and support both `after_id` and `before_id`. Filtering by `project_ids[]` is only available in this user-filtered form. Combining `user_ids[]` with any `updated_at.*` bound is deprecated and will be rejected with a 400 error after 2026-09-22; to keep a custodian set current by update time, run the org-wide `order_by=updated_at` walk without `user_ids[]` and select the custodians' chats from its results, and keep the user-filtered listing for `created_at`-ordered exports. +To scope the list to specific users instead (for example, a legal hold on named custodians), pass 1–10 `user_ids[]` values. Obtain the IDs from [List organization users](https://platform.claude.com/docs/en/manage-claude/compliance-org-data#list-organization-users). User-filtered queries always sort by `created_at` (passing `order_by=updated_at` returns a 400 error) and support both `after_id` and `before_id`. Filtering by `project_ids[]` is only available in this user-filtered form. Combining `user_ids[]` with any `updated_at.*` bound is deprecated and will be rejected with a 400 error after 2026-09-22; to keep a custodian set current by update time, run the organization-wide `order_by=updated_at` walk without `user_ids[]` and select the custodians' chats from its results, and keep the user-filtered listing for `created_at`-ordered exports. ```bash cURL curl --fail-with-body -sS -G \ @@ -86,8 +86,8 @@ The list response carries chat metadata only. To pull the actual chat content, a ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/apps/chats/claude_chat_01H5CWunD7RpVJ5bHa8RCkja/messages" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` The messages endpoint returns the chat's metadata plus a `chat_messages` array sorted by `created_at`. When `limit` is omitted, the full message set is returned in one response; pass `limit`, `after_id`, or `before_id` to page through very long chats. The endpoint also accepts `created_at.*` and `updated_at.*` range bounds (`gt`, `gte`, `lt`, `lte`) and an `order` parameter (`asc` or `desc`). See [Get chat messages](https://platform.claude.com/docs/en/api/compliance/apps/chats/messages/list) for the full parameter list. For user messages, `created_at` is when the message was sent; for assistant messages, it is when Claude finished generating the message. Each message carries its text content and, when present, any uploaded files (typically on user messages), any tool-generated files, and any artifacts the assistant produced or updated (typically on assistant messages): @@ -195,8 +195,8 @@ The response carries these headers: ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/apps/chats/files/claude_file_01UaT9wBcDfGhJkLmNpQrSv7/content" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --output "dashboard_mockup_v1.pdf" ``` @@ -228,8 +228,8 @@ A consumer that walks the attachment list must branch on `type` and call the mat ```bash cURL curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/apps/projects/claude_proj_01KGp4eZNug9ri4kE35RSppq/attachments" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json Response @@ -265,9 +265,9 @@ curl --fail-with-body -sS -G \ The Compliance API exposes hard-delete endpoints for chats, files, project documents, and entire projects. A hard-deleted chat cannot be restored, and it stops appearing in list responses afterward. -* [Delete chat](https://platform.claude.com/docs/en/api/compliance/apps/chats/delete): also removes the chat's messages and any files attached to those messages. +* [Delete chat](https://platform.claude.com/docs/en/api/compliance/apps/chats/delete): also deletes the chat's messages and any files attached to those messages. * [Delete file](https://platform.claude.com/docs/en/api/compliance/apps/chats/files/delete): handles both chat files and project files. -* [Delete project document](https://platform.claude.com/docs/en/api/compliance/apps/projects/documents/delete): removes a single project document by ID. +* [Delete project document](https://platform.claude.com/docs/en/api/compliance/apps/projects/documents/delete): deletes a single project document by ID. * [Delete project](https://platform.claude.com/docs/en/api/compliance/apps/projects/delete): see [Detach chats before deleting a project](https://platform.claude.com/docs/en/manage-claude/compliance-content-data#detach-chats-before-deleting-a-project). For a chat in the unified Claude experience, [Delete chat](https://platform.claude.com/docs/en/api/compliance/apps/chats/delete) also deletes the sessions in the cloud that were started for the chat. It does not delete sessions that those sessions started. @@ -285,8 +285,8 @@ The following request deletes one chat. The same pattern applies to the other de curl --fail-with-body -sS -X DELETE \ "https://api.anthropic.com/v1/compliance/apps/chats/claude_chat_01H5CWunD7RpVJ5bHa8RCkja" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json Response diff --git a/content/en/manage-claude/compliance-errors.md b/content/en/manage-claude/compliance-errors.md index 67e033d20c..9fb76d9dd5 100644 --- a/content/en/manage-claude/compliance-errors.md +++ b/content/en/manage-claude/compliance-errors.md @@ -25,7 +25,7 @@ On this page, local sessions run on users' machines and remote sessions run in t Match on the HTTP status code and `error.type`, not on the message string. Messages are stable enough to copy into runbooks but might be reworded over time; the status codes and type values are part of the API contract. A few responses that share a status code and type are told apart by an error code in `error.details.error_code` when the response carries one, and otherwise by their message; each is called out where it applies. -The following table tells you at a glance whether to retry. Each section that follows shows the verbatim error body and the fix. +The following table tells you whether to retry. Each section that follows shows the verbatim error body and the fix. | Status | Retry? | When | | -------------------------------------------------------------------------------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -469,7 +469,7 @@ Too many large session transcripts are being read at once. This is not a limit o A 500 from the Compliance API carries an `x-should-retry: false` response header when the failure is deterministic. The Claude SDK honors this header automatically. If you use a generic HTTP retry library that retries on every 5xx, suppress retries when `x-should-retry` is `false`; retrying this error fails identically on every attempt. -A 500 without the `x-should-retry: false` header is transient: retry with exponential backoff (start at 1 second, double up to 60 seconds). The same applies to 502, 503, 504, and 529 responses. The exception is a small set of local session 503s, described next, that depend on an organization's settings or encryption key rather than on load. See [Errors](https://platform.claude.com/docs/en/api/errors) for the platform-wide retry semantics. +A 500 without the `x-should-retry: false` header is transient: retry with exponential backoff (start at 1 second, double up to 60 seconds). The same applies to 502, 503, 504, and 529 responses. The exception is a small set of local session 503s, described next, that depend on an organization's settings or encryption key rather than on load. See [Claude API errors](https://platform.claude.com/docs/en/api/errors) for the platform-wide retry semantics. ### Local sessions temporarily unavailable diff --git a/content/en/manage-claude/compliance-faq.md b/content/en/manage-claude/compliance-faq.md index 834e05026d..1979a84e85 100644 --- a/content/en/manage-claude/compliance-faq.md +++ b/content/en/manage-claude/compliance-faq.md @@ -78,7 +78,7 @@ description: Answers to common questions about Compliance API access, scopes, re - Local and remote session transcripts both carry user prompts, assistant responses, and tool calls and results. For local sessions (on users' machines), that is what Claude was asked to do and what it returned, not what happened on the device. + Local and remote session transcripts both carry user prompts, assistant responses, and tool calls and results. For local sessions (on users' machines), that is what Claude was asked to do and what it returned, not what occurred on the device. | Data | Local sessions (on users' machines) | Remote sessions (in the cloud) | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -97,7 +97,7 @@ description: Answers to common questions about Compliance API access, scopes, re - [Cowork's OpenTelemetry logging](https://support.claude.com/en/articles/14477985-monitor-claude-cowork-activity-with-opentelemetry) and [Claude Code monitoring](https://code.claude.com/docs/en/monitoring-usage) overlap with the session endpoints but answer different needs: OTEL streams per-event telemetry to infrastructure you run as activity happens, whereas the Compliance API lets you retrieve retained per-session transcripts from Anthropic after the fact. OTEL can also capture prompts and responses, but Anthropic recommends the Compliance API for retrieving the content of Cowork and Claude Code sessions. For a table comparing local sessions, remote sessions, and OTEL, see the introduction to [Retrieve session transcripts](https://platform.claude.com/docs/en/manage-claude/compliance-sessions). + [Cowork's OpenTelemetry logging](https://support.claude.com/en/articles/14477985-monitor-claude-cowork-activity-with-opentelemetry) and [Claude Code monitoring](https://code.claude.com/docs/en/monitoring-usage) overlap with the session endpoints but answer different needs: OTEL streams per-event telemetry to infrastructure you run as activity occurs, whereas the Compliance API lets you retrieve retained per-session transcripts from Anthropic after the fact. OTEL can also capture prompts and responses, but Anthropic recommends the Compliance API for retrieving the content of Cowork and Claude Code sessions. For a table comparing local sessions, remote sessions, and OTEL, see the introduction to [Retrieve session transcripts](https://platform.claude.com/docs/en/manage-claude/compliance-sessions). OTEL events and Compliance API records share organization and user identifiers, so you can join them. @@ -123,7 +123,7 @@ description: Answers to common questions about Compliance API access, scopes, re - Yes. A Claude Enterprise parent organization can have many linked organizations, including a mix of claude.ai organizations and Claude Console organizations (for example, separate production and staging Claude Console organizations). Identity, SSO, and SCIM are shared across the parent; billing, members, projects, and API keys remain separate for each organization. Compliance API enablement happens at the parent organization level and cascades to all linked organizations, and a Compliance Access Key that covers the parent organization and carries `read:compliance_org_data` can enumerate every organization beneath the parent through `GET /v1/compliance/organizations`. + Yes. A Claude Enterprise parent organization can have many linked organizations, including a mix of claude.ai organizations and Claude Console organizations (for example, separate production and staging Claude Console organizations). Identity, SSO, and SCIM are shared across the parent; billing, members, projects, and API keys remain separate for each organization. Compliance API enablement occurs at the parent organization level and cascades to all linked organizations, and a Compliance Access Key that covers the parent organization and carries `read:compliance_org_data` can enumerate every organization beneath the parent through `GET /v1/compliance/organizations`. diff --git a/content/en/manage-claude/compliance-integration-patterns.md b/content/en/manage-claude/compliance-integration-patterns.md index 561c116a1e..5953a9a60b 100644 --- a/content/en/manage-claude/compliance-integration-patterns.md +++ b/content/en/manage-claude/compliance-integration-patterns.md @@ -29,7 +29,7 @@ Both patterns share these constraints: * Activities are queryable within 1 minute of occurring and retained for 6 years. Recording is not retroactive: it begins when the Compliance API is first enabled for your organization, and activity from before enablement is not backfilled. * The maximum `limit` for each page is 5,000. * Cursor values are opaque strings that you must not parse. -* Requests are limited to 600 per minute per [parent organization](https://platform.claude.com/docs/en/manage-claude/compliance-api#how-the-compliance-api-works), shared across every key, every linked organization, and every `/v1/compliance/*` endpoint; unlike the local session endpoints, the remote session endpoints carry a second request budget on top. See [429 Too Many Requests](https://platform.claude.com/docs/en/manage-claude/compliance-errors#429-too-many-requests) for the response headers and retry contract. +* Requests are limited to 600 per minute for each [parent organization](https://platform.claude.com/docs/en/manage-claude/compliance-api#how-the-compliance-api-works), shared across every key, every linked organization, and every `/v1/compliance/*` endpoint; unlike the local session endpoints, the remote session endpoints carry a second request budget on top. See [429 Too Many Requests](https://platform.claude.com/docs/en/manage-claude/compliance-errors#429-too-many-requests) for the response headers and retry contract. | Pattern | Choose when | | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -43,8 +43,8 @@ Set `created_at.lt` at least 1 minute in the past so that every activity in the ```bash cURL curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/activities" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "created_at.gte=2026-04-20T07:00:00Z" \ --data-urlencode "created_at.lt=2026-04-20T08:00:00Z" \ --data-urlencode "limit=5000" @@ -64,13 +64,13 @@ Even with clean tiling, an activity that indexes after its window has closed nev # before_id is the first_id from a previous response curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/activities" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "limit=5000" \ --data-urlencode "before_id=activity_01XyDMpzjS89pFZXqSFUBDr6" ``` -Page through until `has_more` is `false`, then persist `first_id` from the final response and pass it unchanged as `before_id` on the next run to retrieve activities newer than the saved cursor. To walk in the opposite direction for a backfill, persist `last_id` and pass it as `after_id` instead. For the full cursor-vs-page-token reference and retry semantics, see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results). +Page through until `has_more` is `false`, then persist `first_id` from the final response and pass it unchanged as `before_id` on the next run to retrieve activities newer than the saved cursor. To walk in the opposite direction for a backfill, persist `last_id` and pass it as `after_id` instead. For the full cursor-versus-page-token reference and retry semantics, see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results). A production **catch-up** loop fetches activities recorded since your last poll by driving iteration off `has_more` and `first_id`: diff --git a/content/en/manage-claude/compliance-org-data.md b/content/en/manage-claude/compliance-org-data.md index 9f886e2680..2b5113e676 100644 --- a/content/en/manage-claude/compliance-org-data.md +++ b/content/en/manage-claude/compliance-org-data.md @@ -287,7 +287,7 @@ The response is a list of typed setting rows, and which rows appear varies by or Each row carries `name`, `type`, and `value`; the `type` field (`boolean`, `integer`, `string_list`, `provisioning_mode`, or `data_retention`) tells you the shape of `value`. The full list of setting names, and the `value` schema for each type, is in [Get effective organization settings](https://platform.claude.com/docs/en/api/compliance/organizations/settings/retrieve) in the API reference. -The `api_keys` array lists every Compliance Access Key configured for your parent organization, so the same list is returned regardless of which linked organization you query. Each entry carries the key's `type` (`compliance_api_key`), `id`, `name`, `scopes`, `is_active` flag, `created_at` and `expires_at` timestamps, and `created_by_id` (the ID of the user who created the key; may be `null`). The key's secret value is never returned. Deactivated keys are included with `is_active: false` so you can review keys that previously had access, and keys that carry only the retired `read:compliance_org_settings` scope remain in the list for audit and cleanup visibility even though that scope no longer grants access. +The `api_keys` array lists every Compliance Access Key configured for your parent organization, so the same list is returned regardless of which linked organization you query. Each entry carries the key's `type` (`compliance_api_key`), `id`, `name`, `scopes`, `is_active` flag, `created_at` and `expires_at` timestamps, and `created_by_id` (the ID of the user who created the key; might be `null`). The key's secret value is never returned. Deactivated keys are included with `is_active: false` so you can review keys that previously had access, and keys that carry only the retired `read:compliance_org_settings` scope remain in the list for audit and cleanup visibility even though that scope no longer grants access. The top-level `organization_id` is the organization's bare UUID: the same value as `uuid` in the organizations list, not the `org_`-prefixed form that `organization_id` carries on Activity Feed, chat, and project records (see the [organization identifier table](https://platform.claude.com/docs/en/manage-claude/compliance-org-data#list-organizations)). diff --git a/content/en/manage-claude/compliance-sessions.md b/content/en/manage-claude/compliance-sessions.md index 90330d7e88..329f3d2c5c 100644 --- a/content/en/manage-claude/compliance-sessions.md +++ b/content/en/manage-claude/compliance-sessions.md @@ -47,7 +47,7 @@ Anthropic recommends the Compliance API for retrieving session content. The foll | Setup | Works with your existing Compliance Access Key | Works with your existing Compliance Access Key | Admin configures an OTLP endpoint and content-capture settings | | Infrastructure | Anthropic-hosted | Anthropic-hosted | You run the collector and storage | | ID prefix | `clls_` | `cse_` | N/A | -| `product_surface` values | `cowork`, `claude_code`, `claude_science`, `claude_in_chrome`, and values beginning with `office_agents` | `cowork_remote` | N/A | +| `product_surface` values | `cowork`, `claude_code`, `claude_science`, `claude_in_chrome`, and values starting with `office_agents` | `cowork_remote` | N/A | | Retention | 6 years by default, or your organization's custom conversation retention period when a finite one is set; 30 days in organizations with HIPAA readiness enabled; held by Anthropic | 6 years, unless a user deletes the session sooner; held by Anthropic | Your infrastructure, your policies | | User prompts and assistant responses | Yes | Yes | Yes, subject to content-capture settings | | Tool inputs | Truncated to 10,000 bytes per input by default; up to about 1 MiB on request | Truncated to 10,000 bytes per input by default; up to about 1 MiB on request | Truncated summaries | @@ -62,7 +62,7 @@ Local sessions run on users' machines while they are signed in with their Claude The Compliance API exposes local sessions through three endpoints: `GET /v1/compliance/apps/sessions/local` lists session metadata, `GET /v1/compliance/apps/sessions/local/{session_id}` retrieves one session's metadata, and `GET /v1/compliance/apps/sessions/local/{session_id}/messages` returns one session's transcript. All three require the `read:compliance_user_data` scope and count only against the shared Compliance API rate limit; they are not subject to the second request budget that applies to the remote session endpoints. See [429 Too Many Requests](https://platform.claude.com/docs/en/manage-claude/compliance-errors#429-too-many-requests). If local sessions are not available to your parent organization, all three endpoints return 404 with the message `Local sessions are not available.` (see [Local session not found](https://platform.claude.com/docs/en/manage-claude/compliance-errors#local-session-not-found)); while session listings or captured content are temporarily unavailable, they return 503 (see [Local sessions temporarily unavailable](https://platform.claude.com/docs/en/manage-claude/compliance-errors#local-sessions-temporarily-unavailable)). -For local sessions, Anthropic records each conversation server-side as its requests reach the Claude API; nothing is installed on the device, and nothing is collected beyond the requests the client already sends to the Claude API. Local session transcripts show what Claude was asked to do and what it returned, not what happened on the device. File and network activity is visible only through the tool calls and tool results in the transcript, so activity that never reaches the API (for example, local files the session never sent) is not captured. +For local sessions, Anthropic records each conversation server-side as its requests reach the Claude API; nothing is installed on the device, and nothing is collected beyond the requests the client already sends to the Claude API. Local session transcripts show what Claude was asked to do and what it returned, not what occurred on the device. File and network activity is visible only through the tool calls and tool results in the transcript, so activity that never reaches the API (for example, local files the session never sent) is not captured. In organizations that use [customer-managed encryption keys](https://platform.claude.com/docs/en/manage-claude/cmek), local session transcripts are encrypted under your customer-managed key and returned as usual. While that key cannot be used (for example, because you disabled or revoked it, or because it cannot be reached), the messages endpoint returns [503 Service Unavailable](https://platform.claude.com/docs/en/manage-claude/compliance-errors#local-sessions-temporarily-unavailable) for the affected pages instead of transcript content. Those messages are never reported as `not_captured` (see [Retrieve a local session transcript](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-a-local-session-transcript)). Listing sessions and retrieving session metadata are not affected. @@ -71,8 +71,8 @@ The list endpoint returns session metadata, with no transcript content, for ever ```bash cURL curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/apps/sessions/local" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "created_at.gte=2026-07-01T00:00:00Z" \ --data-urlencode "limit=100" ``` @@ -111,15 +111,15 @@ curl --fail-with-body -sS -G \ } ``` -Results are sorted in reverse chronological order (newest first) by `created_at`, with ties broken in a fixed server-side order, and capped at `limit` results per response (default 100, max 500). The endpoint paginates forward only with `page` and `next_page` tokens (see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results)): pass the response's `next_page` value back as the `page` query parameter on the next request, and stop when `next_page` is `null`. The response has no `has_more` field. Complete a list walk within 24 hours of starting it; an older list cursor is still accepted but is re-evaluated against the current retention boundary, so sessions whose oldest retained activity is about to age out of the retention period can be skipped. +Results are sorted in reverse chronological order (newest first) by `created_at`, with ties broken in a fixed server-side order, and capped at `limit` results for each response (default 100, max 500). The endpoint paginates forward only with `page` and `next_page` tokens (see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results)): pass the response's `next_page` value back as the `page` query parameter on the next request, and stop when `next_page` is `null`. The response has no `has_more` field. Complete a list walk within 24 hours of starting it; an older list cursor is still accepted but is re-evaluated against the current retention boundary, so sessions whose oldest retained activity is about to age out of the retention period can be skipped. In each session object, `user.id` is always set and survives account deletion; `user.email_address` is `null` when the user's account has been deleted or the user is no longer a member of an organization your key can read. `workspace_id` is `null` when the session was not associated with a workspace. A local session corresponds to one client session ID: starting a new conversation in the client, or clearing its context, begins a new session record. For Claude Science, the list can also include separate sessions for the app's own background work (for example, naming the conversation; on newer app versions also its reviewer and delegation tracks), and on older app versions some of that background work appears as extra messages inside the conversation's own transcript. A Claude Science conversation that continues across some app updates appears as two sessions. These behaviors are expected. Treat `id` values as opaque strings; the format may change without notice. -For Claude for Microsoft 365 and the Claude add-ins for Google Docs, Google Sheets, and Google Slides, deleting a conversation in the add-in happens only on the client, so it is not reflected in the API: local sessions have no `deleted_at` field, and the session stays listed until retention removes it. +For Claude for Microsoft 365 and the Claude add-ins for Google Docs, Google Sheets, and Google Slides, deleting a conversation in the add-in occurs only on the client, so it is not reflected in the API: local sessions have no `deleted_at` field, and the session stays listed until retention removes it. Local sessions carry an `updated_at` but no `status`: a local session has no server-side lifecycle status, and its visibility is governed by retention instead. A local session is captured as the series of Claude API calls (inference calls) that the client makes during the session, and retention applies to each captured call individually. `created_at` is the timestamp of the session's earliest retained call and `updated_at` the timestamp of its last, both UTC. As older calls age past the retention period, `created_at` advances accordingly, and once every call in a session has aged out, the session is no longer returned; `updated_at` tracks the most recent call and is unaffected until then. Because `created_at` can shift between runs, deduplicate on `id` when you re-walk the list over time. To keep transcripts current as sessions gain messages, poll with the `updated_at.gte` filter, overlapping consecutive windows. On the list endpoint `updated_at` is a lower bound: for a session still active at a page boundary or the upper end of a `created_at` window, it can momentarily lag the session's true last activity, and a new call only becomes queryable after the short processing delay noted earlier. Because of that lag, set each run's `updated_at.gte` a few minutes before your previous run's start time, not to the previous run's time exactly. A bound set to the exact previous time silently and permanently drops a session whose final call was still indexing at that moment, because once the bound advances past that call no later run returns it. Deduplicate the returned sessions on `id`, re-fetch their transcripts, and deduplicate messages on `id`. Retrieving a session, or its messages, always reflects the exact latest retained call, so a periodic reconciliation pass over an older window is a more thorough alternative to widening the overlap. -The list is built from session activity metadata, so it can include sessions whose transcript content was not captured, for example sessions that ran before capture began for your organization (as far back as your retention period allows); the transcript of such a session returns each message with its content marked unavailable (see [Retrieve a local session transcript](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-a-local-session-transcript)). +The list is built from session activity metadata, so it can include sessions whose transcript content was not captured, for example sessions that ran before capture started for your organization (as far back as your retention period allows); the transcript of such a session returns each message with its content marked unavailable (see [Retrieve a local session transcript](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-a-local-session-transcript)). Captured local session content is stored for 6 years from capture by default. If the organization that ran the session has set a finite custom conversation retention period in [claude.ai > Organization settings > Data and privacy](https://claude.ai/admin-settings/data-privacy-controls), that period applies instead, whether it is shorter or longer than the default; when the organization has more than one custom retention period configured, the shortest applies. A change to that setting takes effect in two different ways: the endpoints stop returning activity older than the organization's current period as soon as the setting changes, whereas each captured message is stored for the period that was in effect when it was captured, so lengthening the period later does not restore content that has already expired. In organizations with [HIPAA readiness](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#hipaa-readiness) enabled, captured local session content is stored for 30 days from capture, or for the organization's custom conversation retention period when that is shorter; the 6-year default does not apply. @@ -137,7 +137,7 @@ To fetch one session's metadata directly, pass its ID to `GET /v1/compliance/app If a session shows `office_agents` on its own, nothing else in the response tells you which of these products it came from. Do not assume it is Claude for Microsoft 365. -The value comes from the session's most recent activity, so it can change over time. The API started recording the Google values on October 5, 2026. A Google add-in session whose most recent activity happened on or before that date can show `office_agents`. If the user works in that session again, it switches to the matching Google value. +The value comes from the session's most recent activity, so it can change over time. The API started recording the Google values on October 5, 2026. A Google add-in session whose most recent activity occurred on or before that date can show `office_agents`. If the user works in that session again, it switches to the matching Google value. New values appear as these endpoints cover more products. @@ -150,7 +150,7 @@ New values appear as these endpoints cover more products. The messages endpoint returns the session's transcript, reconstructed from the captured Claude API calls: user prompts, assistant text, tool calls, and the text portions of tool results, all returned as they were sent apart from size truncation. Nothing masks URLs, credentials, or personal data in that content, so treat transcripts as sensitive. The transcript omits or replaces the following: * Thinking blocks are never included. -* The request's system prompt is never returned. A marker message reading `[system prompt content not shown]` stands in for it (normally once per session; a session with no captured content carries no marker). +* The request's system prompt is never returned. A marker message reading `[system prompt content not shown]` stands in for it (normally once for each session; a session with no captured content carries no marker). * Tool definitions and MCP server configuration are not part of the transcript. * Images, PDFs, and other binary or structured blocks are not returned. Each appears as a `text` block reading `[ content not shown]` (for example, `[image content not shown]`) with `truncated` set to `true`. Non-text items inside a tool result, such as [web search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool) results or the output of the [code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool), are replaced by one `[N non-text item(s) not shown]` entry, and the tool result block's `truncated` is `true`. The matching tool call, with the search query or the code in its `input`, is still returned. * Citation metadata on `text` blocks, such as the source citations on an answer that draws on web search results, is omitted. The text itself is returned, and the block carries `truncated` set to `true`. @@ -160,8 +160,8 @@ Project instruction files such as `CLAUDE.md` appear as ordinary user-role conte ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/apps/sessions/local/clls_01HxKpLmNoPqRsTuVwXyZaBc/messages" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json Response @@ -289,13 +289,13 @@ Each message carries a `role` (`user` or `assistant`) and a `content` array of ` Each message also carries a `provenance` field describing how its content was captured. `provenance` is `null` for verified content captured by the Claude API, which is the common case. Otherwise it is an object whose `type` marks the exception: -* `content_unavailable` means the content cannot be returned. The `content` array is empty, and `provenance.reason` states why. `not_captured` means no content is available for the turn. It does not prove that no record was stored: content that Anthropic's data-handling policies withhold from the Compliance API is reported with the same reason, and so are individual turns within an otherwise captured session that are unavailable for such reasons. An unusable customer-managed key is the one exception and returns [503 Service Unavailable](https://platform.claude.com/docs/en/manage-claude/compliance-errors#local-sessions-temporarily-unavailable) instead. `client_aborted` means the client closed the connection or cancelled the request before the response completed, so the turn's response was not captured; any partial output already streamed to the client is not included, and this reason applies to assistant-role turns only. `cmek_key_revoked` is reserved for content encrypted under your organization's customer-managed key when that key is unavailable (for example, revoked). It is not currently returned, because an unusable key produces a 503 instead, but handle it for forward compatibility. `retention_elapsed` means the content aged past retention. `oversize` means a single message exceeded the per-message size bound; the message is still returned, with an empty `content` array. +* `content_unavailable` means the content cannot be returned. The `content` array is empty, and `provenance.reason` states why. `not_captured` means no content is available for the turn. It does not prove that no record was stored: content that Anthropic's data-handling policies withhold from the Compliance API is reported with the same reason, and so are individual turns within an otherwise captured session that are unavailable for such reasons. An unusable customer-managed key is the one exception and returns [503 Service Unavailable](https://platform.claude.com/docs/en/manage-claude/compliance-errors#local-sessions-temporarily-unavailable) instead. `client_aborted` means the client closed the connection or canceled the request before the response completed, so the turn's response was not captured; any partial output already streamed to the client is not included, and this reason applies to assistant-role turns only. `cmek_key_revoked` is reserved for content encrypted under your organization's customer-managed key when that key is unavailable (for example, revoked). It is not currently returned, because an unusable key produces a 503 instead, but handle it for forward compatibility. `retention_elapsed` means the content aged past retention. `oversize` means a single message exceeded the per-message size bound; the message is still returned, with an empty `content` array. * `client_asserted` marks assistant messages that the client supplied as conversation history and that could not be matched to a captured response; their authorship is not verified. * `synthetic_marker` marks records generated by the endpoint itself, such as the marker that stands in for the system prompt. When the client rewrites or compacts its conversation history mid-session (for example, after context compaction), the transcript inserts a marker message at that point and continues with the new content the client sent. When your organization has a finite retention period and that new content includes assistant messages, the transcript withholds the new content up to and including its last assistant message (a second marker notes this) and shows only the user messages after that point, followed by the rest of the session. -Marker and client-asserted messages begin with a bracketed explanatory `text` block flagged `truncated: true`, for example `[system prompt content not shown]`. Treat these records as present but unavailable or unverified rather than missing, and tolerate unrecognized `provenance` types and reasons. +Marker and client-asserted messages start with a bracketed explanatory `text` block flagged `truncated: true`, for example `[system prompt content not shown]`. Treat these records as present but unavailable or unverified rather than missing, and tolerate unrecognized `provenance` types and reasons. -Two parameters cap how many bytes of each tool block are returned: `tool_use_input_max_bytes` and `tool_result_max_bytes`, both defaulting to 10,000 bytes. Pass `-1` for the server maximum (about 1 MiB per string); `0` returns [400 Bad Request](https://platform.claude.com/docs/en/manage-claude/compliance-errors#400-bad-request), and values above the maximum are clamped to it. A string cut off by either cap is cut on a character boundary and has an in-band suffix appended (for example, `…[truncated; pass tool_result_max_bytes=-1 for the server max]`), and its block carries `"truncated": true`. A truncated `tool_use` `input` is therefore no longer valid JSON, so parse tool inputs only from untruncated blocks (or raise the cap and refetch). Blocks of type `text` are always capped at the same server maximum of about 1 MiB; no parameter raises it, and a `text` block at the bound also carries `"truncated": true`. +Two parameters cap how many bytes of each tool block are returned: `tool_use_input_max_bytes` and `tool_result_max_bytes`, both defaulting to 10,000 bytes. Pass `-1` for the server maximum (about 1 MiB for each string); `0` returns [400 Bad Request](https://platform.claude.com/docs/en/manage-claude/compliance-errors#400-bad-request), and values above the maximum are clamped to it. A string cut off by either cap is cut on a character boundary and has an in-band suffix appended (for example, `…[truncated; pass tool_result_max_bytes=-1 for the server max]`), and its block carries `"truncated": true`. A truncated `tool_use` `input` is therefore no longer valid JSON, so parse tool inputs only from untruncated blocks (or raise the cap and refetch). Blocks of type `text` are always capped at the same server maximum of about 1 MiB; no parameter raises it, and a `text` block at the bound also carries `"truncated": true`. Claude Science calls connectors (MCP servers) from code that it runs through its `repl` tool, not as separately named tools, so no block in a Claude Science transcript is named after a connector. Each connector call appears in the code inside a `repl` `tool_use` block's `input` (for example, a `host.mcp("", "", ...)` call), and connector output appears in the matching `tool_result` only where that code printed it. Cowork and Claude Code sessions differ: they call each connector tool under its own `mcp____` name, which is the `name` of the `tool_use` block. To monitor connector use in Claude Science sessions, parse the `input` string and match on the code it contains rather than on a tool name. Pass `tool_use_input_max_bytes=-1` for these sessions so that a long code input is returned up to the server maximum instead of being cut at the 10,000-byte default before the connector call appears. @@ -310,8 +310,8 @@ The list endpoint defaults to organization-wide scope: leave off `organization_i ```bash cURL curl --fail-with-body -sS -G \ "https://api.anthropic.com/v1/compliance/apps/sessions/remote" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" \ + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" \ --data-urlencode "created_at.gte=2026-06-01T00:00:00Z" \ --data-urlencode "limit=100" ``` @@ -354,7 +354,7 @@ curl --fail-with-body -sS -G \ } ``` -Results are sorted in reverse chronological order (newest first) by `created_at` and capped at `limit` results per response (default 100, max 500). The endpoint paginates with `page` and `next_page` tokens (see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results)): pass the response's `next_page` value back as the `page` query parameter on the next request, and stop when `next_page` is `null`. +Results are sorted in reverse chronological order (newest first) by `created_at` and capped at `limit` results for each response (default 100, max 500). The endpoint paginates with `page` and `next_page` tokens (see [Paginate results](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed#paginate-results)): pass the response's `next_page` value back as the `page` query parameter on the next request, and stop when `next_page` is `null`. A session is owned by either a user or an agent, never both. For user-owned sessions, `user` carries the owner's ID and email address (`email_address` is `null` when the user is no longer a member of an organization your key can read) and `agent_id` is `null`. For agent-owned sessions (for example, runs of a Cowork scheduled task in the cloud), `user` is `null`, `agent_id` carries the agent's ID (prefix `cagt_`), and `started_by_user` identifies the human who initiated the run; on user-owned sessions, `started_by_user` is `null`. Each run of a scheduled task is a separate session, and no session field carries the task's name or schedule. @@ -377,8 +377,8 @@ The messages endpoint returns the session's transcript: user prompts, assistant ```bash cURL curl --fail-with-body -sS \ "https://api.anthropic.com/v1/compliance/apps/sessions/remote/cse_01WpQrStUvXyZaBcDeFgHjK6/messages" \ - --header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ - --header "anthropic-version: 2023-06-01" + -H "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \ + -H "anthropic-version: 2023-06-01" ``` ```json Response @@ -438,7 +438,7 @@ Messages are returned oldest first by default; pass `order=desc` to reverse. Pag Each message carries a `role` (`user` or `assistant`) and a `content` array of `text`, `tool_use`, and `tool_result` blocks. Message `created_at` values are commit timestamps: consecutive messages can share a timestamp or slightly invert, so preserve the returned order rather than re-sorting by `created_at`. On agent-owned sessions, `sent_by_user_id` records the user who sent a given user message when one is attributable; it is `null` otherwise, including on all assistant messages. When a message's content cannot be returned at all (for example, it exceeds size bounds), the message carries `content_unavailable` set to `true`. -Two parameters cap how many bytes of each tool block are returned: `tool_use_input_max_bytes` and `tool_result_max_bytes`, both defaulting to 10,000 bytes. Pass `-1` for the server maximum (about 1 MiB per string); `0` returns [400 Bad Request](https://platform.claude.com/docs/en/manage-claude/compliance-errors#400-bad-request). A block cut off by either cap carries `"truncated": true`, and a truncated `tool_use` input is no longer valid JSON, so parse tool inputs only from untruncated blocks (or raise the cap and refetch). +Two parameters cap how many bytes of each tool block are returned: `tool_use_input_max_bytes` and `tool_result_max_bytes`, both defaulting to 10,000 bytes. Pass `-1` for the server maximum (about 1 MiB for each string); `0` returns [400 Bad Request](https://platform.claude.com/docs/en/manage-claude/compliance-errors#400-bad-request). A block cut off by either cap carries `"truncated": true`, and a truncated `tool_use` input is no longer valid JSON, so parse tool inputs only from untruncated blocks (or raise the cap and refetch). The messages endpoint returns [404 Not Found](https://platform.claude.com/docs/en/manage-claude/compliance-errors#404-not-found) for `pending` sessions, sessions that do not exist or have been deleted, and sessions in organizations your key cannot read. diff --git a/content/en/manage-claude/data-residency.md b/content/en/manage-claude/data-residency.md index f25fd5e18a..0d528467aa 100644 --- a/content/en/manage-claude/data-residency.md +++ b/content/en/manage-claude/data-residency.md @@ -7,7 +7,7 @@ description: Manage where model inference runs and where data is stored with geo Data residency controls let you manage where your data is processed and stored. Two independent settings govern this: * **Inference geo:** Controls where model inference runs, on a per-request basis. Set through the `inference_geo` API parameter or as a workspace default. -* **Workspace geo:** Controls where data is stored at rest and where endpoint processing (such as image transcoding and code execution) happens. Configured at the workspace level in the [Claude Console](https://platform.claude.com). +* **Workspace geo:** Controls where data is stored at rest and where endpoint processing (such as image transcoding and code execution) occurs. Configured at the workspace level in the [Claude Console](https://platform.claude.com). [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) supports geographic pinning at the agent level: `inference_geo` on an [agent's model configuration](https://platform.claude.com/docs/en/managed-agents/agent-setup#pin-the-inference-geo) pins the geography that serves model requests for sessions running that agent, with [per-session overrides](https://platform.claude.com/docs/en/managed-agents/sessions#pin-the-inference-geo-for-a-session) at session create. Agents without a pin follow the workspace's default inference geo on each request. Managed Agents also respects the Workspace geo configured in Console, and with [self-hosted sandboxes](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes), tool execution and the sandbox filesystem stay on infrastructure you control; the contents of attached [memory stores](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory) remain stored by Anthropic and are copied to your sandbox for the session. @@ -104,7 +104,7 @@ The `inference_geo` parameter controls where model inference runs for a specific InferenceGeo = "us", Messages = [ - new() { Role = Role.User, Content = "Summarize the key points of this document." }, + new UserMessageParam { Content = "Summarize the key points of this document." }, ], } ); @@ -254,8 +254,8 @@ To set workspace geo, create a new workspace in the [Console](https://platform.c Data residency pricing varies by model generation: * **Claude 4.6 and later models:** US-only inference (`inference_geo: "us"`) is priced at 1.1x the standard rate across all token pricing categories (input tokens, output tokens, cache writes, and cache reads). On Claude Haiku 5.5, the multiplier also applies to the higher prices for prompts over 100,000 tokens (see [Long context pricing](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing)). -* **Global routing** (`inference_geo: "global"`): Standard pricing applies. -* **Older models:** Don't support `inference_geo` (see [Model availability](https://platform.claude.com/docs/en/manage-claude/data-residency#model-availability)); standard pricing applies. Requests that include the parameter return a 400 error. +* **Global routing (`inference_geo: "global"`):** Standard pricing applies. +* **Older models:** Don't support `inference_geo` (see [Model availability](https://platform.claude.com/docs/en/manage-claude/data-residency#model-availability)). Standard pricing applies. Requests that include the parameter return a 400 error. This pricing applies to the Claude API (first-party) and Claude Platform on AWS. On Claude in Microsoft Foundry, the same 1.1x multiplier applies to deployments hosted on Azure that use the US Data Zone Standard deployment type. Partner-operated platforms (Bedrock and Google Cloud) have their own regional pricing. See [Data residency pricing](https://platform.claude.com/docs/en/about-claude/pricing#data-residency-pricing) for details. @@ -271,7 +271,7 @@ The `inference_geo` parameter is supported on the [Batch API](https://platform.c ## Migration from legacy opt-outs -If your organization previously opted out of global routing to keep inference in the US, your workspace has been automatically configured with `allowed_inference_geos: ["us"]` and `default_inference_geo: "us"`. No code changes are required. Your existing data residency requirements continue to be enforced through the new geo controls. +If your organization previously opted out of global routing to keep inference in the US, your workspace has been automatically configured with `allowed_inference_geos: ["us"]` and `default_inference_geo: "us"`. No code changes are needed. Your existing data residency requirements continue to be enforced through the new geo controls. ### What changed diff --git a/content/en/manage-claude/inference-hooks-configuration.md b/content/en/manage-claude/inference-hooks-configuration.md index d7abd2d570..9daf8e55e7 100644 --- a/content/en/manage-claude/inference-hooks-configuration.md +++ b/content/en/manage-claude/inference-hooks-configuration.md @@ -10,7 +10,7 @@ description: Allow Inference hooks for your Claude Enterprise organization, conn Inference hooks send prompts from your organization to an AI security server you choose, and hold each request for an allow or deny verdict before Claude processes it. This page walks through turning the feature on, connecting your server, and controlling enforcement. To learn what Inference hooks are and when to use them, see the [Inference hooks overview](https://platform.claude.com/docs/en/manage-claude/inference-hooks). To build the AI security server itself, see [Develop an Inference hooks integration](https://platform.claude.com/docs/en/manage-claude/inference-hooks-endpoint). -## Before you begin +## Before you start You need: @@ -29,13 +29,13 @@ There are three enforcement states: **off** (**Enforce verdicts** is off: your A - Still in **Data and privacy**, open the **Inference hooks** section to reach the Inference hooks settings page. It lives under Data and privacy rather than as its own entry in the settings nav, so its breadcrumb reads **Data and privacy / Inference hooks**. Until you save an endpoint, the page warns that prompts aren't being inspected yet, and **Enforce verdicts** stays off with a **Requires endpoint** badge. + Still in **Data and privacy**, open the **Inference hooks** section to reach the Inference hooks settings page. It lives under **Data and privacy** rather than as its own entry in the settings nav, so its breadcrumb reads **Data and privacy / Inference hooks**. Until you save an endpoint, the page warns that prompts aren't being inspected yet, and **Enforce verdicts** stays off with a **Requires endpoint** badge. - Click **Configure** to open the **Set up endpoint** dialog and enter the **Endpoint URL**: the `https://` URL that receives verdict requests. Only `https://` URLs are accepted. + Click **Configure** to open the **Set up endpoint** dialog box and enter the **Endpoint URL**: the `https://` URL that receives verdict requests. Only `https://` URLs are accepted. - The dialog asks for nothing else at this point: custom request headers come in step 5, and failure handling in step 6. Click **Next** to save. Once an endpoint is saved, the button reads **Edit**. + The dialog box asks for nothing else at this point: custom request headers come in step 5, and failure handling in step 6. Click **Next** to save. Once an endpoint is saved, the button reads **Edit**. @@ -45,7 +45,7 @@ There are three enforcement states: **off** (**Enforce verdicts** is off: your A - Clicking **Next** on the signing secret dialog reopens the endpoint dialog, now with two more controls: + Clicking **Next** on the signing secret dialog box reopens the endpoint dialog box, now with two more controls: * **Custom request headers:** up to 16 static headers sent with every verdict request so your AI security server can authenticate the caller. Header values are stored encrypted and never shown again; after saving, only the header names are displayed. Because values are write-only, saving any change to the headers requires re-entering every value. Changing the endpoint URL clears all stored header values so your credentials are never sent to a new destination; re-enter them after a URL change. Header names must use standard HTTP token characters with `-` rather than `_`, and must not collide with reserved names (request-framing headers such as `Content-*` and `Host`, proxy and cookie headers, client-address headers such as `X-Forwarded-*`, the `webhook-*` signature headers, and the `X-Anthropic-*` prefix). Values must be printable ASCII. * **Test connection:** Claude sends a synthetic test prompt to the URL and headers currently in the form, not the saved values, so re-enter any stored header values before testing. On success, the result reports whether your AI security server returned an allow or a deny verdict for the test prompt, which surfaces a deny-everything default before you start enforcing. It also shows the round-trip time Anthropic measured for that one test request, on a new connection, including the connection handshake. @@ -66,12 +66,12 @@ There are three enforcement states: **off** (**Enforce verdicts** is off: your A - Under **Failure handling**, set **Mode** to choose what happens while the AI security server is unreachable or verdicts time out: + Under **Failure handling**, set **Mode** to choose what occurs while the AI security server is unreachable or verdicts time out: * **Block the request:** stop inference when your AI security server can't deliver a verdict (fail closed). * **Allow the request:** let the request proceed to the model without inspection (fail open). - The dropdown's third option, **Shadow mode**, is a rollout tool rather than a failure policy; see [Shadow mode](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration#shadow-mode). + The dropdown menu's third option, **Shadow mode**, is a rollout tool rather than a failure policy; see [Shadow mode](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration#shadow-mode). Then set **Prompt verdict timeout (ms)**: 1 to 10,000ms, with a default of 5,000ms. The budget covers the entire exchange, and a slower verdict counts as an unreachable server, so set the lowest value your server can reliably meet. @@ -87,7 +87,7 @@ There are three enforcement states: **off** (**Enforce verdicts** is off: your A To evaluate verdicts against live traffic without blocking anyone at first, set **Mode** to **Shadow mode** (step 6) before turning on enforcement; see [Shadow mode](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration#shadow-mode). - Turn on **Enforce verdicts** to gate Claude on your AI security server's verdict for every governed prompt, then confirm in the dialog, which restates your failure handling choice. Allow about a minute for the change to reach every Anthropic server; requests already in flight finish under the old setting. Turning it off stops prompts from being sent to your AI security server, again within about a minute; your configuration is kept. + Turn on **Enforce verdicts** to gate Claude on your AI security server's verdict for every governed prompt, then confirm in the dialog box, which restates your failure handling choice. Allow about a minute for the change to reach every Anthropic server; requests already in flight complete under the old setting. Turning it off stops prompts from being sent to your AI security server, again within about a minute; your configuration is kept. **Validate tool calls**, below **Enforce verdicts**, also sends the tool calls in each of Claude's responses to your AI security server and waits for its verdict before they run; see [The tool call frame](https://platform.claude.com/docs/en/manage-claude/inference-hooks-endpoint#the-tool-call-frame). It is on by default in a new configuration. It has no effect while **Enforce verdicts** is off, and a change to it takes about a minute to reach every Anthropic server, as with **Enforce verdicts**. @@ -101,7 +101,7 @@ To use shadow mode, set **Mode** to **Shadow mode** under **Failure handling**, ## Exclusions -Under **Exclusions**, select roles whose members are not covered by Inference hooks: their prompts are never sent to your AI security server. Only custom roles your organization created can be excluded; the built-in roles aren't offered. Pick them in the role selector, whose placeholder reads **Select roles to exclude**, and manage who holds each role from the roles admin page (**Manage roles**); changing exclusions requires identity management permission. The list is empty by default, and with no roles excluded, every governed request is inspected. +Under **Exclusions**, select roles whose members are not covered by Inference hooks: their prompts are never sent to your AI security server. Only custom roles your organization created can be excluded; the built-in roles aren't offered. Select them in the role selector, whose placeholder reads **Select roles to exclude**, and manage who holds each role from the roles admin page (**Manage roles**); changing exclusions requires identity management permission. The list is empty by default, and with no roles excluded, every governed request is inspected. Exclusion applies to a user's interactive sessions. Changes to the exclusion list are recorded in your organization's [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) as role permission changes (`rbac_role_permission_added` and `rbac_role_permission_removed`). @@ -114,10 +114,10 @@ Under **Custom blocked prompt message**, set custom text of up to 500 characters The endpoint health area of the Inference hooks settings page shows: * **Endpoint status:** Healthy, Tripped, Not enforcing, or Not configured before an endpoint is saved. -* **Failures per minute:** webhook failures over the last two minutes, averaged. +* **Failures per minute:** webhook failures over the last 2 minutes, averaged. * **Block rate:** denials as a share of your AI security server's verdicts, shown while the rollout percentage is below 100. * **Circuit breaker tripped:** when the breaker last tripped, if it has. -* **Recent errors:** each entry shows when the failure happened, an error type, and a category. The category is `webhook_error` for a problem with your endpoint or the connection to it, or `relay_error` for a failure inside Anthropic's systems. Entries never include request content or your endpoint URL. The list keeps the 10 most recent failures and clears an hour after the last one. +* **Recent errors:** each entry shows when the failure occurred, an error type, and a category. The category is `webhook_error` for a problem with your endpoint or the connection to it, or `relay_error` for a failure inside Anthropic's systems. Entries never include request content or your endpoint URL. The list keeps the 10 most recent failures and clears an hour after the last one. The error types in **Recent errors** mean: @@ -139,7 +139,7 @@ The panel is best-effort: if Anthropic cannot read the counters it shows zero fa Sustained webhook failures attributable to your AI security server trip the circuit breaker, which stops enforcement: your server is no longer contacted, and your **Failure handling** choice applies to every inspected request. With **Block the request** selected, users in your organization are blocked until the breaker resets. When the breaker trips, administrators are also notified in the claude.ai notification center. -Each trip is also recorded in your organization's [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) as an `inference_hooks_circuit_breaker_tripped` activity, so your security team or vendor can alert on trips from monitoring they already run, such as a SIEM that ingests the feed. One activity is recorded per trip, not one per affected request. Recording requires the Compliance API to be enabled for your organization; see [Set up the Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api-access). +Each trip is also recorded in your organization's [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) as an `inference_hooks_circuit_breaker_tripped` activity, so your security team or vendor can alert on trips from monitoring they already run, such as a SIEM that ingests the feed. One activity is recorded for each trip, not one for each affected request. Recording requires the Compliance API to be enabled for your organization; see [Set up the Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api-access). To recover, fix the server, then turn **Enforce verdicts** back on to reset the breaker. @@ -161,7 +161,7 @@ Inference hooks activity is recorded in your organization's [Activity Feed](http There are two levels of off: -* **Enforce verdicts** off, on the Inference hooks settings page: within about a minute, prompts from your organization stop being sent to your AI security server; requests already in flight finish under the old setting. The settings page stays available, so use this to pause enforcement while you work on your AI security server. +* **Enforce verdicts** off, on the Inference hooks settings page: within about a minute, prompts from your organization stop being sent to your AI security server; requests already in flight complete under the old setting. The settings page stays available, so use this to pause enforcement while you work on your AI security server. * **Allow for your organization** off, in **Data and privacy** settings: prompts are no longer inspected, and the Inference hooks settings become unavailable until you turn it back on. Your endpoint configuration, custom headers, and signing secret are kept either way; turning it back on forces **Enforce verdicts** off and clears a tripped circuit breaker, so turn enforcement on again when you are ready. ## Next steps diff --git a/content/en/manage-claude/inference-hooks-endpoint.md b/content/en/manage-claude/inference-hooks-endpoint.md index d9c4ecadb4..65839f62a1 100644 --- a/content/en/manage-claude/inference-hooks-endpoint.md +++ b/content/en/manage-claude/inference-hooks-endpoint.md @@ -158,7 +158,7 @@ Every request carries these fixed headers, along with any [custom request header | `User-Agent` | `anthropic-dlp/1` | | `Accept-Encoding` | `identity` | -There are two hook events, told apart by the top-level `type` field. The prompt frame is sent once per governed inference request, before inference begins. The tool call frame is sent when a model response contains tool calls, before any of them runs, in organizations that have **Validate tool calls** on. Either way, Anthropic waits until your AI security server responds or the verdict timeout elapses. +There are two hook events, told apart by the top-level `type` field. The prompt frame is sent once for each governed inference request, before inference starts. The tool call frame is sent when a model response contains tool calls, before any of them runs, in organizations that have **Validate tool calls** on. Either way, Anthropic waits until your AI security server responds or the verdict timeout elapses. ## The prompt frame @@ -236,7 +236,7 @@ The transcript is the conversation as the end user sees it, up to the point of i A turn whose every block is excluded is omitted entirely, so don't assume strict user and assistant alternation. -Transcripts are sent untruncated, so a long conversation with large attachments produces a large request body. In practice the model's context window keeps bodies under about 10 MB, but the protocol allows up to 64 MiB. Several common defaults are much smaller, including nginx `client_max_body_size` at 1 MB and Express `express.json()` at 100 kB, and a rejected body counts as a webhook failure, so under **Allow the request** failure handling an oversized prompt would reach the model uninspected. +Transcripts are sent untruncated, so a long conversation with large attachments produces a large request body. In practice the model's context window keeps bodies under about 10 MB, but the protocol allows up to 64 MiB. Several common defaults are much smaller, including nginx `client_max_body_size` at 1 MB and Express `express.json()` at 100 kB, and a rejected body counts as a webhook failure, so under **Allow the request** failure handling an oversized prompt would reach the model uninspected. ### Source values @@ -251,7 +251,7 @@ When Claude produces tool calls, Anthropic sends one tool call frame that lists It differs from the prompt frame in three ways: * `type` is `"tool_call"`. -* `messages` holds only the latest message, the `assistant` message Claude just produced: any `text` blocks and one `tool_use` block per tool call the frame lists, in the order the model produced them. Earlier conversation is left out, because the prompt frame sent before that model call carried it. Read the last entry of `messages`, because the protocol may later add earlier messages before it. +* `messages` holds only the latest message, the `assistant` message Claude just produced: any `text` blocks and one `tool_use` block for each tool call the frame lists, in the order the model produced them. Earlier conversation is left out, because the prompt frame sent before that model call carried it. Read the last entry of `messages`, because the protocol may later add earlier messages before it. * Each `tool_use` block carries a `tool_info` object that says who runs or provides the tool. Where `session_id` is set, it is the same on both frames. The tool call frame has its own `request_id`, which is opaque like the prompt frame's. @@ -407,18 +407,18 @@ The reverse doesn't hold. Anything other than HTTP 200 with a parseable verdict * Don't signal a deny with an error status. A non-200 response is a failure, not a deny. * Any `action` value other than `allow` or `deny` is treated as a webhook failure. -Anthropic reads at most 64 KiB of the response body, and the body must be uncompressed. Redirects are not followed, and cookies are ignored. Unknown fields in the verdict body are ignored, so you can return a richer object alongside the fields documented here. +Anthropic reads at most 64 KiB of the response body, and the body must be uncompressed. Redirects are not followed, and cookies are ignored. Unknown fields in the verdict body are ignored, so you can return a richer object alongside the fields documented here. A tool call frame takes the same verdict body, and every rule in this section applies to it unchanged. `allow` lets the tool calls run and the response continues; `deny` stops all of them and ends the response with the same error as a denied prompt, including your `deny_reason`. Text delivered before the first tool call is not taken back. ## Verify the signature -Requests are signed per the [Standard Webhooks](https://www.standardwebhooks.com/) specification, using three headers. Anthropic sends the header names in lowercase, and proxies are free to re-case them, so look them up case-insensitively. +Requests are signed according to the [Standard Webhooks](https://www.standardwebhooks.com/) specification, using three headers. Anthropic sends the header names in lowercase, and proxies are free to re-case them, so look them up case-insensitively. | Header | Contents | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `webhook-id` | Unique identifier for this delivery. Equals the body's `request_id`. Use it as an idempotency key and as the first component of the signed payload. | -| `webhook-timestamp` | Unix time in seconds, as a decimal string, when the request was signed. Reject a timestamp more than five minutes from your server's clock, in either direction. | +| `webhook-timestamp` | Unix time in seconds, as a decimal string, when the request was signed. Reject a timestamp more than 5 minutes from your server's clock, in either direction. | | `webhook-signature` | One or more space-separated `v1,` values, each an HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body bytes}`. Accept the request if any value matches yours, using a constant-time comparison. | Two details cause most verification bugs: @@ -813,7 +813,7 @@ Anthropic retries exactly once, after a 100ms delay, and only when the connectio ### Webhook failures -Timeouts, non-200 statuses (redirects included), unparseable or oversized response bodies, and unreachable endpoints are all webhook failures. A webhook failure never becomes a deny; instead, your organization's [failure handling](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration) setting decides whether the affected request is blocked or proceeds without inspection. +Timeouts, non-200 statuses (redirects included), unparseable or oversized response bodies, and unreachable endpoints are all webhook failures. A webhook failure never becomes a deny; instead, your organization's [failure handling](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration) setting determines whether the affected request is blocked or proceeds without inspection. ### Circuit breaker @@ -823,7 +823,7 @@ Starting 10 minutes after the trip, Anthropic checks whether your server has rec Prompt frames and tool call frames share one circuit breaker, and failures on either count toward it. -Each trip is recorded as an `inference_hooks_circuit_breaker_tripped` activity in the [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed), one activity per trip. While the breaker is tripped, no per-request Inference hooks activities are recorded, so the trip activity is the feed's only record of the tripped window. +Each trip is recorded as an `inference_hooks_circuit_breaker_tripped` activity in the [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed), one activity for each trip. While the breaker is tripped, no per-request Inference hooks activities are recorded, so the trip activity is the feed's only record of the tripped window. ### Latency @@ -852,7 +852,7 @@ Other hook event types will be introduced in the future. A new event type is an A production AI security server makes a few design choices beyond the wire protocol. -**Deduplicate on `webhook-id`.** The `webhook-id` header is unique per delivery and equals the body's `request_id`, and a connection-failure retry reuses it, so it works as an idempotency key. If you record verdicts, key the records on it. +**Deduplicate on `webhook-id`.** The `webhook-id` header is unique for each delivery and equals the body's `request_id`, and a connection-failure retry reuses it, so it works as an idempotency key. If you record verdicts, key the records on it. **Record verdicts and join denials.** Store each verdict you return along with its `reference_id`. Every denial is recorded as an `inference_hooks_request_denied` compliance activity carrying the `reference_id` your server returned, so you can join denials in the [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) to the matching records in your own system. diff --git a/content/en/manage-claude/inference-hooks.md b/content/en/manage-claude/inference-hooks.md index fd65441743..8f79f639e0 100644 --- a/content/en/manage-claude/inference-hooks.md +++ b/content/en/manage-claude/inference-hooks.md @@ -12,7 +12,7 @@ Inference hooks let a Claude Enterprise organization route every governed prompt Because the hook runs on Anthropic's servers, after the request leaves the client and before the model runs, it applies to every governed request uniformly, across all Claude products in your organization, with nothing to install or deploy on user devices. -There are two hook events. `prompt` fires once per governed inference request, before inference begins. `tool_call` fires when Claude's response contains tool calls, before any of them runs, in organizations that have **Validate tool calls** on. +There are two hook events. `prompt` fires once for each governed inference request, before inference starts. `tool_call` fires when Claude's response contains tool calls, before any of them runs, in organizations that have **Validate tool calls** on. *** @@ -35,11 +35,11 @@ Your AI security server sees what the user sees: transcript text, tool calls and The Inference hooks system doesn't keep its own copy of prompt or response content. It stores only your hook configuration and metadata about hook activity, such as verdicts, timestamps, and request identifiers. The Claude product you use stores prompts and responses under its own data retention rules, whether or not hooks are on. For example, a message that a hook blocks on claude.ai stays in the conversation. -If your AI security server is unreachable, returns an error, or doesn't respond within the timeout, your organization's failure handling setting decides the outcome: block the request, or allow it to proceed without inspection. Sustained failures attributable to your server trip a circuit breaker: Anthropic stops contacting it and applies your failure handling setting to every request, then resets the breaker automatically once it detects that your server is returning verdicts again; see [Circuit breaker](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration#circuit-breaker). +If your AI security server is unreachable, returns an error, or doesn't respond within the timeout, your organization's failure handling setting determines the outcome: block the request, or allow it to proceed without inspection. Sustained failures attributable to your server trip a circuit breaker: Anthropic stops contacting it and applies your failure handling setting to every request, then resets the breaker automatically once it detects that your server is returning verdicts again; see [Circuit breaker](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration#circuit-breaker). Enforcement can roll out at your pace, so nobody has to be blocked on day one: shadow mode observes verdicts on live traffic without blocking anything, a rollout percentage inspects a chosen fraction of requests, and exclusions exempt members of chosen roles entirely. See [Configure Inference hooks](https://platform.claude.com/docs/en/manage-claude/inference-hooks-configuration). -For the full request and response schemas, signature verification, and operational details, see [Develop an integration](https://platform.claude.com/docs/en/manage-claude/inference-hooks-endpoint). +For the full request and response schemas, signature verification, and operational details, see [Develop an Inference hooks integration](https://platform.claude.com/docs/en/manage-claude/inference-hooks-endpoint). *** @@ -69,7 +69,7 @@ The steps depend on the app: * Attachments are represented by metadata and extracted text. Raw file and image bytes are never sent, so image-only content (for example, a screenshot of a document) is not inspected. * Verdicts are allow or deny. Rewriting or redacting a prompt is not supported. -* Platform organizations (API access through the Claude Platform) are out of scope. +* Claude Platform organizations (API access through the Platform) are out of scope. *** @@ -101,7 +101,7 @@ Both features serve security, legal, and compliance teams at Claude Enterprise o | What it does | Allows or denies each governed request in real time | Retrieves activity, chats, files, projects, session transcripts, and users for audit and export | | Direction | Anthropic calls your AI security server | You call Anthropic's API | -Use Inference hooks to stop a request before it reaches the model, and the [Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api) to audit what happened afterward. +Use Inference hooks to stop a request before it reaches the model, and the [Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api) to audit what occurred afterward. *** diff --git a/content/en/manage-claude/opentelemetry.md b/content/en/manage-claude/opentelemetry.md index 90b4d41ceb..2d5de3ee70 100644 --- a/content/en/manage-claude/opentelemetry.md +++ b/content/en/manage-claude/opentelemetry.md @@ -45,7 +45,7 @@ Set up OpenTelemetry tracing with the Claude API and Claude SDK | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | | [Messages API](https://platform.claude.com/docs/en/api/messages/create) requests | ✅ | ✅ | ✅ | | [Sessions API](https://platform.claude.com/docs/en/managed-agents/sessions) requests | ✅ | ✅ | ✅ | -| [Token usage](https://platform.claude.com/docs/en/manage-claude/opentelemetry#count-tokens) | ✅ | ✅ | ✅ | +| [Token counts](https://platform.claude.com/docs/en/manage-claude/opentelemetry#count-tokens) | ✅ | ✅ | ✅ | | Each model run within a request | — | ✅ | ✅ | | [Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) turns | — | ✅ | ✅ | | [Server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), run by the API | — | ✅ | ✅ | @@ -132,7 +132,7 @@ With [zero data retention](https://platform.claude.com/docs/en/manage-claude/api ### Content limits -With Full content, each span holds up to 0.75 MB of content by default. That fits a 200k-token context window of English text and stays below the 1 MB request limit of many observability platforms and proxies. If you choose a partner platform as the **Provider**, the Console sets a limit that the platform accepts. +With Full content, each span holds up to 0.75 MB of content by default. That fits a 200k-token context window of English text and stays below the 1 MB request limit of many observability platforms and proxies. If you select a partner platform as the **Provider**, the Console sets a limit that the platform accepts. When content is over the limit, the SDK or the API shortens it and sets `anthropic.content.truncated` to `true`. Request spans drop the system prompt and the earliest messages first, and tool spans drop blocks from the end of the result. Images and documents appear only as their type. @@ -182,7 +182,7 @@ This example follows one chat request, in which your application sends a message 6. The session tool runner runs `list_issues` (shown as the `anthropic.custom_tool_use list_issues` span) and sends its result by calling `sessions.events.send`. 7. A second turn starts with the tool result (shown as the last `anthropic.session.turn` span). -![Example trace of a Managed Agents session: your POST /chat span, the event stream and event list requests of the session tool runner, the client and server spans for the request that sends the user message, a turn with model requests, a bash tool use and a turn on another thread, the runner running list\_issues, the client and server spans for the request that sends the tool result, and a second turn.](https://platform.claude.com/docs/images/opentelemetry-trace-shape.svg) +![Example Managed Agents session trace: POST /chat, four session event requests, three turns, a bash tool use, and list\_issues](https://platform.claude.com/docs/images/opentelemetry-trace-shape.svg) The SDK in your application emits the [`anthropic.custom_tool_use`](https://platform.claude.com/docs/en/api/opentelemetry/spans#anthropic-tool-use-anthropic-mcp-tool-use-and-anthropic-custom-tool-use) span and each request's client span. To get these spans, [set up SDK tracing](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk). diff --git a/content/en/manage-claude/opentelemetry/api.md b/content/en/manage-claude/opentelemetry/api.md index ab0df27df7..9dd12158e8 100644 --- a/content/en/manage-claude/opentelemetry/api.md +++ b/content/en/manage-claude/opentelemetry/api.md @@ -42,14 +42,14 @@ The API emits spans for your Messages API requests and Managed Agents sessions. | Field | What to enter | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | **Provider** | Your observability platform, or **Custom** if it isn't listed. If you choose a listed platform, the Console asks for its details, such as an API key, instead of the **OTLP endpoint URL**, **Request headers**, and **OTLP traces endpoint URL**. | + | **Provider** | Your observability platform, or **Custom** if it isn't listed. If you select a listed platform, the Console asks for its details, such as an API key, instead of the **OTLP endpoint URL**, **Request headers**, and **OTLP traces endpoint URL**. | | **Name** | Optional. For example, "Acme's observability platform." | | **OTLP endpoint URL** | The base HTTPS URL of your observability platform's OTLP/HTTP endpoint, with a hostname, not an IP address. It can have a path prefix, for example `https://gateway.example.com/otlp`. Don't add `/v1/traces`, because the API adds it. If you set an **OTLP traces endpoint URL**, the API uses that URL instead. | | **Request headers** | The headers that the API sends with each request, for example your observability platform's API key header. Put credentials only in header values. After you save, the Console doesn't show the values again. | | **Content mode** | **Metadata only** or **Full content**. See [how the content modes differ](https://platform.claude.com/docs/en/manage-claude/opentelemetry#choose-a-content-mode). | | **Workspaces** | The workspaces whose spans the destination receives: **All**, **Selected**, or **All except**. See [Choose workspaces for a destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#choose-workspaces-for-a-destination). | | **OTLP traces endpoint URL** | Optional, under **Advanced settings**. The full URL of your observability platform's traces endpoint, for example `https://gateway.example.com/custom/traces`. Set it when the platform receives traces at a URL other than the OTLP endpoint URL plus `/v1/traces`. It must have the same host as the OTLP endpoint URL. | - | **Maximum content size in MB** | Optional, under **Advanced settings** when the content mode is **Full content**. The most content that the API sends in each span. The Console fills it in based on the **Provider** you choose. Change it to fit what your observability platform accepts. Leave it empty to send as much as the API allows. See [Content limits](https://platform.claude.com/docs/en/manage-claude/opentelemetry#content-limits). | + | **Maximum content size in MB** | Optional, under **Advanced settings** when the content mode is **Full content**. The most content that the API sends in each span. The Console fills it in based on the **Provider** you select. Change it to fit what your observability platform accepts. Leave it empty to send as much as the API allows. See [Content limits](https://platform.claude.com/docs/en/manage-claude/opentelemetry#content-limits). | 3. Click **Add destination** to save. @@ -677,12 +677,12 @@ To change a destination, open its **More actions** menu while the **Workspace** ## Troubleshooting -| Problem | What to check | -| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| No API spans | The workspace needs an enabled destination that covers it. See [Choose workspaces for a destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#choose-workspaces-for-a-destination). After a destination starts covering a workspace, spans from that workspace can take up to a minute to arrive. | -| The **Delivery** column shows **Failing** | Hover over it to see the last error. To find the likely cause, see [Delivery errors](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#delivery-errors). | -| The **Delivery** column shows **Disabled** | Hover over it to see why. For the reasons, see [when the API disables a destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#delivery-and-health). | -| Spans have no prompts or responses, but the destination is set to **Full content** | Your organization might have a HIPAA, FERPA, or K-12 data-handling restriction with Anthropic. See [Content modes](https://platform.claude.com/docs/en/manage-claude/opentelemetry#choose-a-content-mode). | +| Problem | What to check | +| ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No API spans | The workspace needs an enabled destination that covers it. See [Choose workspaces for a destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#choose-workspaces-for-a-destination). After a destination starts covering a workspace, spans from that workspace can take up to a minute to arrive. The API emits no span for a request whose `traceparent` header has the sampled flag off, or for a request to the [OpenAI-compatible endpoint](https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk). | +| The **Delivery** column shows **Failing** | Hover over it to see the last error. To find the likely cause, see [Delivery errors](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#delivery-errors). | +| The **Delivery** column shows **Disabled** | Hover over it to see why. For the reasons, see [when the API disables a destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#delivery-and-health). | +| Spans have no prompts or responses, but the destination is set to **Full content** | Your organization might have a HIPAA, FERPA, or K-12 data-handling restriction with Anthropic. See [Content modes](https://platform.claude.com/docs/en/manage-claude/opentelemetry#choose-a-content-mode). | ### Delivery errors diff --git a/content/en/manage-claude/opentelemetry/sdk.md b/content/en/manage-claude/opentelemetry/sdk.md index a2c20cc82f..c61b2d9a8c 100644 --- a/content/en/manage-claude/opentelemetry/sdk.md +++ b/content/en/manage-claude/opentelemetry/sdk.md @@ -84,14 +84,14 @@ Install or upgrade to the latest version of the Claude SDK: ```kotlin Gradle - implementation("com.anthropic:anthropic-java:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") ``` ```xml Maven com.anthropic anthropic-java - 2.75.0 + 3.0.0 ``` @@ -203,7 +203,7 @@ The following example registers a tracer provider that prints each span to the c { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }); Console.WriteLine(message); ``` @@ -437,7 +437,7 @@ The following example shows how to use each option: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }); ``` @@ -594,9 +594,9 @@ To stop the SDK from sending these headers, for example when your HTTP client in `@opentelemetry/auto-instrumentations-node` - includes. Otherwise, a + includes. Otherwise, an - [bug in that package](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/3711) + [undici instrumentation bug](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/3711) adds a second @@ -646,7 +646,7 @@ While the SDK calls an [MCP tool](https://platform.claude.com/docs/en/agents-and | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | No spans from the SDK | Register the tracer provider before the first call. Make sure that you installed the SDK as in [Install the SDK](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk#install-the-sdk) and that `ANTHROPIC_OPEN_TELEMETRY` isn't `false`. | | The Java SDK doesn't send spans to the registered tracer provider, or doesn't send trace context to the API | Another dependency sets `opentelemetry-api` below 1.57.0. Upgrade `opentelemetry-api` to 1.57.0 or later. | -| The SDK spans don't nest under your spans, or the spans that your tool creates don't nest under the tool span | Call the SDK from inside one of your own spans, as the [example in Connect API spans to your own traces](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#connect-api-spans-to-your-own-traces) does. In Go, start the spans that your tool creates from the `ctx` that the tool runner passes to it. | +| The SDK spans don't nest under your spans, or the spans that your tool creates don't nest under the tool span | Call the SDK from inside one of your own spans, as the example in [Connect API spans to your own traces](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#connect-api-spans-to-your-own-traces) does. In Go, start the spans that your tool creates from the `ctx` that the tool runner passes to it. | | Requests from the SDK don't have a `traceparent` header | Register the W3C trace context propagator with OpenTelemetry. The SDK writes the headers with your application's propagator. | | A stream's SDK span doesn't end or doesn't have the response | See [Tracing a stream](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk#trace-a-stream). | | Each request appears twice | A request's SDK span and API span have the same name. Use the span kind or `service.name` to tell them apart. If another library also traces the SDK, turn off one of the two. | diff --git a/content/en/manage-claude/organization-webhooks.md b/content/en/manage-claude/organization-webhooks.md index 30c069a0ad..6ca174913d 100644 --- a/content/en/manage-claude/organization-webhooks.md +++ b/content/en/manage-claude/organization-webhooks.md @@ -17,7 +17,7 @@ An organization webhook endpoint receives an event when Anthropic restricts or b Any member of your organization can list and view organization webhook endpoints with the API, but only members with the admin, owner, or primary owner role can create, change, or delete them, or replace their signing secret. -## Before you begin +## Before you start You need the following: @@ -31,7 +31,7 @@ You need the following: ## Event types -Organization webhook endpoints accept two event types. Both are about enforcement actions on user profiles. An enforcement action is a restriction or a ban that Anthropic places on the end customer a profile represents. +Organization webhook endpoints accept two event types. Both are about [enforcement actions](https://platform.claude.com/docs/en/manage-claude/user-profiles#check-whether-anthropic-has-restricted-or-banned-a-profile) on user profiles. | Event | Trigger | | ------------------------------------------ | ----------------------------------------------------------------------------------- | @@ -42,9 +42,9 @@ Deleting a profile ends its open actions without a `user_profile.enforcement_act ### Before your first event -Your profiles won't have the `enforcement_status` and `enforcement_actions` fields until enforcement actions are on for your organization. Until then, and in any request whose `anthropic-beta` header has `user-profiles-2026-09-04` or an earlier value, responses leave the fields out and the `enforcement_status[]` list filter returns a `400`. To get the fields, remove that value from your requests. +In any request whose `anthropic-beta` header has `user-profiles-2026-09-04` or an earlier value, responses leave out the `enforcement_status` and `enforcement_actions` fields and the `enforcement_status[]` list filter returns a `400`. To get the fields, remove that value from your requests. -If an enforcement action opened before Anthropic turned on enforcement actions and event delivery for your organization, or before you registered your endpoint, you don't get a `user_profile.enforcement_action_opened` event for it. The action still appears on the profile. To find these actions, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with `enforcement_status[]=restricted` and `enforcement_status[]=banned`. A response might return fewer profiles than `limit`, or none, before the list ends, so keep requesting pages until `next_page` is `null`. +If an enforcement action opened before Anthropic turned on event delivery for your organization, or before you registered your endpoint, you don't get a `user_profile.enforcement_action_opened` event for it. The action still appears on the profile. To find these actions, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with `enforcement_status[]=restricted` and `enforcement_status[]=banned`. A response might return fewer profiles than `limit`, or none, before the list ends, so keep requesting pages until `next_page` is `null`. ### What an event contains diff --git a/content/en/manage-claude/plugins-api.md b/content/en/manage-claude/plugins-api.md index 177dba4d5a..5e37251ae5 100644 --- a/content/en/manage-claude/plugins-api.md +++ b/content/en/manage-claude/plugins-api.md @@ -17,7 +17,7 @@ For plugin *usage* reporting (which plugins and skills members use, and how ofte The Plugins API is in **beta** and is available to Claude Enterprise organizations only. It is not available to Claude Platform (Claude Console) organizations, or to organizations with HIPAA readiness enabled. - Every request must include the [beta header](https://platform.claude.com/docs/en/api/beta-headers) `anthropic-beta: ce-plugins-2026-09-01` (the SDKs and the `ant` CLI send it for you). A request without it returns `404`, exactly as if the endpoint did not exist. + Every request must include the [beta header](https://platform.claude.com/docs/en/api/beta-headers) `anthropic-beta: ce-plugins-2026-09-01` (the SDK and the `ant` CLI send it for you). A request without it returns `404`, exactly as if the endpoint did not exist. ## Endpoints @@ -40,7 +40,7 @@ This release does not include standalone skills (skills a member writes in the s * Your primary owner creates an Admin API key with the `read:plugins` scope, the `write:plugins` scope, or both in [claude.ai > Organization settings > API](https://claude.ai/admin-settings/api-access). See [Create an Admin API key](https://platform.claude.com/docs/en/manage-claude/admin-api-keys#create-a-key-for-a-claude-enterprise-organization). * Every request carries three headers: `x-api-key`, `anthropic-version: 2023-06-01`, and `anthropic-beta: ce-plugins-2026-09-01`. -The Python, TypeScript, C#, Go, Java, PHP, and Ruby SDKs expose these endpoints under `client.beta.organization` (csharp, go: `client.Beta.Organization`; java: `client.beta().organization()`; php: `$client->beta->organization`), and the [`ant` CLI](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart) under `ant beta:organization`; they send the `anthropic-version` and `anthropic-beta` headers for you. The examples on this page use each SDK's default client, which, like the CLI, reads the Admin API key from the `ANTHROPIC_API_KEY` environment variable; the curl examples read the key from the same variable and pass it in the `x-api-key` header. Where an SDK or the CLI fetches more pages for you, `limit` sets the page size, not the total (see [Pagination](https://platform.claude.com/docs/en/manage-claude/plugins-api#pagination)). +The SDK exposes these endpoints under `client.beta.organization` (csharp, go: `client.Beta.Organization`; java: `client.beta().organization()`; php: `$client->beta->organization`), and the [`ant` CLI](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart) under `ant beta:organization`; they send the `anthropic-version` and `anthropic-beta` headers for you. The examples on this page use the SDK's default client, which, like the CLI, reads the Admin API key from the `ANTHROPIC_API_KEY` environment variable; the curl examples read the key from the same variable and pass it in the `x-api-key` header. Where an SDK or the CLI fetches more pages for you, `limit` sets the page size, not the total (see [Pagination](https://platform.claude.com/docs/en/manage-claude/plugins-api#pagination)). API keys belong to the organization and keep working after the person who created them leaves. Do not share them or check them into source control. @@ -224,14 +224,14 @@ Each of these read scopes (`read:plugins`, `read:org_audit`, and `read:complianc A **plugin** is a package that extends Claude for your organization's members. It contains any combination of these components: -| Component | What it is | -| ---------- | -------------------------------------------------------------------------------------------------------- | -| Skill | Instructions and files that Claude loads when a task calls for it. | -| Command | A saved prompt a member runs by typing `/` followed by the command's name. | -| Agent | A helper assistant with its own instructions, to which Claude can hand part of a task. | -| Hook | A command that runs automatically when an event happens in a session, such as before Claude uses a tool. | -| MCP server | A connection from Claude to tools and data in another system (Model Context Protocol). | -| CLI | A command-line program that the plugin lets Claude run. | +| Component | What it is | +| ---------- | ------------------------------------------------------------------------------------------------------- | +| Skill | Instructions and files that Claude loads when a task calls for it. | +| Command | A saved prompt a member runs by typing `/` followed by the command's name. | +| Agent | A helper assistant with its own instructions, to which Claude can hand part of a task. | +| Hook | A command that runs automatically when an event occurs in a session, such as before Claude uses a tool. | +| MCP server | A connection from Claude to tools and data in another system (Model Context Protocol). | +| CLI | A command-line program that the plugin lets Claude run. | Every plugin has a manifest at `.claude-plugin/plugin.json`. The manifest's `name` becomes the plugin's `name`: a lowercase identifier that is unique within its marketplace. @@ -257,14 +257,14 @@ Removing a member from the organization does not remove their plugins. They stay Every upload creates a new, immutable **version**, whether it comes from this API, from claude.ai, or from a Git synchronization. A plugin has two pointers to its versions: -* `latest_version_id`: the newest version. -* `served_version_id`: the version members are served. +* `latest_version_id`: the newest version +* `served_version_id`: the version members are served By default `served_version_pinned` is `false`: the served version normally follows the newest one. When content scanning is on, a version saved in claude.ai might **wait** for its content scan: it is stored but not served at once. This page uses "wait" only for a version saved in claude.ai, not for one that a member or an administrator publishes into a plugin. While scanning is on, a waiting version is served only after its scan completes with `pass` or `warn`. While a version waits, `served_version_id` names an earlier version than `latest_version_id`. Do not poll until the two IDs match: they might stay different, for example when the scan fails. Choosing a version with `POST /v1/organizations/plugins/{plugin_id}` **pins** the plugin (`served_version_pinned: true`). So does an administrator choosing a version in claude.ai, or accepting a member's request to publish into the plugin. From then on, new uploads are stored and advance `latest_version_id`, but members keep the pinned version until you point `served_version_id` at another one. A plugin whose two pointers differ has a stored version that is not being served. -This lets a release pipeline upload each build, test it, and then promote it. To have your pipeline decide when each build is served, pin the plugin once by setting `served_version_id` to its current version; from then on, promote each build you want served. With content scanning on, that first pin returns `409 scan_pending` until the current version's scan completes, and `400 scan_failed` if the scan completed with `fail` or `unknown`, or errored (`warn` is accepted). A pinned plugin cannot currently be unpinned, here or in claude.ai. +This lets a release pipeline upload each build, test it, and then promote it. To have your pipeline determine when each build is served, pin the plugin once by setting `served_version_id` to its current version; from then on, promote each build you want served. With content scanning on, that first pin returns `409 scan_pending` until the current version's scan completes, and `400 scan_failed` if the scan completed with `fail` or `unknown`, or errored (`warn` is accepted). A pinned plugin cannot currently be unpinned, here or in claude.ai. To roll back, set `served_version_id` to an earlier version. Roll forward the same way. @@ -272,7 +272,7 @@ These rules describe organization-owned plugins. A member-owned plugin's served ### Installation settings -**Installation settings** decide who can use an organization-owned plugin. Each setting has one of four values, carried in the fields named `installation_preference` (and, on the plugin and marketplace objects, `organization_installation_preference` and `default_installation_preference`): +**Installation settings** determine who can use an organization-owned plugin. Each setting has one of four values, carried in the fields named `installation_preference` (and, on the plugin and marketplace objects, `organization_installation_preference` and `default_installation_preference`): | Value | Members see | | --------------- | ---------------------------------------------- | @@ -281,7 +281,7 @@ These rules describe organization-owned plugins. A member-owned plugin's served | `available` | The plugin can be installed on request. | | `not_available` | The plugin is hidden. | -A plugin can hold an organization-wide setting and one setting per group (the role-based access control groups managed in [User management](https://platform.claude.com/docs/en/manage-claude/user-management#groups)). A member gets a value by these rules: +A plugin can hold an organization-wide setting and one setting for each group (the role-based access control groups managed in [User management](https://platform.claude.com/docs/en/manage-claude/user-management#groups)). A member gets a value by these rules: 1. The organization-wide value is the plugin's own organization-wide setting if it has one, otherwise its marketplace's default, otherwise `not_available`. The plugin reports this value in `organization_installation_preference`, with `organization_installation_preference_inherited: true` while it comes from the marketplace default. 2. A member who belongs to no group holding a setting for the plugin gets the organization-wide value. @@ -293,7 +293,7 @@ A plugin created through this API starts with no settings of its own, so it inhe ### Shares -**Shares** decide who can use a member-owned plugin. The owner shares it in claude.ai with every member, with a group, or with named members. This API lists shares but cannot change them. +**Shares** determine who can use a member-owned plugin. The owner shares it in claude.ai with every member, with a group, or with named members. This API lists shares but cannot change them. If your organization has turned off a kind of sharing in its claude.ai settings, shares of that kind still appear in the list but give no one access while that setting is off; the list itself does not show whether it is. @@ -334,7 +334,7 @@ Uploads follow the same rules as plugin uploads in claude.ai, so the same archiv * No file may be under a top-level `bin/` directory. * No nested `.zip` files. Packaged MCP servers (`.mcpb`, `.dxt`) are allowed. * File paths must be relative, contain no `..`, and use only letters, digits, spaces, and `_ . - / ( ) ,`. -* The request body and the uncompressed archive are each at most 200 MB; a request body over the limit returns `413` (`request_too_large`) rather than `400`. An upload has at most 5,000 files, a path depth of 12, paths of 472 characters, and file or folder names of 255 characters. +* The request body and the uncompressed archive are each at most 200 MB; a request body over the limit returns `413` (`request_too_large`) rather than `400`. An upload has at most 5,000 files, a path depth of 12, paths of 472 characters, and file or folder names of 255 characters. * ZIP archives must use DEFLATE or STORE compression, and cannot be encrypted or contain symbolic links. * A marketplace holds at most 500 items, counting its plugins and any standalone skills members keep in it. This limit and the 5,000-file limit are current values that may be raised. @@ -342,7 +342,7 @@ Uploads follow the same rules as plugin uploads in claude.ai, so the same archiv ### Publish each build from a release pipeline -Upload every tagged build from CI, and let the pipeline decide when a build is served. +Upload every tagged build from CI, and let the pipeline determine when a build is served. 1. Find the marketplace to upload into with `GET /v1/organizations/plugin_marketplaces?owner_type=organization`, or omit `marketplace_id` to use the library marketplace. 2. On the first release, [create the plugin](https://platform.claude.com/docs/en/manage-claude/plugins-api#create-a-plugin) with `POST /v1/organizations/plugins`. On every later release, record the plugin's `latest_version_id`, then [upload a version](https://platform.claude.com/docs/en/manage-claude/plugins-api#create-a-version) with `POST /v1/organizations/plugins/{plugin_id}/versions`. If the upload's response is lost, read the plugin and retry only if `latest_version_id` is unchanged (see [Retrying uploads](https://platform.claude.com/docs/en/manage-claude/plugins-api#retrying-uploads)). @@ -504,21 +504,21 @@ Run a nightly job that flags plugins reaching outside the member's session or fa The plugin object describes a plugin in one of your organization's marketplaces or in a member's personal marketplace (the [Quick start](https://platform.claude.com/docs/en/manage-claude/plugins-api#quick-start) response shows a complete one). Its `display_name`, `description`, `manifest_version`, `content_scan`, `components`, and `reach` describe its **served** version, so one list call shows what members are being served. -| Field | Description | -| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `id` | Prefixed `plugin_`. | -| `name` | From the manifest. Unique within its marketplace, not across the organization. Fixed for an organization-owned plugin; changes if a member renames their own plugin in claude.ai. | -| `display_name`, `description`, `manifest_version` | The served version's manifest `displayName`, `description`, and `version`; each is `null` when the manifest declares none. `manifest_version` is normalized for display: one leading `v` or `V` is dropped, so a manifest `version` of `"v1.4.0"` is returned as `"1.4.0"`. It is also `null` for a value that does not look like a version number, such as `"latest"`, and for a plugin version created before claude.ai began recording this field in August 2026. An upload is never refused because of its `version`, and `manifest_version` is not unique. | -| `served_version_id`, `latest_version_id` | Prefixed `pluginver_`: the version members are served, and the newest version. See [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version). | -| `served_version_pinned` | `false` until the plugin is pinned (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)); `true` from then on. | -| `owner` | `{"type": "organization"}`, or `{"type": "user", "user_id": "user_..."}` for a member's personal marketplace. | -| `marketplace_id` | Prefixed `marketplace_`. | -| `created_by` | Who created the plugin: `{"type": "user_actor", "user_id": "user_...", "email_address": "..."}` for a person in claude.ai (`email_address` may be `null`), or `{"type": "api_actor", "api_key_id": "apikey_..."}` for an API key. Other actor types may appear. `null` when no creator is recorded, such as for plugins synchronized from Git. | -| `organization_installation_preference`, `organization_installation_preference_inherited` | Organization-owned: the organization-wide value, and whether it comes from the marketplace's default (see [Installation settings](https://platform.claude.com/docs/en/manage-claude/plugins-api#installation-settings)). Member-owned: both `null`. | -| `content_scan` | The served version's scan result, an object with `status`, `assessment`, and `reason` (described after this table). `null` when it was never scanned. | -| `components` | The served version's components, each `{"type", "name", "description"}` with `type` one of `skill`, `mcp_server`, `command`, `agent`, `hook`, or `cli`, listed in that type order and then by name. For an MCP server, `name` is its key in the manifest; for a hook, the event it runs on; for a CLI, the executable's name. `description` is always `null` for MCP servers, hooks, and CLIs. `null` when not recorded. | -| `reach` | `contained`, `privileged`, or `remote`. See [Reach](https://platform.claude.com/docs/en/manage-claude/plugins-api#reach). | -| `updated_at` | Changes when the served version changes, when the plugin becomes pinned, and normally when a new version is stored. A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) changes it when it becomes the served version, not necessarily when it is stored. It does not change for installation settings, shares, or new scan results. | +| Field | Description | +| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | Prefixed `plugin_`. | +| `name` | From the manifest. Unique within its marketplace, not across the organization. Fixed for an organization-owned plugin; changes if a member renames their own plugin in claude.ai. | +| `display_name`, `description`, `manifest_version` | The served version's manifest `displayName`, `description`, and `version`; each is `null` when the manifest declares none. `manifest_version` is normalized for display: one leading `v` or `V` is dropped, so a manifest `version` of `"v1.4.0"` is returned as `"1.4.0"`. It is also `null` for a value that does not look like a version number, such as `"latest"`, and for a plugin version created before claude.ai started recording this field in August 2026. An upload is never refused because of its `version`, and `manifest_version` is not unique. | +| `served_version_id`, `latest_version_id` | Prefixed `pluginver_`: the version members are served, and the newest version. See [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version). | +| `served_version_pinned` | `false` until the plugin is pinned (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)); `true` from then on. | +| `owner` | `{"type": "organization"}`, or `{"type": "user", "user_id": "user_..."}` for a member's personal marketplace. | +| `marketplace_id` | Prefixed `marketplace_`. | +| `created_by` | Who created the plugin: `{"type": "user_actor", "user_id": "user_...", "email_address": "..."}` for a person in claude.ai (`email_address` might be `null`), or `{"type": "api_actor", "api_key_id": "apikey_..."}` for an API key. Other actor types may appear. `null` when no creator is recorded, such as for plugins synchronized from Git. | +| `organization_installation_preference`, `organization_installation_preference_inherited` | Organization-owned: the organization-wide value, and whether it comes from the marketplace's default (see [Installation settings](https://platform.claude.com/docs/en/manage-claude/plugins-api#installation-settings)). Member-owned: both `null`. | +| `content_scan` | The served version's scan result, an object with `status`, `assessment`, and `reason` (described after this table). `null` when it was never scanned. | +| `components` | The served version's components, each `{"type", "name", "description"}` with `type` one of `skill`, `mcp_server`, `command`, `agent`, `hook`, or `cli`, listed in that type order and then by name. For an MCP server, `name` is its key in the manifest; for a hook, the event it runs on; for a CLI, the executable's name. `description` is always `null` for MCP servers, hooks, and CLIs. `null` when not recorded. | +| `reach` | `contained`, `privileged`, or `remote`. See [Reach](https://platform.claude.com/docs/en/manage-claude/plugins-api#reach). | +| `updated_at` | Changes when the served version changes, when the plugin becomes pinned, and normally when a new version is stored. A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) changes it when it becomes the served version, not necessarily when it is stored. It does not change for installation settings, shares, or new scan results. | The `content_scan` object: @@ -536,7 +536,7 @@ The `content_scan` object: | `remote-code-instruction-loader` | Tells Claude to download and run, or follow instructions from, outside content that can change after the plugin is installed. | | `credential-exposure` | Contains live credentials, or collects credentials or tokens from the member's environment. | | `guardrail-tampering` | Weakens the member's safeguards, for example by pre-approving every permission prompt. | - | `system-prompt-spoofing` | Imitates or tries to replace Claude's system instructions. | + | `system-prompt-spoofing` | Imitates or attempts to replace Claude's system instructions. | | `covert-record-tampering` | Quietly changes, hides, or deletes information the member would otherwise see. | | `covert-behavior-override` | Changes Claude's behavior beyond the plugin's purpose and hides the change from the member. | | `hidden-code-execution` | Runs bundled code while telling Claude not to reveal what it does. | @@ -551,7 +551,7 @@ A `plugin_id` that lacks the `plugin_` prefix returns `400`. A `plugin_id` that ### List plugins -`GET /v1/organizations/plugins` lists every plugin in your organization, in the organization's marketplaces and in members' personal marketplaces, ordered by `created_at` descending. Filter by `owner_type` (`organization` or `user`), `owner_user_id` (prefixed `user_`; a member's plugins, including after the member leaves the organization), `marketplace_id`, and `created_at[gte]`, `created_at[gt]`, `created_at[lte]`, `created_at[lt]` (RFC 3339 timestamps). Filters combine with AND. A `marketplace_id` or `owner_user_id` that matches nothing in your organization returns an empty page, not an error. The response has the shape shown in [Quick start](https://platform.claude.com/docs/en/manage-claude/plugins-api#quick-start). Requires the `read:plugins` scope. +`GET /v1/organizations/plugins` lists every plugin in your organization, in the organization's marketplaces and in members' personal marketplaces, ordered by `created_at` descending. Filter by `owner_type` (`organization` or `user`), `owner_user_id` (an ID prefixed `user_`, which finds a member's plugins, including after the member leaves the organization), `marketplace_id`, and `created_at[gte]`, `created_at[gt]`, `created_at[lte]`, `created_at[lt]` (RFC 3339 timestamps). Filters combine with AND. A `marketplace_id` or `owner_user_id` that matches nothing in your organization returns an empty page, not an error. The response has the shape shown in [Quick start](https://platform.claude.com/docs/en/manage-claude/plugins-api#quick-start). Requires the `read:plugins` scope. ```bash cURL @@ -668,7 +668,7 @@ A `plugin_id` that lacks the `plugin_` prefix returns `400`. A `plugin_id` that ### Create a plugin -`POST /v1/organizations/plugins` creates an organization-owned plugin and its first version in one call; the version becomes the served version. The body is `multipart/form-data`: `files[]` is either one `.zip` or `.plugin` archive, or one part per file, where each part's filename is the file's path within the plugin (for example `.claude-plugin/plugin.json`). Optional fields are `marketplace_id` (an organization-owned `manual` marketplace; defaults to your library marketplace, which is created on first use) and `release_notes` (up to 5,000 characters, shown in claude.ai's version history and returned on the version). The plugin's `name`, `display_name`, `description`, and `manifest_version` come from the uploaded manifest, and the upload must meet the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements). When content scanning is on, the response's `content_scan.status` is `processing` and the verdict arrives asynchronously. Returns the plugin. Requires the `write:plugins` scope. +`POST /v1/organizations/plugins` creates an organization-owned plugin and its first version in one call; the version becomes the served version. The body is `multipart/form-data`: `files[]` is either one `.zip` or `.plugin` archive, or one part for each file, where each part's file name is the file's path within the plugin (for example `.claude-plugin/plugin.json`). Optional fields are `marketplace_id` (an organization-owned `manual` marketplace, or by default your library marketplace, which is created on first use) and `release_notes` (up to 5,000 characters, shown in claude.ai's version history and returned on the version). The plugin's `name`, `display_name`, `description`, and `manifest_version` come from the uploaded manifest, and the upload must meet the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements). When content scanning is on, the response's `content_scan.status` is `processing` and the verdict arrives asynchronously. Returns the plugin. Requires the `write:plugins` scope. Upload an archive: @@ -836,7 +836,7 @@ Upload an archive: } ``` -Upload individual files into a named marketplace. Attach each file under its path within the plugin (the `;filename=` suffix in the cURL example, the filename arguments in the SDK examples); a file sent under its base name alone means the manifest is not found. The TypeScript and Java SDKs and the `ant` CLI cannot yet attach files under a path, so those examples upload the plugin as one archive into the marketplace instead: +Upload individual files into a named marketplace. Attach each file under its path within the plugin (the `;filename=` suffix in the cURL example, the file name arguments in the SDK examples); a file sent under its base name alone means the manifest is not found. The TypeScript and Java SDKs and the `ant` CLI cannot yet attach files under a path, so those examples upload the plugin as one archive into the marketplace instead: ```bash cURL @@ -1030,7 +1030,7 @@ Upload individual files into a named marketplace. Attach each file under its pat ``` -Besides a `400` for an upload that breaks the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements) (`413` for a request body over 200 MB) and the shared responses (a `403` when `marketplace_id` is a member's personal marketplace; see [Error responses](https://platform.claude.com/docs/en/manage-claude/plugins-api#error-responses)), a create can fail with: +Besides a `400` for an upload that breaks the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements) (`413` for a request body over 200 MB) and the shared responses (a `403` when `marketplace_id` is a member's personal marketplace; see [Error responses](https://platform.claude.com/docs/en/manage-claude/plugins-api#error-responses)), a create can fail with: | Status | Cause | What to do | | -------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1395,7 +1395,7 @@ Deletion cannot be undone, and there is no per-version delete. To withhold an or ## Plugin versions -A plugin version is an immutable snapshot of a plugin's files from one upload (the [Create a version](https://platform.claude.com/docs/en/manage-claude/plugins-api#create-a-version) response shows a complete object). Its fields mirror the plugin's served-version fields (`display_name`, `description`, `manifest_version`, `content_scan`, `components`, `reach`) for this version, plus `release_notes` (as supplied with the upload; shown in claude.ai's version history) and `created_by` (who uploaded it). +A plugin version is an immutable snapshot of a plugin's files from one upload (the [Create a version](https://platform.claude.com/docs/en/manage-claude/plugins-api#create-a-version) response shows a complete object). Its fields mirror the plugin's served-version fields (`display_name`, `description`, `manifest_version`, `content_scan`, `components`, `reach`) for this version, plus `release_notes` (as supplied with the upload and shown in claude.ai's version history) and `created_by` (who uploaded it). A `{version}` that lacks the `pluginver_` prefix returns `400` (except the literal `latest` where noted). One that carries the prefix but does not identify a version of that plugin returns `404`. @@ -1700,7 +1700,7 @@ A `{version}` that lacks the `pluginver_` prefix returns `400` (except the liter } ``` -Besides a `400` for an upload that breaks the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements) (`413` for a request body over 200 MB) and the shared responses (a `403` for a member-owned plugin; see [Error responses](https://platform.claude.com/docs/en/manage-claude/plugins-api#error-responses)), the request can fail with: +Besides a `400` for an upload that breaks the [upload requirements](https://platform.claude.com/docs/en/manage-claude/plugins-api#upload-requirements) (`413` for a request body over 200 MB) and the shared responses (a `403` for a member-owned plugin; see [Error responses](https://platform.claude.com/docs/en/manage-claude/plugins-api#error-responses)), the request can fail with: | Status | Cause | What to do | | -------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1822,7 +1822,7 @@ Besides a `400` for an upload that breaks the [upload requirements](https://plat ### Download a version's files -`GET /v1/organizations/plugins/{plugin_id}/versions/{version}/content` downloads a version's files as the stored `.zip` archive (`Content-Type: application/zip`). The archive is returned whatever its content-scan result, so you can inspect versions withheld from members. It is served exactly as stored, so for an organization-owned plugin in a `manual` marketplace you can re-upload it unchanged as a new version, provided it meets the current upload requirements. `{version}` must be a version ID, not `latest`: read the plugin's `served_version_id` or `latest_version_id` first, or resolve `latest` with `GET /v1/organizations/plugins/{plugin_id}/versions/latest`. The `Content-Disposition` filename is derived from the plugin's name and is not unique; name saved files by plugin and version ID. Requires the `read:plugins` scope. +`GET /v1/organizations/plugins/{plugin_id}/versions/{version}/content` downloads a version's files as the stored `.zip` archive (`Content-Type: application/zip`). The archive is returned whatever its content-scan result, so you can inspect versions withheld from members. It is served exactly as stored, so for an organization-owned plugin in a `manual` marketplace you can re-upload it unchanged as a new version, provided it meets the current upload requirements. `{version}` must be a version ID, not `latest`: read the plugin's `served_version_id` or `latest_version_id` first, or resolve `latest` with `GET /v1/organizations/plugins/{plugin_id}/versions/latest`. The `Content-Disposition` file name is derived from the plugin's name and is not unique; name saved files by plugin and version ID. Requires the `read:plugins` scope. Downloading a **member-owned** plugin's archive records a `claude_plugin_archive_accessed` event on the Compliance API Activity Feed, identifying the key (as `api_actor`), the plugin and its marketplace, the version, and the owning member by ID; it carries no names. Downloading an organization-owned plugin's archive records nothing. @@ -2483,15 +2483,15 @@ This API reads [marketplaces](https://platform.claude.com/docs/en/manage-claude/ } ``` -| Field | Description | -| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | The marketplace's name. Fixed for its lifetime. | -| `owner` | Same shape as on the plugin. | -| `source` | `manual`, `github`, `gitlab`, or `public_git`. See [Marketplaces](https://platform.claude.com/docs/en/manage-claude/plugins-api#marketplaces). | -| `sync_status` | Outcome of the most recent synchronization: `success`, `in_progress`, `failed_content`, `failed_transient`, `failed_auth`, or `failed_limits`. `null` until a synchronization is first attempted, which never happens for a marketplace whose source is `manual`. | -| `last_sync_ended_at` | When the most recent synchronization attempt finished, whatever its outcome; for a connected repository that has not synchronized yet, when the marketplace was created. `null` for a marketplace that is not synchronized. | -| `last_sync_read_sha` | The commit the last synchronization read from the repository. Not necessarily the commit the served versions came from. `null` for a marketplace that is not synchronized. | -| `default_installation_preference` | Organization marketplaces: the organization-wide value for every plugin in it without its own setting (`not_available` if never set). Personal marketplaces: `null`. | +| Field | Description | +| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | The marketplace's name. Fixed for its lifetime. | +| `owner` | Same shape as on the plugin. | +| `source` | `manual`, `github`, `gitlab`, or `public_git`. See [Marketplaces](https://platform.claude.com/docs/en/manage-claude/plugins-api#marketplaces). | +| `sync_status` | Outcome of the most recent synchronization: `success`, `in_progress`, `failed_content`, `failed_transient`, `failed_auth`, or `failed_limits`. `null` until a synchronization is first attempted, which never occurs for a marketplace whose source is `manual`. | +| `last_sync_ended_at` | When the most recent synchronization attempt finished, whatever its outcome; for a connected repository that has not synchronized yet, when the marketplace was created. `null` for a marketplace that is not synchronized. | +| `last_sync_read_sha` | The commit the last synchronization read from the repository. Not necessarily the commit the served versions came from. `null` for a marketplace that is not synchronized. | +| `default_installation_preference` | Organization marketplaces: the organization-wide value for every plugin in it without its own setting (`not_available` if never set). Personal marketplaces: `null`. | A `marketplace_id` that lacks the `marketplace_` prefix returns `400`. One that carries the prefix but does not resolve, or belongs to another organization, returns `404`. @@ -2838,11 +2838,11 @@ A `marketplace_id` that lacks the `marketplace_` prefix returns `400`. One that ### Validate marketplace content -Two endpoints report what a synchronization of the given marketplace content would do, without connecting or storing anything: `POST /v1/organizations/plugin_marketplaces/validate_repository` reads a public GitHub repository, and `POST /v1/organizations/plugin_marketplaces/validate_archive` reads a `.zip` of the marketplace directory that you upload. Both return the same report: whether `marketplace.json` is well-formed, which plugins would be skipped and why, and which plugins would synchronize with some contents left out. The checks are the ones a real synchronization runs. Problems with the content come back in the report, not as HTTP errors: the request succeeds with `valid: false`, even when the repository or archive cannot be read at all. A validation counts as a read, and the two endpoints together are additionally limited to 10 validations a minute per organization (see [Rate limiting](https://platform.claude.com/docs/en/manage-claude/plugins-api#rate-limiting)); they record nothing on the Activity Feed. A validation can take up to 120 seconds before it returns, so set your client's timeout above that. Both endpoints require the `read:plugins` or `write:plugins` scope (`read:org_audit` and `read:compliance_org_data` do not grant them). +Two endpoints report what a synchronization of the given marketplace content would do, without connecting or storing anything: `POST /v1/organizations/plugin_marketplaces/validate_repository` reads a public GitHub repository, and `POST /v1/organizations/plugin_marketplaces/validate_archive` reads a `.zip` of the marketplace directory that you upload. Both return the same report: whether `marketplace.json` is well-formed, which plugins would be skipped and why, and which plugins would synchronize with some contents left out. The checks are the ones a real synchronization runs. Problems with the content come back in the report, not as HTTP errors: the request succeeds with `valid: false`, even when the repository or archive cannot be read at all. A validation counts as a read, and the two endpoints together are additionally limited to 10 validations a minute for each organization (see [Rate limiting](https://platform.claude.com/docs/en/manage-claude/plugins-api#rate-limiting)); they record nothing on the Activity Feed. A validation can take up to 120 seconds before it returns, so set your client's timeout above that. Both endpoints require the `read:plugins` or `write:plugins` scope (`read:org_audit` and `read:compliance_org_data` do not grant them). The repository, and any plugin source outside it on GitHub, are read anonymously, so a private repository or private plugin source is reported as not found. Plugin sources on hosts other than GitHub are not fetched; such a plugin normally gets a `marketplace_validate_source_not_checked` warning and is checked when the marketplace actually synchronizes. If the repository is, or the archive names, a marketplace that Anthropic synchronizes into every organization, stricter rules apply: every plugin source outside the marketplace must be pinned to a full commit SHA, unpinned or unsupported-host sources are reported as plugin errors, and the branch read defaults to the one that marketplace synchronizes from. -`validate_repository` takes a JSON body with two fields: `repository_url`, the `https://` URL of a public repository on github.com (required), and `ref`, a branch name or a full 40-character commit SHA (optional; when it is omitted or `null`, the branch a synchronization would read, usually the repository's default branch). `validate_archive` takes `multipart/form-data` with exactly one part, `archive`, sent as a file part with a filename: a `.zip` of the marketplace directory, at most 32 MB, with its contents at the root or wrapped in one folder (as a Git host's download produces), DEFLATE or STORE compression only. No other form field is accepted. +`validate_repository` takes a JSON body with two fields: `repository_url`, the `https://` URL of a public repository on github.com (required), and `ref`, a branch name or a full 40-character commit SHA (optional; when it is omitted or `null`, the branch a synchronization would read, usually the repository's default branch). `validate_archive` takes `multipart/form-data` with exactly one part, `archive`, sent as a file part with a file name: a `.zip` of the marketplace directory, at most 32 MB, with its contents at the root or wrapped in one folder (as a Git host's download produces), DEFLATE or STORE compression only. No other form field is accepted. Validate a public repository at a branch: @@ -2991,15 +2991,15 @@ Validate a public repository at a branch: } ``` -| Field | Description | -| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `valid` | `true` when `marketplace.json` is well-formed and no plugin would be skipped. Warnings do not make it `false`. | -| `ref` | The branch that was read, by name; `null` when no branch was named and the default branch was read, for a commit SHA, or for an archive. | -| `commit_sha` | The commit that was validated. For an archive downloaded from a Git host, the commit the host recorded in the ZIP file's comment field, if any (not verified). | -| `total_plugin_count` | How many plugins `marketplace.json` declares; `0` when it could not be read. | -| `manifest_error`, `manifest_error_code` | Set when nothing could be validated: the source could not be read, or `marketplace.json` is missing, malformed, or over a limit. Validation that did not finish within 120 seconds reports `manifest_error_code: "marketplace_validate_deadline_exceeded"`. | -| `plugin_errors` | One `{name, error, error_code}` per plugin a synchronization would skip. | -| `plugin_warnings` | One `{name, warnings: [{message, error_code}]}` per plugin that would synchronize with some contents left out. | +| Field | Description | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `valid` | `true` when `marketplace.json` is well-formed and no plugin would be skipped. Warnings do not make it `false`. | +| `ref` | The branch that was read, by name; `null` when no branch was named and the default branch was read, for a commit SHA, or for an archive. | +| `commit_sha` | The commit that was validated. For an archive downloaded from a Git host, the commit the host recorded in the ZIP file's comment field, if any (not verified). | +| `total_plugin_count` | How many plugins `marketplace.json` declares; `0` when it could not be read. | +| `manifest_error`, `manifest_error_code` | Set when nothing could be validated: the source could not be read, or `marketplace.json` is missing, malformed, or over a limit. Validation that did not complete within 120 seconds reports `manifest_error_code: "marketplace_validate_deadline_exceeded"`. | +| `plugin_errors` | One `{name, error, error_code}` per plugin a synchronization would skip. | +| `plugin_warnings` | One `{name, warnings: [{message, error_code}]}` per plugin that would synchronize with some contents left out. | Validate a local copy of the marketplace directory instead, as a `.zip`; the response is the same report: @@ -3120,14 +3120,14 @@ Validate a local copy of the marketplace directory instead, as a `.zip`; the res Problems with the content never fail the request. Apart from the responses every endpoint shares (a `403` for a key that has only `read:org_audit` or `read:compliance_org_data`; see [Error responses](https://platform.claude.com/docs/en/manage-claude/plugins-api#error-responses) and [Rate limiting](https://platform.claude.com/docs/en/manage-claude/plugins-api#rate-limiting)), the request itself can fail with: -| Status | Cause | What to do | -| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | -| 400 | On `validate_repository`: the body is not a JSON object; `repository_url` is missing, is longer than 2,048 characters, carries credentials, or is not of the form `https://github.com/{owner}/{repo}` (a `.git` suffix is accepted; another host, a longer path such as a branch page's `/tree/main`, or a port other than 443 or 80 is not); `ref` is empty, is longer than 255 characters, contains `..`, or contains a character other than ASCII letters, digits, `.`, `_`, `-`, `+`, and `/`; or another field is present. A `ref` that passes these checks but names a branch the repository does not have is not refused: the request succeeds with `valid: false` and `manifest_error` says the branch was not found. On `validate_archive`: the body is not `multipart/form-data`, the `archive` part is missing, repeated, or not sent as a file part with a filename, or another form field is present. | Fix the request and resend. | -| 413 | On `validate_archive`: the `archive` part, or the request's declared body length, exceeds 32 MB. | Validate the repository by URL instead, or trim the archive. | +| Status | Cause | What to do | +| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | +| 400 | On `validate_repository`: the body is not a JSON object; `repository_url` is missing, is longer than 2,048 characters, carries credentials, or is not of the form `https://github.com/{owner}/{repo}` (a `.git` suffix is accepted; another host, a longer path such as a branch page's `/tree/main`, or a port other than 443 or 80 is not); `ref` is empty, is longer than 255 characters, contains `..`, or contains a character other than ASCII letters, digits, `.`, `_`, `-`, `+`, and `/`; or another field is present. A `ref` that passes these checks but names a branch the repository does not have is not refused: the request succeeds with `valid: false` and `manifest_error` says the branch was not found. On `validate_archive`: the body is not `multipart/form-data`, the `archive` part is missing, repeated, or not sent as a file part with a file name, or another form field is present. | Fix the request and resend. | +| 413 | On `validate_archive`: the `archive` part, or the request's declared body length, exceeds 32 MB. | Validate the repository by URL instead, or trim the archive. | #### Report codes -Each finding in a report has a stable code: `manifest_error_code` when nothing could be validated, `error_code` on each `plugin_errors` entry, and `error_code` on each warning. When a plugin has several problems, `error_code` is the first one's and `error` joins their messages. New codes may be added; an unrecognized `manifest_error_code` still means the content could not be validated, one on a `plugin_errors` entry still means the plugin would be skipped, and one on a warning still means the plugin would synchronize. These codes indicate transient conditions, so the same request may succeed later: `marketplace_host_rate_limited`, `marketplace_host_server_error`, `marketplace_host_timeout`, `marketplace_host_unreachable`, `marketplace_repo_access_denied`, `marketplace_sync_transient_fetch_budget_exhausted`, `marketplace_validate_network_error`, and usually `marketplace_validate_deadline_exceeded`. +Each finding in a report has a stable code: `manifest_error_code` when nothing could be validated, `error_code` on each `plugin_errors` entry, and `error_code` on each warning. When a plugin has several problems, `error_code` is the first one's and `error` joins their messages. New codes may be added; an unrecognized `manifest_error_code` still means the content could not be validated, one on a `plugin_errors` entry still means the plugin would be skipped, and one on a warning still means the plugin would synchronize. These codes indicate transient conditions, so the same request might succeed later: `marketplace_host_rate_limited`, `marketplace_host_server_error`, `marketplace_host_timeout`, `marketplace_host_unreachable`, `marketplace_repo_access_denied`, `marketplace_sync_transient_fetch_budget_exhausted`, `marketplace_validate_network_error`, and usually `marketplace_validate_deadline_exceeded`. ## Unrecognized values @@ -3135,7 +3135,7 @@ Every string value on this page (component types, `reach`, scan fields, marketpl ## Rate limiting -Read requests (every `GET` endpoint on this page) share a limit of **300 requests per minute** per organization, and write requests (creating a plugin or version, changing the served version, deleting, setting or removing an installation setting, and updating a marketplace) share a limit of **60 requests per minute** per organization. A marketplace validation (either endpoint) counts as a read, and validations are additionally limited to 10 a minute per organization across both endpoints; both limits are checked before the request body is read. These limits are counted across all of your organization's keys and are separate from your organization's other Admin API limits. Requests over a limit return **429 Too Many Requests** with a `retry-after` header. Responses include `anthropic-ratelimit-requests-*` headers for the limit that applies (on marketplace validation, its 10-per-minute limit; on a `429`, whichever limit refused the request). +Read requests (every `GET` endpoint on this page) share a limit of **300 requests per minute** for each organization, and write requests (creating a plugin or version, changing the served version, deleting, setting or removing an installation setting, and updating a marketplace) share a limit of **60 requests per minute** for each organization. A marketplace validation (either endpoint) counts as a read, and validations are additionally limited to 10 a minute for each organization across both endpoints; both limits are checked before the request body is read. These limits are counted across all of your organization's keys and are separate from your organization's other Admin API limits. Requests over a limit return **429 Too Many Requests** with a `retry-after` header. Responses include `anthropic-ratelimit-requests-*` headers for the limit that applies (on marketplace validation, its 10-per-minute limit; on a `429`, whichever limit refused the request). An upload, a served-version change, or a validation can also return `429` with `retry-after` when the service briefly has no capacity for another one, and an upload returns `429` when your organization has exceeded its content-scan rate. Handle all of these the same way: wait for `retry-after`, then retry. Separately from these limits, send installation-setting writes for the same plugin one at a time: when several arrive at the same time, some can be answered with `503` and `x-should-retry: true`, and those are safe to send again after a second or two (see [Set an installation setting](https://platform.claude.com/docs/en/manage-claude/plugins-api#set-an-installation-setting)). @@ -3147,7 +3147,7 @@ List endpoints use an **opaque cursor**. The first request returns up to `limit` ## Error responses -Error responses follow the standard shape documented in [Errors](https://platform.claude.com/docs/en/api/errors). Quote the `request_id` from the response body when contacting support. +Error responses follow the standard shape documented in [Claude API errors](https://platform.claude.com/docs/en/api/errors). Quote the `request_id` from the response body when contacting support. | Status | Meaning | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -3216,7 +3216,7 @@ Every write through this API is recorded on your organization's [Compliance API | `marketplace_updated` | A marketplace's default installation setting changes, or an administrator or owner starts a synchronization in claude.ai. | | `marketplace_deleted` | A marketplace is deleted in claude.ai together with its plugins (no per-plugin events). | | `claude_plugin_archive_accessed` | A member-owned plugin's archive is downloaded. | -| `claude_plugin_security_scan_completed` | A content scan finishes. | +| `claude_plugin_security_scan_completed` | A content scan completes. | The plugin, version, and marketplace IDs in these events are the same IDs this API returns. `plugin_installation_preference_updated` identifies the plugin by its `name` and `marketplace_id` rather than its `id`. diff --git a/content/en/manage-claude/rate-limits-api.md b/content/en/manage-claude/rate-limits-api.md index 7cf6ebd639..e75ab72e40 100644 --- a/content/en/manage-claude/rate-limits-api.md +++ b/content/en/manage-claude/rate-limits-api.md @@ -71,7 +71,7 @@ List the rate limits configured for your organization: await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { Console.WriteLine($" {limit.Type}: {limit.Value}"); @@ -153,8 +153,8 @@ The `/v1/organizations/rate_limits` endpoint returns the rate limits applied at * **Rate limit groups:** Each entry in the response represents one rate limit group. Model rate limits are grouped so that several model versions share a single set of limits, and other groups cover resources such as the Message Batches API, the Files API, the Token Counting API, agent skills, and the web search tool. * **`group` object:** Present on every entry, it identifies the rate limit group the entry applies to. It always has `type`, which is one of the `group_type` values, and `id`, an opaque identifier with the `rlg_` prefix. On `model_group` entries it also has `display_name`, Anthropic's current label for the group, such as `Claude Sonnet 4.x`. The label is for display only and may change. Other group types have no `display_name`. -* **The `id` inside `group`:** A group has the same `id` in every organization and on every workspace override, and it never changes. Use it to match entries across organizations or against your own catalog. The entry's own `id` differs per organization, and `models` changes when Anthropic moves a model between groups. Neither is a stable key for the group. -* **`group_type`:** Deprecated in favor of the `type` inside `group`. It's still returned, always equals that value, and has no removal date. The `group_type` query parameter isn't deprecated. See [Filtering by group type](https://platform.claude.com/docs/en/manage-claude/rate-limits-api#filtering-by-group-type) for the list of values. +* **The `id` inside `group`:** A group has the same `id` in every organization and on every workspace override, and it never changes. Use it to match entries across organizations or against your own catalog. The entry's own `id` differs for each organization, and `models` changes when Anthropic moves a model between groups. Neither is a stable key for the group. +* **`group_type`:** The query parameter that restricts the list to one group type. See [Filtering by group type](https://platform.claude.com/docs/en/manage-claude/rate-limits-api#filtering-by-group-type) for the values. * **`models` list:** For `model_group` entries, the `models` field lists every model ID and alias that counts against that group's limits. Use this list to look up which group any model string falls under. For other group types, `models` is `null`. * **`limits` list:** Each group carries a list of `{type, value}` pairs. The `type` field identifies the limiter (such as `requests_per_minute`, `input_tokens_per_minute`, or `output_tokens_per_minute`) and `value` is the configured limit. See [Rate limits](https://platform.claude.com/docs/en/api/rate-limits) for how each limiter is measured and enforced. * **`source` on workspace limits:** On the workspace endpoint, every limit value also carries `source`, which says where `value` comes from: `{"type": "workspace"}` for an override stored on the workspace, or `{"type": "organization"}` for a value inherited from the organization. By default, the workspace endpoint returns overrides only, so `source.type` is always `workspace` there; inherited values appear when you pass `include_inherited=true`. See [Workspace rate limits](https://platform.claude.com/docs/en/manage-claude/rate-limits-api#workspace-rate-limits). @@ -208,7 +208,7 @@ For complete parameter details and response schemas, see the [Organization Rate await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { Console.WriteLine($" {limit.Type}: {limit.Value}"); @@ -286,6 +286,7 @@ For complete parameter details and response schemas, see the [Organization Rate { "data": [ { + "id": "rlt_01NwFawrTvAijwqn8AjKVBPS", "type": "rate_limit", "group_type": "model_group", "group": { @@ -301,6 +302,7 @@ For complete parameter details and response schemas, see the [Organization Rate ] }, { + "id": "rlt_016qriyigbdebqkzhMujdHkX", "type": "rate_limit", "group_type": "model_group", "group": { @@ -322,6 +324,7 @@ For complete parameter details and response schemas, see the [Organization Rate ] }, { + "id": "rlt_01EyY8kq14eviKJPgepbgBH4", "type": "rate_limit", "group_type": "batch", "group": { "type": "batch", "id": "rlg_01Wn3pBz6kCg9vHtQ7mLxD5a" }, @@ -387,7 +390,7 @@ Pass any model ID or alias as the `model` query parameter to return only the ent await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { Console.WriteLine($" {limit.Type}: {limit.Value}"); @@ -490,7 +493,7 @@ By default, the response only includes overrides, so anything missing from it is For complete parameter details and response schemas, see the [Workspace Rate Limits API reference](https://platform.claude.com/docs/en/api/organization/workspaces/rate_limits/list). - To retrieve your organization's workspace IDs, use the [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) endpoint, or find them in the [Claude Console](https://platform.claude.com/settings/workspaces). List Workspaces includes the default workspace only when you pass `include_default=true`. + To retrieve your organization's workspace IDs, use the [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) endpoint, or find them on the [Workspaces](https://platform.claude.com/settings/workspaces) page in the Claude Console. List Workspaces includes the default workspace only when you pass `include_default=true`. @@ -545,7 +548,7 @@ For complete parameter details and response schemas, see the [Workspace Rate Lim await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { Console.WriteLine($" {limit.Type}: {limit.Value}"); @@ -631,6 +634,8 @@ For complete parameter details and response schemas, see the [Workspace Rate Lim { "data": [ { + "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", + "rate_limit_id": "rlt_01NwFawrTvAijwqn8AjKVBPS", "type": "workspace_rate_limit", "group_type": "model_group", "group": { @@ -655,6 +660,8 @@ For complete parameter details and response schemas, see the [Workspace Rate Lim ] }, { + "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", + "rate_limit_id": "rlt_016qriyigbdebqkzhMujdHkX", "type": "workspace_rate_limit", "group_type": "model_group", "group": { @@ -753,10 +760,10 @@ To read a workspace's applicable limits in one request, add the optional `includ await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { - Console.WriteLine($" {limit.Type}: {limit.Value} ({limit.Source.Type.GetString()})"); + Console.WriteLine($" {limit.Type}: {limit.Value} ({limit.Source.Type.Raw()})"); } } ``` @@ -850,6 +857,8 @@ To read a workspace's applicable limits in one request, add the optional `includ { "data": [ { + "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", + "rate_limit_id": "rlt_01NwFawrTvAijwqn8AjKVBPS", "type": "workspace_rate_limit", "group_type": "model_group", "group": { @@ -880,6 +889,8 @@ To read a workspace's applicable limits in one request, add the optional `includ ] }, { + "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", + "rate_limit_id": "rlt_016qriyigbdebqkzhMujdHkX", "type": "workspace_rate_limit", "group_type": "model_group", "group": { @@ -916,6 +927,8 @@ To read a workspace's applicable limits in one request, add the optional `includ ] }, { + "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ", + "rate_limit_id": "rlt_01EyY8kq14eviKJPgepbgBH4", "type": "workspace_rate_limit", "group_type": "batch", "group": { "type": "batch", "id": "rlg_01Wn3pBz6kCg9vHtQ7mLxD5a" }, @@ -988,7 +1001,7 @@ Both endpoints accept an optional `group_type` query parameter that restricts th await foreach (var entry in rateLimits.Paginate()) { var models = entry.Models is null ? "" : $" ({string.Join(", ", entry.Models)})"; - Console.WriteLine($"{entry.Group.Type.GetString()}{models}"); + Console.WriteLine($"{entry.Group.Type.Raw()}{models}"); foreach (var limit in entry.Limits) { Console.WriteLine($" {limit.Type}: {limit.Value}"); @@ -1088,7 +1101,7 @@ Both endpoints accept a `page` query parameter and return a `next_page` field. R Every model ID and alias that counts against the group, including dated IDs (such as `claude-sonnet-4-5-20250929`) and undated aliases (such as `claude-sonnet-4-5`). Look up any model string you pass to the Messages API and you'll find it in exactly one `model_group` entry. -The list covers the models your organization has access to, so it can differ between organizations. +The list covers the models your organization has access to, so it can differ among organizations. ### What does it mean if a group is missing from the workspace response? diff --git a/content/en/manage-claude/spend-limits-api.md b/content/en/manage-claude/spend-limits-api.md index 0d24ec9375..1f9edd0952 100644 --- a/content/en/manage-claude/spend-limits-api.md +++ b/content/en/manage-claude/spend-limits-api.md @@ -186,21 +186,21 @@ The `source` field on each member's row tells you which level their spend limit ### Amounts and currency -All monetary values are strings in **minor units of the organization's billing currency** (cents, for USD). For example, `"50000"` represents 500.00 USD. Parse as a decimal and divide by 100 to display dollars; avoid binary floating-point for large values. +All monetary values are strings in **minor units of the organization's billing currency** (cents, for USD). For example, `"50000"` represents $500.00 USD. Parse as a decimal and divide by 100 to display dollars; avoid binary floating-point for large values. `amount` is **nullable**. In a member's effective row, `null` means **unlimited** (no spend limit) and `"0"` means the member cannot use Claude beyond their plan's included usage. On a configured spend-limit row (as returned by `GET /v1/organizations/spend_limits/{id}`), `null` only means no numeric spend limit is set; read the member's effective row to distinguish unlimited from included-usage-only. -`period_to_date_spend` is the member's spend accrued since the start of the current `period`, in the same minor-unit format; it may include a fractional part (for example, `"41280.125"`). It may read as `"0"` if the spend reading is temporarily unavailable; treat it as informational, not transactional. +`period_to_date_spend` is the member's spend accrued since the start of the current `period`, in the same minor-unit format; it might include a fractional part (for example, `"41280.125"`). It might read as `"0"` if the spend reading is temporarily unavailable; treat it as informational, not transactional. ### Increase request lifecycle A **spend limit increase request** is created when a member clicks **Request more usage** in claude.ai. Requests are not created through this API. A request's `status` is one of: -| Status | Meaning | -| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `pending` | Awaiting admin action. The request normally carries a live `spend_summary` so you can see the member's current effective spend limit and period-to-date spend while deciding; `spend_summary` may be `null` if it could not be computed. | -| `approved` | The request was resolved with approval: either an admin approved it explicitly, another admin action raised the member's spend limit, or Anthropic support raised a spend limit on the organization's behalf. `spend_summary` is `null`. | -| `denied` | An admin declined. `spend_summary` is `null`. The member can send a new request right away; only a `pending` request blocks a new one. An admin can still raise the member's spend limit directly at any time. | +| Status | Meaning | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `pending` | Awaiting admin action. The request normally carries a live `spend_summary` so you can see the member's current effective spend limit and period-to-date spend while deciding; `spend_summary` might be `null` if it could not be computed. | +| `approved` | The request was resolved with approval: either an admin approved it explicitly, another admin action raised the member's spend limit, or Anthropic support raised a spend limit on the organization's behalf. `spend_summary` is `null`. | +| `denied` | An admin declined. `spend_summary` is `null`. The member can send a new request right away; only a `pending` request blocks a new one. An admin can still raise the member's spend limit directly at any time. | Both `approved` and `denied` are terminal. A member has at most one `pending` request at a time. @@ -232,7 +232,7 @@ user_ids[]=user_01AbCdEfGh&user_ids[]=user_01JkLmNoPq ## Error responses -Error responses follow the standard shape documented in [Errors](https://platform.claude.com/docs/en/api/errors). Quote the `request_id` from the response body when contacting support. +Error responses follow the standard shape documented in [Claude API errors](https://platform.claude.com/docs/en/api/errors). Quote the `request_id` from the response body when contacting support. ## Spend limits @@ -1434,7 +1434,7 @@ Run a scheduled job that fetches pending requests, applies your organization's a Find members approaching their cap so you can raise it before they're blocked. -1. Pull each member's month-to-date spend from the Analytics API (one row per member, highest spend first by default): +1. Pull each member's month-to-date spend from the Analytics API (one row for each member, highest spend first by default): ```bash cURL @@ -1706,13 +1706,13 @@ Find members approaching their cap so you can raise it before they're blocked. 3. For each member with a positive cap, compute `period_to_date_spend / amount` and flag those at or above your threshold (for example, 80 percent). Treat a `"0"` cap as already at-limit. There is no server-side filter for this ratio. -4. Act on flagged members: raise the cap with `POST /v1/organizations/spend_limits`, approve a pending increase request if one exists, or reach out to the member. +4. Act on flagged members: raise the cap with `POST /v1/organizations/spend_limits`, approve a pending increase request if one exists, or contact the member. ### Find members with rapidly changing usage Surface members whose spend has jumped week over week. -1. Pull per-member daily cost for the trailing two weeks from the Analytics API: +1. Pull per-member daily cost for the trailing 2 weeks from the Analytics API: ```bash cURL @@ -1851,15 +1851,15 @@ Surface members whose spend has jumped week over week. ``` - With `bucket_width` set, each member spans one row per day with usage. Page through `next_page` to collect every member's full series. + With `bucket_width` set, each member spans one row for each day with usage. Page through `next_page` to collect every member's full series. -2. Group rows by `actor.user_id`. For each member, sum the most recent seven days and the prior seven days. Flag members whose recent week exceeds the prior week by your chosen multiple (for example, three). Recent-day cost is provisional and can be revised upward; for repeatable comparisons, set `ending_at` at or before a previously returned `data_refreshed_at` (see [Data availability and freshness](https://platform.claude.com/docs/en/manage-claude/analytics-api#data-availability-and-freshness)). +2. Group rows by `actor.user_id`. For each member, sum the most recent 7 days and the prior 7 days. Flag members whose recent week exceeds the prior week by your chosen multiple (for example, three). Recent-day cost is provisional and can be revised upward; for repeatable comparisons, set `ending_at` at or before a previously returned `data_refreshed_at` (see [Data availability and freshness](https://platform.claude.com/docs/en/manage-claude/analytics-api#data-availability-and-freshness)). -3. Act on flagged members: adjust the cap with `POST /v1/organizations/spend_limits`, or reach out. +3. Act on flagged members: adjust the cap with `POST /v1/organizations/spend_limits`, or contact the member. ### Temporarily raise a member's spend limit during an incident -Give an incident responder room to work while an incident is open: raise their spend cap when the incident starts, and roll it back after the incident closes. Gate the raise on your incident management system, for example by requiring a live incident ID with the member assigned to it. +Give an incident responder room to work while an incident is open: raise their spend cap when the incident starts, and roll it back after the incident closes. Gate the raise on your incident management system, for example, by requiring a live incident ID with the member assigned to it. 1. Read the member's current cap, and record it for the rollback: diff --git a/content/en/manage-claude/usage-cost-api.md b/content/en/manage-claude/usage-cost-api.md index fd5f603092..b25f76b489 100644 --- a/content/en/manage-claude/usage-cost-api.md +++ b/content/en/manage-claude/usage-cost-api.md @@ -10,12 +10,12 @@ description: Programmatically access your organization's API usage and cost data The Usage and Cost Admin API provides programmatic and granular access to historical API usage and cost data for your organization. This data is similar to the information available on the [Usage](https://platform.claude.com/usage) page (`platform.claude.com/usage`) and the [Cost](https://platform.claude.com/cost) page (`platform.claude.com/cost`) in the Claude Console. -This API enables you to better monitor, analyze, and optimize your Claude implementations: +This API allows you to better monitor, analyze, and optimize your Claude implementations: * **Accurate usage tracking:** Get precise token counts and usage patterns instead of relying solely on response token counting * **Cost reconciliation:** Match internal records with Anthropic billing for finance and accounting teams * **Product performance and improvement:** Monitor product performance while measuring if changes to the system have improved it, or set up alerting -* **[Rate limit](https://platform.claude.com/docs/en/api/rate-limits) optimization:** Optimize features like [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) or specific prompts to make the most of your allocated capacity. +* **[Rate limit](https://platform.claude.com/docs/en/api/rate-limits) optimization:** Optimize features such as [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) or specific prompts to use your allocated capacity efficiently. * **Advanced analysis:** Perform deeper data analysis than what's available in Console @@ -286,7 +286,7 @@ page=page_xyz..." \ ## Common use cases -Explore detailed implementations in [Claude Cookbook](https://platform.claude.com/cookbook): +Explore detailed implementations in the [Claude Cookbook](https://platform.claude.com/cookbook): * **Daily usage reports:** Track token consumption trends * **Cost attribution:** Allocate expenses by workspace for chargebacks @@ -298,7 +298,7 @@ Explore detailed implementations in [Claude Cookbook](https://platform.claude.co ### How fresh is the data? -Usage and cost data typically appears within 5 minutes of API request completion, though delays may occasionally be longer. +Usage and cost data typically appears within 5 minutes of API request completion, though delays might occasionally be longer. ### What's the recommended polling frequency? @@ -314,7 +314,7 @@ Filter or group by `service_tier` in the usage endpoint and look for the `priori ### What happens with playground usage? -API usage from playground in the Claude Console (and from the legacy Workbench before it) is not associated with an API key, so `api_key_id` will be `null` even when grouping by that dimension. +API usage from playground in the Claude Console (and from the legacy Anthropic Workbench before it) is not associated with an API key, so `api_key_id` is `null` even when grouping by that dimension. ### How is the default workspace represented? @@ -333,7 +333,7 @@ Use the Usage and Cost APIs to deliver a better experience for your users, manag * [Analytics APIs](https://platform.claude.com/docs/en/manage-claude/analytics-api) - Which analytics API and key type your organization needs * [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) * [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) - Optimize costs with caching -* [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) - 50% discount on batch requests +* [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) - 50 percent discount on batch requests * [Rate limits](https://platform.claude.com/docs/en/api/rate-limits) - Understand usage tiers * [Rate Limits API](https://platform.claude.com/docs/en/manage-claude/rate-limits-api) - Read your configured rate limits * [Data residency](https://platform.claude.com/docs/en/manage-claude/data-residency) - Control inference geography diff --git a/content/en/manage-claude/user-management.md b/content/en/manage-claude/user-management.md index b430d3445b..e5fef6f87b 100644 --- a/content/en/manage-claude/user-management.md +++ b/content/en/manage-claude/user-management.md @@ -12,7 +12,7 @@ This page covers managing the people in your **Claude Enterprise** (claude.ai) o ## Which endpoints can your organization use? -The Admin API is a single set of endpoints under `https://api.anthropic.com/v1/organizations/`. Claude Console and Claude Enterprise organizations authenticate with [different keys](https://platform.claude.com/docs/en/manage-claude/admin-api-keys) and each have access to a different subset of the endpoints: +The Admin API is a single set of endpoints under `https://api.anthropic.com/v1/organizations/`. Claude Console and Claude Enterprise organizations authenticate with different [Admin API keys](https://platform.claude.com/docs/en/manage-claude/admin-api-keys) and each have access to a different subset of the endpoints: | Endpoints | Claude Console (Claude Platform) | Claude Enterprise (claude.ai) | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -48,7 +48,7 @@ Custom roles and their group attachments are managed in [claude.ai organization ## Quick start -Set the `ANTHROPIC_API_KEY` environment variable to your Admin API key. The examples on this page read the key from it. The SDK and the `ant` CLI send the `x-api-key` and `anthropic-version` headers for you. +Set the `ANTHROPIC_API_KEY` environment variable to your Admin API key. The examples on this page read the key from it. The SDK and the `ant` CLI send the `Authorization` and `anthropic-version` headers for you. List the organization's members, newest first: @@ -189,7 +189,7 @@ If your organization's plan draws members from a finite pool of purchased seats, ### Groups and roles -Groups connect members to custom roles (role-based access control, the `rbac` in the endpoint paths and scope names). Groups are owned by your enterprise as a whole (the parent organization together with every organization under it) rather than by a single organization, so the group scopes (`read:rbac_groups` and `write:rbac_groups`) require a key created for all linked organizations. Each group carries a `source_type`: `direct` for groups created in claude.ai, `scim` for groups provisioned by your identity provider. A group's `role_ids` field lists the IDs of the custom roles attached to it; resolve them to names and permissions with the [custom role endpoints](https://platform.claude.com/docs/en/manage-claude/user-management#custom-roles), noting that the role catalog is per-organization while groups are enterprise-wide, so fetching a role that belongs to a different organization of your enterprise returns 404 for your key. The field is `null` (rather than `[]`) when role data was temporarily unavailable, so retry to distinguish a degraded read from a group with no roles. Two deprecated fields are still returned: `roles` on groups, always equal to `role_ids`, and `group_id` on group members, always equal to `rbac_group_id`. +Groups connect members to custom roles (role-based access control, the `rbac` in the endpoint paths and scope names). Groups are owned by your enterprise as a whole (the parent organization together with every organization under it) rather than by a single organization, so the group scopes (`read:rbac_groups` and `write:rbac_groups`) require a key created for all linked organizations. Each group carries a `source_type`: `direct` for groups created in claude.ai, `scim` for groups provisioned by your identity provider. A group's `role_ids` field lists the IDs of the custom roles attached to it; resolve them to names and permissions with the [custom role endpoints](https://platform.claude.com/docs/en/manage-claude/user-management#custom-roles), noting that the role catalog is per-organization whereas groups are enterprise-wide, so fetching a role that belongs to a different organization of your enterprise returns 404 for your key. The field is `null` (rather than `[]`) when role data was temporarily unavailable, so retry to distinguish a degraded read from a group with no roles. ## Versioning @@ -201,13 +201,13 @@ Admin API endpoints share a per-organization limit of **100 requests per minute* ## Pagination -Member and invite lists use ID-based pagination: pass `limit` (default 20, max 1000) plus at most one of `before_id` or `after_id`, and page using the `first_id` and `last_id` fields of each response until `has_more` is `false`. Group and custom-role lists use an **opaque cursor** instead: the response's `next_page` value is passed unchanged as the `page` parameter on the next request, until `next_page` is `null`. +Member and invite lists use ID-based pagination: pass `limit` (default 20, max 1000) plus at most one of `before_id` or `after_id`, and page using the `first_id` and `last_id` fields of each response until `has_more` is `false`. Group and custom-role lists use an **opaque cursor** instead: pass the response's `next_page` value unchanged as the `page` parameter on the next request, until `next_page` is `null`. When you iterate over the results, the SDK fetches more pages for you, so `limit` sets the page size, not the total. In the CLI, `--limit` sets the total number of results for member and invite lists. For group and role lists, it sets the page size. ## Error responses -Error responses follow the standard shape documented in [Errors](https://platform.claude.com/docs/en/api/errors). +Error responses follow the standard shape documented in [Claude API errors](https://platform.claude.com/docs/en/api/errors). ## Members @@ -1988,7 +1988,7 @@ For complete parameter details and response schemas, see [Remove group member](h Custom roles are read-only through the API: these endpoints catalog your organization's custom roles (defined in [claude.ai organization settings](https://claude.ai/admin-settings) or provisioned by Anthropic) and the permissions each role grants. Custom-role reads use the `read:members` scope (there is no separate role scope) and work with an organization-level key: unlike the group endpoints, they do not require a key created for all linked organizations, and the catalog returned is your organization's own. -Read a role's name from its `display_name` field. The deprecated `name` field is still returned, always equal to `display_name`. For a role provisioned by Anthropic, `display_name` can differ from the label claude.ai shows, and Anthropic might change the name. To keep a lasting reference to a role, store its `id`. +Read a role's name from its `display_name` field. For a role provisioned by Anthropic, `display_name` can differ from the label claude.ai shows, and Anthropic might change the name. To keep a lasting reference to a role, store its `id`. ### List roles diff --git a/content/en/manage-claude/user-profiles.md b/content/en/manage-claude/user-profiles.md index cfe7af3105..d2cf6268f6 100644 --- a/content/en/manage-claude/user-profiles.md +++ b/content/en/manage-claude/user-profiles.md @@ -25,11 +25,11 @@ What a profile stands for depends on how you sell Claude: a person who uses your ## What a profile contains and how Anthropic uses it -A profile contains only what you send about the end customer, plus any [program status](https://platform.claude.com/docs/en/manage-claude/user-profiles-verification-portal#after-the-end-customer-links-the-profile) that Anthropic sets. It doesn't contain conversation content. Anthropic uses the details you send to attribute requests, to monitor for abuse, for enforcement of the [Usage Policy](https://www.anthropic.com/legal/aup), and to enable application and access to trusted access programs. Anthropic doesn't verify the details. +A profile contains only what you send about the end customer, plus any [program status](https://platform.claude.com/docs/en/manage-claude/user-profiles-verification-portal#after-the-end-customer-links-the-profile) or enforcement status that Anthropic sets. It doesn't contain conversation content. Anthropic uses the details you send to attribute requests, to monitor for abuse, for enforcement of the [Usage Policy](https://www.anthropic.com/legal/aup), and to enable application and access to trusted access programs. Anthropic doesn't verify the details. Anthropic processes profiles in accordance with the [Privacy Policy](https://www.anthropic.com/legal/privacy). -## Before you begin +## Before you start You create and manage profiles in one of the following: @@ -206,7 +206,7 @@ The response is the new profile: } ``` -Store the `id` on your customer record, and have your service instances read it from there instead of creating their own profile. You retrieve, update, and delete a profile by that `id`. The `programs` field is read-only, and attribution doesn't use it. It holds the end customer's status in each program that Anthropic runs. For what its values mean, see [which programs apply to a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles-verification-portal#after-the-end-customer-links-the-profile). +Store the `id` on your customer record, and have your service instances read it from there instead of creating their own profile. You retrieve, update, and delete a profile by that `id`. The `programs` field is read-only, and attribution doesn't use it. It holds the end customer's status in each program that Anthropic runs. For what its values mean, see [which programs apply to a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles-verification-portal#after-the-end-customer-links-the-profile). [Check whether Anthropic has restricted or banned a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles#check-whether-anthropic-has-restricted-or-banned-a-profile) explains the `enforcement_status` and `enforcement_actions` fields. There's no cap on the number of profiles in an organization, but profile creation is rate limited. Before you register an existing customer base in bulk, contact your Anthropic account team. @@ -284,7 +284,7 @@ Send the profile ID in the `anthropic-user-profile-id` header on every request y { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], UserProfileID = profileId }; var message = await client.Messages.Create(parameters); @@ -399,6 +399,53 @@ Claude in Amazon Bedrock and Google Cloud check the format of the ID but don't l A `passthrough` profile identifies a company, not the person making the request. If a request comes from one identifiable person, also send an identifier for that person in the [`metadata.user_id`](https://platform.claude.com/docs/en/api/messages/create) field of the Messages request. This is the request's own `metadata` object, not the profile's `metadata` field. The identifier is optional, and it helps Anthropic detect misuse by one person. +## Check whether Anthropic has restricted or banned a profile + +A profile's `enforcement_status` and `enforcement_actions` fields report the enforcement actions that Anthropic has open on the end customer. An enforcement action is a restriction or a ban. Every response that returns a profile includes both fields: create, retrieve, update, and each profile in a list. Send these requests with no `user-profiles-` value in the `anthropic-beta` header, because `user-profiles-2026-09-04` and earlier values leave the fields out. The following example shows the fields on a retrieved profile, with the other fields left out: + +```json +{ + "type": "user_profile", + "id": "uprof_011CZkZCu8hGbp5mYRQgUmz9", + "enforcement_status": "restricted", + "enforcement_actions": [ + { + "type": "restriction", + "id": "enac_011CZkZEq4TnWb7xLfRgPm2v", + "reason": "fraud_or_abuse", + "action": null, + "opened_at": "2026-10-02T19:30:00Z", + "expires_at": null + } + ] +} +``` + +`enforcement_status` summarizes the open actions in one value: + +* `unrestricted`: No action is open. +* `restricted`: At least one action is open and none of them is a ban. +* `banned`: A ban is open. + +While an action is open, Anthropic refuses some or all inference requests that carry the profile's ID. + +`enforcement_actions` lists the open actions and is empty when there are none. An action that ends leaves the list. Each action has these fields: + +* `type`: `restriction` or `ban`. +* `id`: The action's ID, which starts with `enac_`. +* `reason`: Why Anthropic opened the action. It's one of `unsupported_region`, `fraud_or_abuse`, `high_harm`, `usage_policy_violation`, `account_compromise`, or `unspecified`. +* `action`: What the end customer can do to clear the action, or `null` when there's nothing they can do. +* `opened_at`: When Anthropic opened the action. +* `expires_at`: When the action ends by itself, or `null` when it has no end date. + +To check a profile, retrieve it with [`GET /v1/user_profiles/{id}`](https://platform.claude.com/docs/en/api/user_profiles/retrieve). To find the profiles that have an open action, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with `enforcement_status[]=restricted` and `enforcement_status[]=banned`. To get an event when an action opens or ends, see [Organization webhooks](https://platform.claude.com/docs/en/manage-claude/organization-webhooks). Without events, compare both fields with the values you last saw. A change doesn't reliably move `updated_at`. + +Anthropic sets both fields. If a create or update request includes either one, the API returns a `400`. `enforcement_status` is separate from `external_user_details.account_status`, which records your own decision about the account. + +Anthropic can add values. Treat an `enforcement_status` you don't recognize as `restricted`, a `type` you don't recognize as `restriction`, a `reason` you don't recognize as `unspecified`, and an `action` you don't recognize as `null`. + +On Claude Platform on AWS, the two fields don't report enforcement actions: `enforcement_status` is always `unrestricted`, and `enforcement_actions` is always empty. Anthropic doesn't refuse requests there because of an open action. + ## Keep profiles current Update a profile when the end customer's details or account status change, and delete it when they close their account or ask you to erase their data. @@ -411,7 +458,7 @@ Update a profile when the end customer's details or account status change, and d * Each field you send in `external_user_details` replaces the stored value. You can't clear a value. The API rejects `null` with a `400`. * `metadata` merges key by key. A key you send overwrites the stored value, an empty string deletes the key, and keys you leave out stay as they are. -The following example marks the account as suspended and removes a `trial_cohort` metadata key. +The following example marks the account as suspended and deletes a `trial_cohort` metadata key. ```bash cURL diff --git a/content/en/manage-claude/wif-admin-api.md b/content/en/manage-claude/wif-admin-api.md index 0be8b45ca0..8b845802c6 100644 --- a/content/en/manage-claude/wif-admin-api.md +++ b/content/en/manage-claude/wif-admin-api.md @@ -21,7 +21,7 @@ export ANTHROPIC_AUTH_TOKEN=$(ant auth print-credentials --profile admin --acces Interactive tokens are short-lived; if requests start returning 401, re-run the export command (it refreshes the token automatically). -The SDKs and the `ant` CLI read `ANTHROPIC_AUTH_TOKEN` automatically; leave `ANTHROPIC_API_KEY` unset in the same shell, because these endpoints reject API keys and some clients prefer the key when both are set. +The SDK and the `ant` CLI read `ANTHROPIC_AUTH_TOKEN` automatically; leave `ANTHROPIC_API_KEY` unset in the same shell, because these endpoints reject API keys and every client uses the key when both are set. ### Workload (CI and automation) @@ -41,7 +41,7 @@ One Console-created rule is enough to put the rest of your federation configurat - A workload that uses one of the SDKs or the `ant` CLI does not perform the exchange itself. Point the client at the rule with the federation environment variables and construct it with no arguments, exactly as for inference in [Construct the SDK client](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#construct-the-sdk-client); the client exchanges the identity token on the first request and, before the resulting access token expires, re-reads the identity token and exchanges it again: + A workload that uses the SDK or the `ant` CLI does not perform the exchange itself. Point the client at the rule with the federation environment variables and construct it with no arguments, exactly as for inference in [Construct the SDK client](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#construct-the-sdk-client); the client exchanges the identity token on the first request and, before the resulting access token expires, re-reads the identity token and exchanges it again: ```bash export ANTHROPIC_FEDERATION_RULE_ID=fdrl_... # the org:admin rule from step 1 @@ -53,7 +53,7 @@ One Console-created rule is enough to put the rest of your federation configurat unset ANTHROPIC_API_KEY ANTHROPIC_AUTH_TOKEN # both take precedence over federation ``` - The `ant` CLI reads the same variables, or takes `--federation-rule`, `--organization-id`, `--service-account-id`, and `--identity-token-file` flags. For a workload that runs more than one `ant` command, use a [federation profile](https://platform.claude.com/docs/en/manage-claude/wif-reference#profile-configuration-file) rather than flags or environment variables: with flags or variables the CLI exchanges the identity token again in every process, and identity tokens that carry a `jti` claim (GitHub Actions tokens do) are accepted only once, so a second command would be rejected; a profile is also the only way to give the CLI a `workspace_id` for the exchange when the rule is enabled for all workspaces or more than one, because unlike the SDKs the CLI does not pass `ANTHROPIC_WORKSPACE_ID` or `--workspace-id` into the exchange. Every SDK also accepts the same settings as explicit constructor arguments, shown per language in [Construct the SDK client](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#construct-the-sdk-client). See [Environment variables](https://platform.claude.com/docs/en/manage-claude/wif-reference#environment-variables) and [Credential precedence](https://platform.claude.com/docs/en/manage-claude/wif-reference#credential-precedence) for the full list and ordering. + The `ant` CLI reads the same variables, or takes `--federation-rule`, `--organization-id`, `--service-account-id`, and `--identity-token-file` flags. For a workload that runs more than one `ant` command, use a [federation profile](https://platform.claude.com/docs/en/manage-claude/wif-reference#profile-configuration-file) rather than flags or environment variables: with flags or variables the CLI exchanges the identity token again in every process, and identity tokens that carry a `jti` claim (GitHub Actions tokens do) are accepted only once, so a second command would be rejected; a profile is also the only way to give the CLI a `workspace_id` for the exchange when the rule is enabled for all workspaces or more than one, because unlike the SDK the CLI does not pass `ANTHROPIC_WORKSPACE_ID` or `--workspace-id` into the exchange. Every SDK also accepts the same settings as explicit constructor arguments, shown for each language in [Construct the SDK client](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#construct-the-sdk-client). See [Environment variables](https://platform.claude.com/docs/en/manage-claude/wif-reference#environment-variables) and [Credential precedence](https://platform.claude.com/docs/en/manage-claude/wif-reference#credential-precedence) for the full list and ordering. A workload that calls the API with curl exchanges the JWT for a short-lived `org:admin` bearer token itself, using the same [token exchange](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#authenticate-from-your-workload) as any other federated workload, and sends it in the `authorization: Bearer` header. @@ -69,7 +69,7 @@ For the operations a workload-minted token can and cannot perform, see [Permissi All endpoints live under `https://api.anthropic.com/v1/organizations/`. Every request to the federation and service-account endpoints needs the API version header and the bearer token: -In the SDKs these endpoints are `client.organization.service_accounts` (typescript: `client.organization.serviceAccounts`; csharp, go: `client.Organization.ServiceAccounts`; java: `client.organization().serviceAccounts()`; php: `$client->organization->serviceAccounts`), `client.organization.federation.issuers` (csharp, go: `client.Organization.Federation.Issuers`; java: `client.organization().federation().issuers()`; php: `$client->organization->federation->issuers`), and `client.organization.federation.rules` (csharp, go: `client.Organization.Federation.Rules`; java: `client.organization().federation().rules()`; php: `$client->organization->federation->rules`) (`ant organization:service-accounts`, `federation:issuers`, and `federation:rules` in the CLI). The SDK and CLI examples construct the default client, which sends the bearer token from `ANTHROPIC_AUTH_TOKEN`, or, in an automated workload, performs the federation exchange itself as described in [Bootstrap a workload to manage WIF](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#bootstrap-a-workload-to-manage-wif). SDK list methods fetch further pages on demand, so `limit` sets the page size; the PHP and Ruby examples read one page. +In the SDK, these endpoints are `client.organization.service_accounts` (typescript: `client.organization.serviceAccounts`; csharp, go: `client.Organization.ServiceAccounts`; java: `client.organization().serviceAccounts()`; php: `$client->organization->serviceAccounts`), `client.organization.federation.issuers` (csharp, go: `client.Organization.Federation.Issuers`; java: `client.organization().federation().issuers()`; php: `$client->organization->federation->issuers`), and `client.organization.federation.rules` (csharp, go: `client.Organization.Federation.Rules`; java: `client.organization().federation().rules()`; php: `$client->organization->federation->rules`) (`ant organization:service-accounts`, `federation:issuers`, and `federation:rules` in the CLI). The SDK and CLI examples construct the default client, which sends the bearer token from `ANTHROPIC_AUTH_TOKEN`, or, in an automated workload, performs the federation exchange itself as described in [Bootstrap a workload to manage WIF](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#bootstrap-a-workload-to-manage-wif). SDK list methods fetch further pages on demand, so `limit` sets the page size; the PHP and Ruby examples read one page. ```bash cURL diff --git a/content/en/manage-claude/wif-providers/aws.md b/content/en/manage-claude/wif-providers/aws.md index 86db3dc3b5..5251c28de5 100644 --- a/content/en/manage-claude/wif-providers/aws.md +++ b/content/en/manage-claude/wif-providers/aws.md @@ -23,7 +23,7 @@ The AWS STS `GetWebIdentityToken` API returns an OIDC token signed by AWS that a - This is an account-level flag, off by default. In the AWS console, open **IAM**, choose **Account settings**, and enable **Outbound web identity federation**. To enable it programmatically: + This is an account-level flag, off by default. In the AWS console, open **IAM**, select **Account settings**, and enable **Outbound web identity federation**. To enable it programmatically: ```bash python3 -c "import boto3; boto3.client('iam').enable_outbound_web_identity_federation()" @@ -50,7 +50,7 @@ The AWS STS `GetWebIdentityToken` API returns an OIDC token signed by AWS that a - After enabling outbound federation, the **IAM > Account settings** page shows a **Get Token Issuer URL** field with a value of the form `https://.tokens.sts.global.api.aws`. This URL is unique to your AWS account; copy it for the next step. To retrieve it programmatically: + After you enable outbound federation, the **IAM > Account settings** page shows a **Get Token Issuer URL** field with a value of the form `https://.tokens.sts.global.api.aws`. This URL is unique to your AWS account; copy it for the next step. To retrieve it programmatically: ```bash python3 -c "import boto3; print(boto3.client('iam').get_outbound_web_identity_federation_info())" @@ -95,7 +95,7 @@ Be as specific as the workload allows. Match the exact role ARN, and only broade ### Acquire and use the token -Call `GetWebIdentityToken` with `https://api.anthropic.com` as the audience, then pass the result to the SDK's federation credentials through `identity_token_provider` (typescript: `identityTokenProvider`; php: `identityProvider`; csharp: `IdentityTokenProvider`; go: `option.WithFederationTokenProvider`; java: `IdentityTokenConfig`). Except in Java (see the comment in that example), that option takes a token provider, so the SDK re-invokes STS on each refresh. +Call `GetWebIdentityToken` with `https://api.anthropic.com` as the audience, then pass the result to the SDK's federation credentials through `identity_token_provider` (typescript: `identityTokenProvider`; php: `identityProvider`; csharp: `IdentityTokenProvider`; go: `option.WithFederationTokenProvider`; java: `IdentityTokenConfig`). Except in Java (see the comment in that example), that option takes a token provider, so the SDK calls STS again on each refresh. `GetWebIdentityToken` is available only on regional STS endpoints. If you receive `'STS' object has no attribute 'get_web_identity_token'` or a similar error, pin your STS client to a region (for example, `boto3.client("sts", region_name="us-east-1")`) and ensure your AWS SDK is recent enough to include the API. @@ -112,7 +112,7 @@ Call `GetWebIdentityToken` with `https://api.anthropic.com` as the audience, the ACCESS_TOKEN=$(curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- < "$ANTHROPIC_IDENTITY_TOKEN_FILE" - # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, and + # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, # ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read from the environment ant messages create \ --model claude-opus-5-5 \ @@ -466,7 +466,7 @@ JWT=$(aws sts get-web-identity-token \ curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- <:role/"` with no trailing `*` so other roles in the account do not match. * **Pin the account ID:** Match the `aws_account` field of the token's `https://sts.amazonaws.com/` claim with the `claims` map or a CEL `condition` as a defense-in-depth check against a misconfigured prefix. * **Pin namespace and service account on EKS:** Use the exact `system:serviceaccount::` value with no `*` after the `system:serviceaccount:` prefix. -* **Use a separate rule per environment:** Create distinct rules for production, staging, and development workloads rather than widening one prefix to cover them all. +* **Use a separate rule for each environment:** Create distinct rules for production, staging, and development workloads rather than widening one prefix to cover them all. ## Next steps diff --git a/content/en/manage-claude/wif-providers/azure.md b/content/en/manage-claude/wif-providers/azure.md index 82006fd056..3bd3224d44 100644 --- a/content/en/manage-claude/wif-providers/azure.md +++ b/content/en/manage-claude/wif-providers/azure.md @@ -7,11 +7,11 @@ description: Federate Azure managed identities and Entra Workload Identity with Azure workloads authenticate to the Claude API by presenting a JSON Web Token (JWT) issued by Microsoft Entra ID, then exchanging it for a short-lived Anthropic access token. The setup follows the same shape on every Azure platform: 1. **Register the token audience:** Create one app registration in your Microsoft Entra tenant to represent the Claude API audience. Every workload in the tenant requests Entra tokens for it. -2. **Set up the identity for your platform:** A managed identity on VMs, VM Scale Sets, App Service, Functions, and Container Apps, or Entra Workload Identity on AKS. +2. **Set up the identity for your platform:** Use a managed identity on VMs, VM Scale Sets, App Service, Functions, and Container Apps, or Entra Workload Identity on AKS. 3. **Configure Anthropic:** Register your tenant's Entra issuer, create a service account, and write a federation rule that matches the token's claims. 4. **Exchange at runtime:** Your workload exchanges its Entra-issued token at `POST /v1/oauth/token` for an `sk-ant-oat01-...` Anthropic access token and calls Claude with it. -On both paths the token you present to Anthropic carries your tenant-specific Entra issuer and the managed identity's object ID in the `sub` and `oid` claims; only how the workload obtains that token differs. Pick the section for where your workload runs: [Use a managed identity](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-a-managed-identity) for VMs, VM Scale Sets, App Service, Functions, or Container Apps; [Use Entra Workload Identity on AKS](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-entra-workload-identity-on-aks) for AKS. +On both paths the token you present to Anthropic carries your tenant-specific Entra issuer and the managed identity's object ID in the `sub` and `oid` claims; only how the workload obtains that token differs. Pick the section for where your workload runs: [Use a managed identity](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-a-managed-identity) for VMs, VM Scale Sets, App Service, Functions, and Container Apps, or [Use Entra Workload Identity on AKS](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-entra-workload-identity-on-aks) for AKS. ## Prerequisites @@ -97,7 +97,7 @@ In the Claude Console, go to the [Workload identity](https://platform.claude.com The wizard creates these resources for you. Use the following values whether you enter them in the wizard or send them to the [Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api): -**Federation issuer:** Choose **v2.0 (login.microsoftonline.com)** in the wizard's **Token issuer** selector. (The selector defaults to v1; that default exists for tenants reusing older registrations that still emit v1.0 tokens.) Entra publishes an OIDC discovery document at the per-tenant issuer URL, so use discovery mode. Each Microsoft Entra tenant you federate needs its own issuer record. +**Federation issuer:** Select **v2.0 (login.microsoftonline.com)** in the wizard's **Token issuer** selector. (The selector defaults to v1; that default exists for tenants reusing older registrations that still emit v1.0 tokens.) Entra publishes an OIDC discovery document at the per-tenant issuer URL, so use discovery mode. Each Microsoft Entra tenant you federate needs its own issuer record. ```json { @@ -109,10 +109,10 @@ The wizard creates these resources for you. Use the following values whether you ``` - Managed identity workloads need `max_jwt_lifetime_seconds: 86400`. Azure issues managed identity tokens with up to 24 hours between `iat` and `exp` because it caches each resource's token for that window and offers no way to force an early refresh, and the issuer's 1-hour default rejects those tokens, so the exchange fails with the opaque `401` `authentication_error` response (message `Authentication failed`). The Connect workload wizard's Microsoft Entra tile creates the issuer with `max_jwt_lifetime_seconds` set to `7500` and provides no field to change it during creation, so finish the wizard, then open the **Issuers** tab on the [Workload identity](https://platform.claude.com/settings/workload-identity-federation) page in the Claude Console, edit the issuer, and raise the value to `86400`. You can also update the issuer through the Admin API. + Managed identity workloads need `max_jwt_lifetime_seconds: 86400`. Azure issues managed identity tokens with up to 24 hours between `iat` and `exp` because it caches each resource's token for that window and offers no way to force an early refresh, and the issuer's 1-hour default rejects those tokens, so the exchange fails with the opaque `401` `authentication_error` response (message `Authentication failed`). The **Connect workload** wizard's **Microsoft Entra** tile creates the issuer with `max_jwt_lifetime_seconds` set to `7500` and provides no field to change it during creation, so complete the wizard, then open the **Issuers** tab on the [Workload identity](https://platform.claude.com/settings/workload-identity-federation) page in the Claude Console, edit the issuer, and raise the value to `86400`. You can also update the issuer through the Admin API. -A longer accepted lifetime means a leaked Entra token stays exchangeable for longer. If a token leaks, the lever is disabling the federation rule; a tight `oid` match limits which identities can exchange a token in the first place, as described in [Scope your rule](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#scope-your-rule). +A longer accepted lifetime means a leaked Entra token stays exchangeable for longer. If a token leaks, disable the federation rule; a tight `oid` match limits which identities can exchange a token in the first place, as described in [Scope your rule](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#scope-your-rule). **Federation rule:** Match on the managed identity's object ID and your tenant ID. For the v2.0 tokens this guide configures, the `audience` value is the audience app registration's client ID (the `` GUID from [Register the token audience](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#register-the-token-audience)). Use the exact `aud` value from your decoded token. @@ -196,6 +196,26 @@ The samples fetch the managed identity token from the platform's token endpoint: }' ``` + ```bash CLI + # Write the Entra-issued access token to a file the CLI can read. + # Shown for a VM or VM Scale Set (IMDS). On App Service, Functions, or + # Container Apps, fetch from "$IDENTITY_ENDPOINT?api-version=2019-08-01&resource=api://" + # with -H "X-IDENTITY-HEADER: $IDENTITY_HEADER" instead. + # With multiple user-assigned identities, append &client_id=. + export ANTHROPIC_IDENTITY_TOKEN_FILE=$(mktemp) + trap 'rm -f "$ANTHROPIC_IDENTITY_TOKEN_FILE"' EXIT + curl -sS -H "Metadata: true" \ + "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=api://" \ + | jq -r .access_token > "$ANTHROPIC_IDENTITY_TOKEN_FILE" + + # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, + # ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read from the environment. + ant messages create \ + --model claude-opus-5-5 \ + --max-tokens 1024 \ + --message '{role: user, content: "Hello from Azure"}' + ``` + ```python Python import os @@ -455,7 +475,7 @@ The samples fetch the managed identity token from the platform's token endpoint: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello from Azure" }], + Messages = [new UserMessageParam { Content = "Hello from Azure" }], }); foreach (var block in message.Content) { @@ -590,26 +610,6 @@ The samples fetch the managed identity token from the platform's token endpoint: ) puts message.content.find { it.type == :text }.text ``` - - ```bash CLI - # Write the Entra-issued access token to a file the CLI can read. - # Shown for a VM or VM Scale Set (IMDS). On App Service, Functions, or - # Container Apps, fetch from "$IDENTITY_ENDPOINT?api-version=2019-08-01&resource=api://" - # with -H "X-IDENTITY-HEADER: $IDENTITY_HEADER" instead. - # With multiple user-assigned identities, append &client_id=. - export ANTHROPIC_IDENTITY_TOKEN_FILE=$(mktemp) - trap 'rm -f "$ANTHROPIC_IDENTITY_TOKEN_FILE"' EXIT - curl -sS -H "Metadata: true" \ - "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=api://" \ - | jq -r .access_token > "$ANTHROPIC_IDENTITY_TOKEN_FILE" - - # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, - # ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read from the environment. - ant messages create \ - --model claude-opus-5-5 \ - --max-tokens 1024 \ - --message '{role: user, content: "Hello from Azure"}' - ``` ### Verify the setup @@ -735,7 +735,7 @@ Use this path when your workload runs in an AKS pod. Entra Workload Identity fed } ``` - `sub` and `oid` are the managed identity's object ID, `aud` is the audience app registration's client ID, and `azp` is the managed identity's client ID (the value of `AZURE_CLIENT_ID`). The lifetime differs from the managed identity path: `client_credentials` tokens default to a random 60 to 90 minute window between `iat` and `exp`, not 24 hours. + `sub` and `oid` are the managed identity's object ID, `aud` is the audience app registration's client ID, and `azp` is the managed identity's client ID (the value of `AZURE_CLIENT_ID`). The lifetime differs from the managed identity path: `client_credentials` tokens default to a random 60- to 90-minute window between `iat` and `exp`, not 24 hours.
@@ -745,7 +745,7 @@ In the Claude Console, go to the [Workload identity](https://platform.claude.com The wizard creates these resources for you. Use the following values whether you enter them in the wizard or send them to the [Admin API](https://platform.claude.com/docs/en/manage-claude/wif-admin-api): -**Federation issuer:** Choose **v2.0 (login.microsoftonline.com)** in the wizard's **Token issuer** selector. (The selector defaults to v1; that default exists for tenants reusing older registrations that still emit v1.0 tokens.) Entra publishes an OIDC discovery document at the per-tenant issuer URL, so use discovery mode. Each Microsoft Entra tenant you federate needs its own issuer record. +**Federation issuer:** Select **v2.0 (login.microsoftonline.com)** in the wizard's **Token issuer** selector. (The selector defaults to v1; that default exists for tenants reusing older registrations that still emit v1.0 tokens.) Entra publishes an OIDC discovery document at the per-tenant issuer URL, so use discovery mode. Each Microsoft Entra tenant you federate needs its own issuer record. ```json { @@ -757,10 +757,10 @@ The wizard creates these resources for you. Use the following values whether you ``` - The Connect workload wizard's Microsoft Entra tile creates the issuer with `max_jwt_lifetime_seconds` set to `7500` (just over 2 hours), which covers the default 60 to 90 minute lifetime of `client_credentials` tokens. A tenant token-lifetime policy or Continuous Access Evaluation (CAE) can extend that lifetime. If your decoded token's `exp` minus `iat` exceeds 7500 seconds, edit the issuer on the **Issuers** tab of the [Workload identity](https://platform.claude.com/settings/workload-identity-federation) page in the Claude Console and raise `max_jwt_lifetime_seconds` to match, or exchanges fail with the opaque `401` `authentication_error` response (message `Authentication failed`). If your tenant also runs managed-identity workloads from [Use a managed identity](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-a-managed-identity), use that section's `86400` value, which covers both paths. + The **Connect workload** wizard's **Microsoft Entra** tile creates the issuer with `max_jwt_lifetime_seconds` set to `7500` (just over 2 hours), which covers the default 60- to 90-minute lifetime of `client_credentials` tokens. A tenant token-lifetime policy or Continuous Access Evaluation (CAE) can extend that lifetime. If your decoded token's `exp` minus `iat` exceeds 7,500 seconds, edit the issuer on the **Issuers** tab of the [Workload identity](https://platform.claude.com/settings/workload-identity-federation) page in the Claude Console and raise `max_jwt_lifetime_seconds` to match, or exchanges fail with the opaque `401` `authentication_error` response (message `Authentication failed`). If your tenant also runs managed-identity workloads from [Use a managed identity](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#use-a-managed-identity), use that section's `86400` value, which covers both paths. -A longer accepted lifetime means a leaked Entra token stays exchangeable for longer. If a token leaks, the lever is disabling the federation rule; a tight `oid` match limits which identities can exchange a token in the first place, as described in [Scope your rule](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#scope-your-rule). +A longer accepted lifetime means a leaked Entra token stays exchangeable for longer. If a token leaks, disable the federation rule; a tight `oid` match limits which identities can exchange a token in the first place, as described in [Scope your rule](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#scope-your-rule). **Federation rule:** Match on the managed identity's object ID and your tenant ID. For the v2.0 tokens this guide configures, the `audience` value is the audience app registration's client ID (the `` GUID from [Register the token audience](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#register-the-token-audience)). Use the exact `aud` value from your decoded token. @@ -836,6 +836,28 @@ Two different client IDs appear in the samples. `` is the audience app r }' ``` + ```bash CLI + # 1. Exchange the Kubernetes-projected token for an Entra-issued access + # token and write it to a temp file the CLI can read. + export ANTHROPIC_IDENTITY_TOKEN_FILE=$(mktemp) + trap 'rm -f "$ANTHROPIC_IDENTITY_TOKEN_FILE"' EXIT + curl -sS "https://login.microsoftonline.com/$AZURE_TENANT_ID/oauth2/v2.0/token" \ + -d client_id="$AZURE_CLIENT_ID" \ + -d grant_type=client_credentials \ + --data-urlencode "scope=api:///.default" \ + -d client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer \ + --data-urlencode client_assertion@"$AZURE_FEDERATED_TOKEN_FILE" \ + | jq -r .access_token > "$ANTHROPIC_IDENTITY_TOKEN_FILE" + + # 2. Call the Claude API. ANTHROPIC_FEDERATION_RULE_ID, + # ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read + # from the environment. + ant messages create \ + --model claude-opus-5-5 \ + --max-tokens 1024 \ + --message '{role: user, content: "Hello from Azure"}' + ``` + ```python Python import os from pathlib import Path @@ -1093,7 +1115,7 @@ Two different client IDs appear in the samples. `` is the audience app r { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello from Azure" }], + Messages = [new UserMessageParam { Content = "Hello from Azure" }], }); foreach (var block in message.Content) { @@ -1215,28 +1237,6 @@ Two different client IDs appear in the samples. `` is the audience app r ) puts message.content.find { it.type == :text }.text ``` - - ```bash CLI - # 1. Exchange the Kubernetes-projected token for an Entra-issued access - # token and write it to a temp file the CLI can read. - export ANTHROPIC_IDENTITY_TOKEN_FILE=$(mktemp) - trap 'rm -f "$ANTHROPIC_IDENTITY_TOKEN_FILE"' EXIT - curl -sS "https://login.microsoftonline.com/$AZURE_TENANT_ID/oauth2/v2.0/token" \ - -d client_id="$AZURE_CLIENT_ID" \ - -d grant_type=client_credentials \ - --data-urlencode "scope=api:///.default" \ - -d client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer \ - --data-urlencode client_assertion@"$AZURE_FEDERATED_TOKEN_FILE" \ - | jq -r .access_token > "$ANTHROPIC_IDENTITY_TOKEN_FILE" - - # 2. Call the Claude API. ANTHROPIC_FEDERATION_RULE_ID, - # ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read - # from the environment. - ant messages create \ - --model claude-opus-5-5 \ - --max-tokens 1024 \ - --message '{role: user, content: "Hello from Azure"}' - ``` ### Verify the setup @@ -1244,7 +1244,7 @@ Two different client IDs appear in the samples. `` is the audience app r From inside a labeled pod, run the cURL exchange shown in [Acquire and use the token](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#acquire-and-use-the-token-2) and confirm that `POST /v1/oauth/token` returns a `200` with an `access_token` beginning with `sk-ant-oat01-` and an `expires_in` value in seconds. If the exchange fails with the opaque `401` `authentication_error` response (message `Authentication failed`), check the [authentication history page](https://platform.claude.com/settings/workload-identity-federation?tab=history) in the Claude Console for the deny reason, then decode the Entra-issued token from step 1 (see [Troubleshoot a failed exchange](https://platform.claude.com/docs/en/manage-claude/wif-reference#troubleshoot-a-failed-exchange) for the command) and check the most common Azure-side causes: * **Issuer mismatch:** The registered `issuer_url` must match the token's `iss` claim exactly. A v2.0 token carries `https://login.microsoftonline.com//v2.0`; if the decoded `ver` claim is `1.0`, see [If your tokens are v1.0](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#if-your-tokens-are-v1-0). -* **Token lifetime:** If a tenant token-lifetime policy or CAE extends the `client_credentials` token past 7500 seconds, raise the issuer's `max_jwt_lifetime_seconds` as described in [Configure Anthropic](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#configure-anthropic-2). +* **Token lifetime:** If a tenant token-lifetime policy or CAE extends the `client_credentials` token past 7,500 seconds, raise the issuer's `max_jwt_lifetime_seconds` as described in [Configure Anthropic](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#configure-anthropic-2). * **Audience mismatch:** The rule's `audience` must equal the token's `aud` exactly: the audience app registration's client ID for the v2.0 tokens this guide configures. * **Claim name mismatch:** A rule that matches on a claim the token does not carry never passes. v1.0 tokens carry the client ID in `appid`, not `azp`; see [If your tokens are v1.0](https://platform.claude.com/docs/en/manage-claude/wif-providers/azure#if-your-tokens-are-v1-0). @@ -1253,7 +1253,7 @@ From inside a labeled pod, run the cURL exchange shown in [Acquire and use the t This guide configures the audience app registration with `api.requestedAccessTokenVersion: 2`, so every token it shows is v2.0. If you reuse an existing registration that leaves `requestedAccessTokenVersion` unset, Entra issues v1.0 tokens instead. Decode a sample token and check its `ver` claim; if it is `1.0`, four things change: * **Issuer:** The `iss` claim is `https://sts.windows.net//` instead of `https://login.microsoftonline.com//v2.0`. Register the issuer URL exactly as your token's `iss` claim carries it. The two URLs share the same JWKS, so discovery mode works for either. -* **Wizard selector:** Pick **v1 (sts.windows.net)** in the Connect workload wizard's **Token issuer** selector instead of **v2.0 (login.microsoftonline.com)**. +* **Wizard selector:** Select **v1 (sts.windows.net)** in the **Connect workload** wizard's **Token issuer** selector instead of **v2.0 (login.microsoftonline.com)**. * **Audience:** The `aud` claim is the identifier URI you passed as `resource` (for example, `api://`), not the registration's client ID. Set the federation rule's `audience` to the exact `aud` value from your decoded token. * **Client ID claim:** The calling identity's client ID appears in `appid`, not `azp`. The two claims never appear in the same token, so a rule that matches on `azp` never passes against a v1.0 token. diff --git a/content/en/manage-claude/wif-providers/gcp.md b/content/en/manage-claude/wif-providers/gcp.md index 277f411de5..40909531b6 100644 --- a/content/en/manage-claude/wif-providers/gcp.md +++ b/content/en/manage-claude/wif-providers/gcp.md @@ -63,7 +63,7 @@ Google issues identity tokens automatically to any workload with an attached ser
- Enable [Workload Identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) on your cluster and bind your Kubernetes service account to a Google service account with the `iam.gke.io/gcp-service-account` annotation: + Enable [GKE Workload Identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) on your cluster and bind your Kubernetes service account to a Google service account with the `iam.gke.io/gcp-service-account` annotation: ```yaml apiVersion: v1 @@ -77,7 +77,7 @@ Google issues identity tokens automatically to any workload with an attached ser With this binding in place, the GKE metadata server returns a Google-signed token identical to the Cloud Run and GCE case: same `https://accounts.google.com` issuer, same `email` claim, same fetch URL. Configure Anthropic exactly as in the next section. - A `format=full` token from GKE additionally includes `google.compute_engine.project_id`, `google.compute_engine.zone`, and `google.compute_engine.instance_name` claims, which you can reference in a federation rule's `condition` matcher (a CEL expression like `claims.google.compute_engine.project_id == "my-project"`) to scope access to a specific cluster or node pool. + A `format=full` token from GKE additionally includes `google.compute_engine.project_id`, `google.compute_engine.zone`, and `google.compute_engine.instance_name` claims, which you can reference in a federation rule's `condition` matcher (a CEL expression such as `claims.google.compute_engine.project_id == "my-project"`) to scope access to a specific cluster or node pool. If you do not want to bind Kubernetes service accounts to Google service accounts, GKE pods can instead use the cluster's own OIDC issuer (`https://container.googleapis.com/v1/projects/PROJECT/locations/REGION/clusters/CLUSTER`) with a projected `serviceAccountToken` volume. That path uses a per-cluster issuer rather than `accounts.google.com`. See [Use WIF with Kubernetes](https://platform.claude.com/docs/en/manage-claude/wif-providers/kubernetes) for that pattern. @@ -137,7 +137,7 @@ Inside your Google Cloud workload, fetch the identity token from the metadata se # Exchange it for an Anthropic access token RESPONSE=$(curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- < "$ANTHROPIC_IDENTITY_TOKEN_FILE" - # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, and + # ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, # ANTHROPIC_SERVICE_ACCOUNT_ID, and ANTHROPIC_WORKSPACE_ID are read from the environment. ant messages create \ --model claude-opus-5-5 \ @@ -453,7 +453,7 @@ Inside your Google Cloud workload, fetch the identity token from the metadata se ``` -Google identity tokens expire after roughly one hour. Except in Java (see the comment in that example), the SDK re-invokes the token provider and re-exchanges automatically before expiry. For shell scripts that run longer than the access token's `expires_in`, refresh on a timer and repeat the exchange. +Google identity tokens expire after roughly 1 hour. Except in Java (see the comment in that example), the SDK calls the token provider again and re-exchanges automatically before expiry. For shell scripts that run longer than the access token's `expires_in`, refresh on a timer and repeat the exchange. ## Verify the setup @@ -483,4 +483,4 @@ Lock the rule's `match` block to the narrowest scope that fits your use case: ## Next steps * Read the [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation) page for the full resource model and SDK credential precedence. -* Add a separate federation rule per environment (production, staging) so you can revoke one without affecting the others. +* Add a separate federation rule for each environment (production, staging) so you can revoke one without affecting the others. diff --git a/content/en/manage-claude/wif-providers/github-actions.md b/content/en/manage-claude/wif-providers/github-actions.md index 7e006b37fd..2c508e5718 100644 --- a/content/en/manage-claude/wif-providers/github-actions.md +++ b/content/en/manage-claude/wif-providers/github-actions.md @@ -6,7 +6,7 @@ description: Authenticate GitHub Actions workflows to the Claude API with short- Every GitHub Actions workflow run can request a signed identity token from GitHub's hosted issuer at `https://token.actions.githubusercontent.com`. With Workload Identity Federation, your workflow exchanges that token for a short-lived Anthropic access token, so your CI jobs can call the Claude API without an `ANTHROPIC_API_KEY` secret stored in your repository. -The token's `sub` claim encodes the repository and trigger context. For a push to a branch it has the form `repo:/:ref:refs/heads/`. Pull-request runs use `repo:/:pull_request`, and environment-gated deployments use `repo:/:environment:`. Your federation rule matches against this claim (and others, such as `repository_owner` and `ref`) to decide which workflow runs are allowed to authenticate. +The token's `sub` claim encodes the repository and trigger context. For a push to a branch it has the form `repo:/:ref:refs/heads/`. Pull-request runs use `repo:/:pull_request`, and environment-gated deployments use `repo:/:environment:`. Your federation rule matches against this claim (and others, such as `repository_owner` and `ref`) to determine which workflow runs are allowed to authenticate. ## Prerequisites @@ -105,7 +105,7 @@ The wizard creates these resources for you. Use the following values whether you } ``` -Be as specific as the workload allows. Loosen `subject_prefix` to `repo:your-org/your-repo:*` (paired with a `claims.ref` constraint) only if the rule must match multiple event types from the same repository, because the trailing segment of `sub` varies between `ref:...`, `environment:...`, and `pull_request` events. +Be as specific as the workload allows. Loosen `subject_prefix` to `repo:your-org/your-repo:*` (paired with a `claims.ref` constraint) only if the rule must match multiple event types from the same repository, because the trailing segment of `sub` varies among `ref:...`, `environment:...`, and `pull_request` events. ## Acquire and use a token @@ -147,7 +147,7 @@ Set the federation environment variables on the job and call the SDK normally. ` ACCESS_TOKEN=$(curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- < -Each GitHub-issued identity token expires roughly five minutes after issuance. The token-request endpoint (`ACTIONS_ID_TOKEN_REQUEST_URL`) stays valid for the entire job, so you can fetch a fresh token at any point. The SDK exchanges the token on first use and caches the resulting Anthropic access token. For jobs that run longer than the Anthropic token's lifetime, the SDK re-reads `ANTHROPIC_IDENTITY_TOKEN_FILE` on each refresh, so re-run the fetch step periodically (or wrap it in a background loop) to keep the file current. Alternatively, except in Java, pass the SDK a token provider that calls `ACTIONS_ID_TOKEN_REQUEST_URL` directly instead of using the file path. +Each GitHub-issued identity token expires roughly 5 minutes after issuance. The token-request endpoint (`ACTIONS_ID_TOKEN_REQUEST_URL`) stays valid for the entire job, so you can fetch a fresh token at any point. The SDK exchanges the token on first use and caches the resulting Anthropic access token. For jobs that run longer than the Anthropic token's lifetime, the SDK re-reads `ANTHROPIC_IDENTITY_TOKEN_FILE` on each refresh, so re-run the fetch step periodically (or wrap it in a background loop) to keep the file current. Alternatively, except in Java, pass the SDK a token provider that calls `ACTIONS_ID_TOKEN_REQUEST_URL` directly instead of using the file path. ## Verify the setup diff --git a/content/en/manage-claude/wif-providers/kubernetes.md b/content/en/manage-claude/wif-providers/kubernetes.md index bd6ed55e58..a48311f526 100644 --- a/content/en/manage-claude/wif-providers/kubernetes.md +++ b/content/en/manage-claude/wif-providers/kubernetes.md @@ -132,7 +132,7 @@ The pod spec in [Configure Kubernetes](https://platform.claude.com/docs/en/manag ACCESS_TOKEN=$(curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- <:` value with no trailing `*`. * **Always set an audience:** Require `audience` on the rule and set the same value on the pod's `serviceAccountToken` projection so default-audience tokens are rejected. -* **Use a separate rule per namespace:** Create a distinct rule and Anthropic service account for each namespace rather than widening one rule. +* **Use a separate rule for each namespace:** Create a distinct rule and Anthropic service account for each namespace rather than widening one rule. * **Scope inline-JWKS issuers to one cluster:** When several clusters share an issuer URL, register each cluster's JWKS as its own federation issuer and bind rules to that issuer only. ## Next steps diff --git a/content/en/manage-claude/wif-providers/okta.md b/content/en/manage-claude/wif-providers/okta.md index deb899eaba..cd11472c76 100644 --- a/content/en/manage-claude/wif-providers/okta.md +++ b/content/en/manage-claude/wif-providers/okta.md @@ -31,7 +31,7 @@ At a high level you need to: The exact navigation depends on your Okta org configuration and admin console version. The following numbered steps walk through one common path: 1. **Create a service app integration.** In the Okta Admin Console, create a new app integration of type **API Services** (OIDC, machine-to-machine). Note the generated **Client ID**. -2. **Configure client authentication.** For a keyless setup, choose **Public key / Private key** (`private_key_jwt`) and register your workload's public JWK. Alternatively, use a client secret if your environment can store one securely. For the following example you may need to disable the DPoP requirement on the application; ensure that your production setup adheres to your organization's security requirements. +2. **Configure client authentication.** For a keyless setup, select **Public key / Private key** (`private_key_jwt`) and register your workload's public JWK. Alternatively, use a client secret if your environment can store one securely. For the following example you might need to disable the DPoP requirement on the application; ensure that your production setup adheres to your organization's security requirements. 3. **Set the audience.** On your custom authorization server, set the audience to `https://api.anthropic.com` so issued access tokens carry that `aud` claim. Anthropic validates `aud` against this fixed value. 4. **Grant a scope.** On your custom authorization server, ensure at least one scope exists that the service app is allowed to request (for example, `anthropic.access`). Okta rejects `client_credentials` requests that do not include a granted scope. 5. **Create an access policy.** On your custom authorization server, create an access policy with at least one rule that allows your service app to request the scope you granted in step 4. @@ -354,7 +354,7 @@ Unlike platform-native providers (AWS, Google Cloud, Kubernetes), which make a t { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }); foreach (var block in message.Content) { @@ -509,9 +509,9 @@ Lock the rule's `match` block to the narrowest scope that fits your use case: * **Pin the exact Client ID:** Set `subject_prefix` to the service app's full Client ID with no trailing `*`. * **Pin the audience:** Match the `audience` value you configured on the authorization server so tokens minted for a different audience are rejected. * **Match on custom claims:** For finer-grained scoping, add claims in the authorization server's **Claims** tab and match them with the rule's `claims` map or a CEL `condition`. -* **Use one rule per service app:** Create a separate federation rule for each service app rather than sharing one rule across apps. +* **Use one rule for each service app:** Create a separate federation rule for each service app rather than sharing one rule across apps. ## Next steps * Review the [WIF reference](https://platform.claude.com/docs/en/manage-claude/wif-reference) for the full credential resolution order and profile configuration. -* See the [WIF reference](https://platform.claude.com/docs/en/manage-claude/wif-reference#rule-matching-semantics) to match on custom Okta claims with CEL expressions. +* See [Rule matching semantics](https://platform.claude.com/docs/en/manage-claude/wif-reference#rule-matching-semantics) to match on custom Okta claims with CEL expressions. diff --git a/content/en/manage-claude/wif-providers/spiffe.md b/content/en/manage-claude/wif-providers/spiffe.md index 3755cfcab2..0559c3ce67 100644 --- a/content/en/manage-claude/wif-providers/spiffe.md +++ b/content/en/manage-claude/wif-providers/spiffe.md @@ -177,7 +177,7 @@ The Claude SDK can read the JWT-SVID from the file that spiffe-helper maintains ACCESS_TOKEN=$(curl -sS https://api.anthropic.com/v1/oauth/token \ -H "content-type: application/json" \ - --data @- < - Except in Java, workloads that link a SPIFFE Workload API client directly can skip spiffe-helper and pass the SDK a token provider that fetches a fresh JWT-SVID from the agent socket. The SDK invokes the provider before each token exchange, so the workload always presents an unexpired SVID. Python ([py-spiffe](https://github.com/HewlettPackard/py-spiffe)) and Go ([go-spiffe](https://github.com/spiffe/go-spiffe)) have mature Workload API clients. + Except in Java, workloads that link a SPIFFE Workload API client directly can skip spiffe-helper and pass the SDK a token provider that fetches a fresh JWT-SVID from the agent socket. The SDK calls the provider before each token exchange, so the workload always presents an unexpired SVID. Python ([py-spiffe](https://github.com/HewlettPackard/py-spiffe)) and Go ([go-spiffe](https://github.com/spiffe/go-spiffe)) have mature Workload API clients. ```python Python @@ -445,7 +445,7 @@ The Claude SDK can read the JWT-SVID from the file that spiffe-helper maintains ## Verify the setup -Before wiring the SDK in, fetch a JWT-SVID directly from SPIRE Agent and confirm the claims match what your federation rule expects. If you use a different SPIFFE implementation, fetch a JWT-SVID with its CLI or Workload API client and decode the payload the same way. +Before integrating the SDK, fetch a JWT-SVID directly from SPIRE Agent and confirm the claims match what your federation rule expects. If you use a different SPIFFE implementation, fetch a JWT-SVID with its CLI or Workload API client and decode the payload the same way. The Workload API attests the calling process. For a Kubernetes registration entry, run this command inside a pod that satisfies the entry's selectors and has the agent socket mounted (for example, by using `kubectl exec`). On VMs and bare metal, run it as the user or process that matches the entry's `unix:` selectors. Running from an unattested host shell returns `no identity issued`, which is the most common verify-step failure. @@ -474,8 +474,8 @@ Lock the rule's `match` block to the narrowest scope that fits your use case: * **Pin to one workload:** Set `subject_prefix` to the full SPIFFE ID with no trailing `*`. * **Always set an audience:** Require `audience` on the rule and configure spiffe-helper (or the Workload API call) with the same value so SVIDs minted for other relying parties are rejected. -* **Scope by path segment:** Use `spiffe://prod.example.com/ns/inference/*` to grant every workload registered under a namespace, and create a separate rule and Anthropic service account per namespace rather than widening one rule. -* **One issuer per trust domain:** Each SPIRE trust domain has its own signing keys and OIDC Discovery Provider. Register each as a separate federation issuer and bind rules to the issuer that owns the SPIFFE IDs they match. +* **Scope by path segment:** Use `spiffe://prod.example.com/ns/inference/*` to grant every workload registered under a namespace, and create a separate rule and Anthropic service account for each namespace rather than widening one rule. +* **One issuer for each trust domain:** Each SPIRE trust domain has its own signing keys and OIDC Discovery Provider. Register each as a separate federation issuer and bind rules to the issuer that owns the SPIFFE IDs they match. ## Next steps diff --git a/content/en/manage-claude/wif-reference.md b/content/en/manage-claude/wif-reference.md index 70272c4062..14f4542bda 100644 --- a/content/en/manage-claude/wif-reference.md +++ b/content/en/manage-claude/wif-reference.md @@ -47,7 +47,7 @@ The SDK reads these variables to perform a federated token exchange with no cons The direct environment-variable federation path activates only when `ANTHROPIC_FEDERATION_RULE_ID`, `ANTHROPIC_ORGANIZATION_ID`, `ANTHROPIC_SERVICE_ACCOUNT_ID`, and one of `ANTHROPIC_IDENTITY_TOKEN_FILE` or `ANTHROPIC_IDENTITY_TOKEN` are all set. `ANTHROPIC_WORKSPACE_ID` is read alongside but does not gate activation. - A variable that is set to an empty string still occupies its slot in the credential precedence chain. If `ANTHROPIC_API_KEY=""` is exported, the SDK selects the API-key path with an empty key rather than falling through to federation. Unset unused credential variables rather than blanking them. + A variable that is set to an empty string can still occupy its slot in the credential precedence chain. Unset unused credential variables rather than blanking them. ### Credential precedence @@ -126,7 +126,7 @@ The `oauth_scope` you set on a federation rule determines which Claude API endpo | `workspace:developer` | All non-administrative Claude API endpoints in the rule's workspace: [Messages](https://platform.claude.com/docs/en/api/messages) (including streaming and token counting), [Models](https://platform.claude.com/docs/en/api/models/list), [Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) and their sessions, [Files](https://platform.claude.com/docs/en/build-with-claude/files), and [Skills](https://platform.claude.com/docs/en/build-with-claude/skills-guide). This matches the access a workspace API key in the same workspace has. | | `workspace:inference` | The inference endpoints in the rule's workspace: [Messages](https://platform.claude.com/docs/en/api/messages) (including streaming and token counting), [Models](https://platform.claude.com/docs/en/api/models/list), and the [OpenAI-compatible chat endpoint](https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk). Use this for workloads that only need to call Claude and never need to manage Files, Skills, or other resources. | | `workspace:manage_tunnels` | The [MCP tunnels API](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/reference#tunnels-api): create, list, and get tunnels, register and archive CA certificates, reveal and rotate the tunnel token, and archive tunnels. The Console's create-tunnel modal window locks this scope when you create a rule from it. | -| `org:admin` | Full access to the [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) (organization members, invites, workspaces, API keys, and the rest). An OAuth `org:admin` token can only create or modify rules scoped to `workspace:developer` or `workspace:inference`, and cannot update an issuer that backs a rule with any other scope; see the [constraints](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#permissions-and-constraints). | +| `org:admin` | Full access to the [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) (organization members, invites, workspaces, API keys, and the rest). An OAuth `org:admin` token can only create or modify rules scoped to `workspace:developer` or `workspace:inference`, and cannot update an issuer that backs a rule with any other scope; see [Permissions and constraints](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#permissions-and-constraints). | A request to an endpoint outside the token's scope returns HTTP 403. Finer-grained scopes (per resource, or read versus write) are not currently available. @@ -134,10 +134,10 @@ A request to an endpoint outside the token's scope returns HTTP 403. Finer-grain A federation rule's `oauth_scope` is a ceiling: the minted token can never exceed it. The target service account's `organization_role` (`developer` or `admin`) determines which scopes are grantable, so a rule that grants `org:admin` must target a service account with `organization_role=admin`. Effective permissions are the intersection of the rule's scope and the service account's role. -| Rule `oauth_scope` | Service account `organization_role` | Effective permissions | -| --------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `workspace:developer` | `admin` | Claude API access in the rule's workspace only. The scope caps the token below the role. | -| `org:admin` | `admin` | Full Admin API access (organization members, invites, workspaces, API keys, and the rest), minus the OAuth-caller carve-outs; see [constraints](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#permissions-and-constraints). | +| Rule `oauth_scope` | Service account `organization_role` | Effective permissions | +| --------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `workspace:developer` | `admin` | Claude API access in the rule's workspace only. The scope caps the token below the role. | +| `org:admin` | `admin` | Full Admin API access (organization members, invites, workspaces, API keys, and the rest), minus the OAuth-caller exceptions; see [Permissions and constraints](https://platform.claude.com/docs/en/manage-claude/wif-admin-api#permissions-and-constraints). | ## Validation rules @@ -186,12 +186,12 @@ URL validation failures return `400 invalid_request_error` with the field name a A federation rule's `match` block determines whether an incoming JWT is accepted. All populated fields are evaluated with AND semantics: the JWT must satisfy every populated matcher. At least one of `subject_prefix`, `claims`, or `condition` must be set; a `match` block that contains only `audience` (or no matchers at all) is rejected. This guards against rules that would accept every token from an issuer. -| Matcher | Type | Semantics | -| ---------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `subject_prefix` | string | Exact match against the JWT `sub` claim. A trailing `*` makes it a prefix match (the `sub` value must begin with the characters before the `*`). Case-sensitive. | -| `audience` | string | The JWT `aud` claim must contain this exact string. When `aud` is an array, any element matching exactly satisfies the check. | -| `claims` | map\ | Each key is a top-level claim name and each value is the required exact string value. For nested, numeric, boolean, or complex claims like lists and maps, use `condition` with a CEL expression instead. | -| `condition` | string (CEL) | A [CEL](https://cel.dev/) expression that must evaluate to `true`. | +| Matcher | Type | Semantics | +| ---------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `subject_prefix` | string | Exact match against the JWT `sub` claim. A trailing `*` makes it a prefix match (the `sub` value must start with the characters before the `*`). Case-sensitive. | +| `audience` | string | The JWT `aud` claim must contain this exact string. When `aud` is an array, any element matching exactly satisfies the check. | +| `claims` | map\ | Each key is a top-level claim name and each value is the required exact string value. For nested, numeric, Boolean, or complex claims such as lists and maps, use `condition` with a CEL expression instead. | +| `condition` | string (CEL) | A [CEL](https://cel.dev/) expression that must evaluate to `true`. | ### CEL evaluation environment @@ -225,10 +225,10 @@ claims.sub.startsWith("repo:acme-corp/") && claims.ref in ["refs/heads/main", "r | 401 | `authentication_error` | JWKS fetch failed, JWKS is stale, or the JWT was signed with a key not in the JWKS. | For `inline` mode, update the issuer with the rotated keys. For `discovery` and `explicit_url`, confirm the JWKS endpoint is reachable on port 443; if the issuer recently rotated its signing key, see [Key rotation and caching](https://platform.claude.com/docs/en/manage-claude/wif-reference#key-rotation-and-caching). | | 401 | `authentication_error` | The JWT `exp` claim is in the past (beyond the 30-second skew window). | Confirm your identity provider is projecting a fresh token and the SDK is re-reading the token file. | | 401 | `authentication_error` | The JWT was verified but its claims do not satisfy the rule's `match` block. | Decode the JWT and compare each claim against the rule. `subject_prefix` is case-sensitive. `audience` requires an exact element match. | -| 401 | `authentication_error` | The `federation_rule_id` does not exist, is archived, or the JWT is not authorized for it (consolidated to prevent enumeration). | Confirm the rule ID in the Claude Console and that the rule has not been archived. | +| 401 | `authentication_error` | The `federation_rule_id` does not exist or is archived, or the JWT is not authorized for it (consolidated to prevent enumeration). | Confirm the rule ID in the Claude Console and that the rule has not been archived. | | 401 | `authentication_error` | The federation rule is enabled for more than one workspace and the request omits `workspace_id`. The authentication history entry shows reason `workspace_id_required`. | Set `ANTHROPIC_WORKSPACE_ID` (or the `workspace_id` body field on a raw request) to the `wrkspc_...` ID you want the token scoped to. See [Token exchange request](https://platform.claude.com/docs/en/manage-claude/wif-reference#token-exchange-request). | -Every assertion denial returns the same opaque `401` `authentication_error` with the fixed message `Authentication failed`, regardless of which check failed; a distinguishable error would let a caller probe rule configuration. The deny reason is recorded on the attempt's entry in the [authentication history](https://platform.claude.com/settings/workload-identity-federation?tab=history) in the Claude Console, for example `match_subject_prefix` when the `sub` claim fails the rule's `subject_prefix`, or `workspace_id_required` when the rule spans multiple workspaces and the request names none. Requests rejected before the rule's organization is corroborated (the `400 invalid_request_error` family above) leave no history entry; their response messages name the problem directly. A `401` with no matching history entry usually means the `federation_rule_id` itself was not recognized. +Every assertion denial returns the same opaque `401` `authentication_error` with the fixed message `Authentication failed`, regardless of which check failed; a distinguishable error would let a caller probe rule configuration. The deny reason is recorded on the attempt's entry in the [authentication history](https://platform.claude.com/settings/workload-identity-federation?tab=history) in the Claude Console, for example `match_subject_prefix` when the `sub` claim fails the rule's `subject_prefix`, or `workspace_id_required` when the rule spans multiple workspaces and the request names none. Requests rejected before the rule's organization is corroborated (the `400 invalid_request_error` family in the previous table) leave no history entry. Their response messages name the problem directly. A `401` with no matching history entry usually means the `federation_rule_id` itself was not recognized. ### Common SDK-side failures @@ -238,7 +238,7 @@ Every assertion denial returns the same opaque `401` `authentication_error` with | SDK authenticates with an API key instead of federating | `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` is set and wins precedence. | Unset the key or token variable. | | `FileNotFoundError` on first request | The path in `ANTHROPIC_IDENTITY_TOKEN_FILE` does not exist. The SDK opens the file lazily at exchange time. | Confirm the projected-token volume is mounted and the path matches. | | Token exchange succeeds but a Claude API request returns 403 | The minted token's scope does not grant access to that endpoint. | Check the rule's `oauth_scope` against [OAuth scopes](https://platform.claude.com/docs/en/manage-claude/wif-reference#oauth-scopes). | -| Authentication fails with empty credential | A credential environment variable is exported but set to an empty string. Empty values still win their precedence slot. | Unset the variable with `unset VAR` rather than `VAR=""`. | +| Authentication fails with empty credential | A credential environment variable is exported but set to an empty string. Empty values can still win their precedence slot. | Unset the variable with `unset VAR` rather than `VAR=""`. | ## Troubleshoot a failed exchange @@ -270,7 +270,7 @@ If you still need to debug from the JWT itself, work through these checks in ord - Compare `sub` against the rule's `subject_prefix` (case-sensitive; a trailing `*` is a prefix match, anything else is exact). Compare every key in the rule's `claims` map against the same-named top-level claim. + Compare `sub` against the rule's `subject_prefix` (case-sensitive; a trailing `*` is a prefix match, and anything else is exact). Compare every key in the rule's `claims` map against the same-named top-level claim. @@ -298,7 +298,7 @@ The discriminated union makes the companion fields mutually exclusive by constru ### Key rotation and caching -In `discovery` and `explicit_url` modes, Anthropic caches the fetched JWKS. If your identity provider publishes a new signing key and immediately starts signing tokens with it, exchanges that present those tokens may fail with a signature error for up to 1 minute while the cache refreshes. +In `discovery` and `explicit_url` modes, Anthropic caches the fetched JWKS. If your identity provider publishes a new signing key and immediately starts signing tokens with it, exchanges that present those tokens might fail with a signature error for up to 1 minute while the cache refreshes. To avoid this window, publish a new signing key in the JWKS at least 15 minutes before your identity provider starts signing tokens with it, and keep the superseded key in the JWKS until tokens it signed have expired. Managed identity providers typically follow this discipline on their own. If you operate your own issuer (a self-managed Kubernetes cluster, a SPIRE OIDC discovery provider, or an Okta custom authorization server with a configured rotation cadence), confirm that your rotation policy publishes new keys ahead of first use. diff --git a/content/en/manage-claude/workload-identity-federation.md b/content/en/manage-claude/workload-identity-federation.md index 343591f934..2e2940ba32 100644 --- a/content/en/manage-claude/workload-identity-federation.md +++ b/content/en/manage-claude/workload-identity-federation.md @@ -8,7 +8,7 @@ Workload Identity Federation (WIF) lets your workloads authenticate to the Claud Your workload presents a signed JWT from your identity provider. Anthropic validates it against trust rules you configure in the Claude Console and returns a short-lived Anthropic access token bound to a service account in your organization. There are no static secrets to mint, store in CI, rotate, or leak. -Workload Identity Federation strengthens your security posture by replacing static API keys with tokens that expire in minutes rather than never. It is not a complete security story on its own: federated authentication is only as strong as the upstream identity provider that signs the JWT. Pair Workload Identity Federation with the controls your IdP already supports (workload identity binding, conditional access, audit logging) for defense in depth. +Workload Identity Federation strengthens your security posture by replacing static API keys with tokens that expire in minutes rather than never. It is not a complete security solution on its own: federated authentication is only as strong as the upstream identity provider that signs the JWT. Pair Workload Identity Federation with the controls your IdP already supports (workload identity binding, conditional access, audit logging) for defense in depth. ## Concepts @@ -18,7 +18,7 @@ You configure three resources in the Claude Console before any workload can fede A **service account** (`svac_...`) is a named, non-human identity inside your Anthropic organization. It is the principal that a [service account key](https://platform.claude.com/docs/en/manage-claude/authentication#key-types) or a federated token acts as. Service accounts live at the organization level and become active in a workspace when you add them as members of that workspace. At exchange time, Anthropic checks that the federation rule's workspace matches one of the service account's workspace memberships; the minted token then follows that workspace's rate limits and usage attribution, the same as an API key. Unlike a human user, a service account has no email, no password, and no Console login. Every service account is implicitly a member of your organization's default workspace; add explicit memberships for any other workspace it should act in. To let an all-workspaces service account key act in a workspace, add the service account to that workspace. -The key distinction versus a workspace API key: a workspace API key *is* a credential, while a service account *has* credentials. You can more easily audit which workloads acted as which service account. +The key distinction versus a workspace API key: a workspace API key *is* a credential, whereas a service account *has* credentials. You can more easily audit which workloads acted as which service account. ### Federation issuers @@ -31,7 +31,7 @@ An issuer has two pieces of configuration: Issuer and JWKS URLs must be `https`, on port 443, and use a public DNS hostname that resolves to public IP addresses; IP literals are not accepted. These constraints apply only to URLs Anthropic fetches; in `explicit_url` and `inline` modes the `issuer_url` is compared as a string and may reference an internal hostname. -You typically register one issuer per environment: your production EKS cluster, your staging cluster, and GitHub Actions are three separate issuers. +You typically register one issuer for each environment: your production EKS cluster, your staging cluster, and GitHub Actions are three separate issuers. ### Federation rules @@ -43,7 +43,7 @@ A rule defines match conditions, a target, and the authorization scope and token * **Target:** The service account the matched JWT maps to. * **Authorization:** The OAuth `scope` granted on the minted token. The default is `workspace:developer`, which grants the same access as a workspace API key. Some products lock the scope when you create a rule from their flow; for example, the [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) create-tunnel modal creates rules scoped to `workspace:manage_tunnels`. See [OAuth scopes](https://platform.claude.com/docs/en/manage-claude/wif-reference#oauth-scopes). The rule also sets `token_lifetime_seconds` (60 to 86400, default 3600). -A single issuer can have many rules: one per team, namespace, or permission level. Rules are evaluated by ID: the client specifies which rule to use in the exchange request, and Anthropic verifies the JWT satisfies that rule's match criteria. There is no implicit rule search. +A single issuer can have many rules: one for each team, namespace, or permission level. Rules are evaluated by ID: the client specifies which rule to use in the exchange request, and Anthropic verifies the JWT satisfies that rule's match criteria. There is no implicit rule search. ## How it works @@ -87,7 +87,7 @@ With federation configured, your workload exchanges its IdP-issued JWT for an An ### Construct the SDK client -You can construct the client with explicit credentials or with no arguments. With no arguments, the SDK resolves credentials from environment variables or the active profile, as described under [Credential precedence](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#credential-precedence). The zero-argument form is the recommended pattern for production workloads: ship the same container image everywhere and inject `ANTHROPIC_FEDERATION_RULE_ID`, `ANTHROPIC_ORGANIZATION_ID`, `ANTHROPIC_SERVICE_ACCOUNT_ID`, `ANTHROPIC_WORKSPACE_ID`, and `ANTHROPIC_IDENTITY_TOKEN_FILE` per environment. +You can construct the client with explicit credentials or with no arguments. With no arguments, the SDK resolves credentials from environment variables or the active profile, as described under [Credential precedence](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#credential-precedence). The zero-argument form is the recommended pattern for production workloads: ship the same container image everywhere and inject `ANTHROPIC_FEDERATION_RULE_ID`, `ANTHROPIC_ORGANIZATION_ID`, `ANTHROPIC_SERVICE_ACCOUNT_ID`, `ANTHROPIC_WORKSPACE_ID`, and `ANTHROPIC_IDENTITY_TOKEN_FILE` for each environment. ```bash cURL @@ -276,7 +276,7 @@ You can construct the client with explicit credentials or with no arguments. Wit { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }], + Messages = [new UserMessageParam { Content = "Hello, Claude" }], }); foreach (var block in message.Content) { @@ -357,7 +357,7 @@ To switch an existing workload from a static API key to federation without downt 1. **Configure federation in parallel.** Complete the [setup walkthrough](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#set-up-federation) and confirm the federation rule matches your workload's token. Leave the existing `ANTHROPIC_API_KEY` in place for now. 2. **Smoke-test which credential wins.** Run `ant auth status` from inside the workload (or inspect SDK debug logs). Because `ANTHROPIC_API_KEY` sits above the federation tiers in the precedence chain, the API key still wins at this stage. -3. **Unset `ANTHROPIC_API_KEY` everywhere it is injected.** Remove it from CI secrets, container environment, and shell profiles (see the preceding warning). Re-run `ant auth status` and confirm the federation source is now selected. +3. **Unset `ANTHROPIC_API_KEY` everywhere it is injected.** Remove it from CI secrets, container environment, and shell profiles (see the preceding warning). Re-run `ant auth status` and confirm the federation source now wins. 4. **Delete the API key.** Once the workload is running on the federated token, delete the key on the [API keys](https://platform.claude.com/settings/keys) page (`platform.claude.com/settings/keys`) in the Claude Console. ## Token lifetime and refresh diff --git a/content/en/manage-claude/workspaces.md b/content/en/manage-claude/workspaces.md index b9329e74da..816c1fd6ba 100644 --- a/content/en/manage-claude/workspaces.md +++ b/content/en/manage-claude/workspaces.md @@ -13,9 +13,9 @@ Every organization has a **Default Workspace** that cannot be renamed, archived, Key characteristics: * **Workspace identifiers** use the `wrkspc_` prefix (for example, `wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ`) -* **Maximum 100 workspaces** per organization by default (archived workspaces don't count); contact your account team if you need more -* **Default Workspace** has a `wrkspc_` ID like any other workspace (returned in the [`anthropic-workspace-id` response header](https://platform.claude.com/docs/en/manage-claude/workspaces#identify-the-workspace-behind-an-api-response) and accepted by [Get Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/retrieve)), but it appears in [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) results only when you pass `include_default=true`, and API keys, usage reports, and cost reports show `null` for its `workspace_id`, as do all-workspaces API keys (an API key's `scope` field tells them apart; for a key bound to the Default Workspace it carries the real ID) -* **API keys** can be scoped to a single workspace. In this case, they can only access resources within that workspace. Some API keys can be granted permissions across multiple workspaces, and provide a [workspace ID header](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) to access resources within that workspace +* **Maximum 100 workspaces** for each organization by default (archived workspaces don't count); contact your account team if you need more +* **Default Workspace** has a `wrkspc_` ID like any other workspace (returned in the [`anthropic-workspace-id` response header](https://platform.claude.com/docs/en/manage-claude/workspaces#identify-the-workspace-behind-an-api-response) and accepted by [Get Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/retrieve)), but it appears in [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) results only when you pass `include_default=true`, and usage reports and cost reports show `null` for its `workspace_id` (an API key's `scope` field carries the real ID for a key bound to the Default Workspace) +* **API keys** can be scoped to a single workspace. In this case, they can only access resources within that workspace. Other API keys aren't scoped to a workspace. With one of these keys, send a [workspace ID header](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) on each request to choose the workspace. The key's user or service account must have access to that workspace ### Claude Code workspace @@ -46,9 +46,9 @@ Members can have different roles in each workspace, allowing fine-grained access ### Role inheritance -* **Organization admins** automatically receive Workspace Admin access to all workspaces -* **Organization billing members** automatically receive Workspace Billing access to all workspaces -* **Organization users and developers** must be explicitly added to each workspace +* **Organization admins** automatically receive Workspace Admin access to all workspaces. +* **Organization billing members** automatically receive Workspace Billing access to all workspaces. +* **Organization users and developers** must be explicitly added to each workspace. * **Service accounts** are added to workspaces on the [Service accounts](https://platform.claude.com/settings/service-accounts) page (`platform.claude.com/settings/service-accounts`) in the Claude Console: select **Add to workspace** in the account's menu or on its own page. To see the accounts in one workspace, filter the list by workspace. @@ -63,7 +63,7 @@ Members can have different roles in each workspace, allowing fine-grained access ### Using the Console -Create and manage workspaces in the [Claude Console](https://platform.claude.com/settings/workspaces). +Create and manage workspaces on the [Workspaces](https://platform.claude.com/settings/workspaces) page in the Claude Console. #### Create a workspace @@ -134,7 +134,7 @@ To archive a workspace, open its **More actions** menu (three dots) and select * * Cannot be undone - Archiving a workspace archives every API key created for that workspace within seconds (they remain listed in the Admin API as archived), and multi-workspace keys can no longer act in it. This action cannot be undone. If you archive the [Claude Code workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#claude-code-workspace), members of your organization can no longer sign in to Claude Code through Console billing. + Archiving a workspace archives every API key created for that workspace within seconds (they remain listed in the Admin API as archived), and keys that aren't scoped to a workspace can no longer act in it. This action cannot be undone. If you archive the [Claude Code workspace](https://platform.claude.com/docs/en/manage-claude/workspaces#claude-code-workspace), members of your organization can no longer sign in to Claude Code through Console billing. ### Using the Admin API @@ -145,7 +145,7 @@ Programmatically manage workspaces using the [Admin API](https://platform.claude Admin API endpoints accept an [Admin API key](https://platform.claude.com/docs/en/manage-claude/admin-api-keys), an `org:admin` OAuth token, or a personal or service account key that isn't scoped to a specific workspace. Workspace keys don't work there. See [Authentication](https://platform.claude.com/docs/en/manage-claude/admin-api#authentication). -The following SDK and CLI examples construct the default client, which reads the Admin API key from the `ANTHROPIC_API_KEY` environment variable; the SDKs expose these endpoints under `client.organization.workspaces` (csharp, go: `client.Organization.Workspaces`; java: `client.organization().workspaces()`; php: `$client->organization->workspaces`). SDK list methods fetch further pages on demand, so `limit` sets the page size; the PHP, Ruby, and curl examples return one page. +The following SDK and CLI examples construct the default client, which reads the Admin API key from the `ANTHROPIC_API_KEY` environment variable; the SDK exposes these endpoints under `client.organization.workspaces` (csharp, go: `client.Organization.Workspaces`; java: `client.organization().workspaces()`; php: `$client->organization->workspaces`). SDK list methods fetch further pages on demand, so `limit` sets the page size; the PHP, Ruby, and curl examples return one page. Create a workspace: @@ -825,7 +825,7 @@ For complete parameter details, see the [Workspace Members API reference](https: Every request runs in exactly one workspace and can only access resources within that workspace. Which workspace depends on the [key type](https://platform.claude.com/docs/en/manage-claude/authentication#key-types): * A **workspace key** (a legacy key without an owner) belongs to the workspace it was created in and always runs there. -* A **personal key** or **service account key** acts as its user or service account. A single-workspace key always runs in the workspace chosen when it was created. A multi-workspace key runs in the workspace named by each request's `anthropic-workspace-id` header. Accounts must have access to the workspace to use it. +* A **personal key** or **service account key** acts as its user or service account. A single-workspace key always runs in the workspace chosen when it was created. A key that isn't scoped to a workspace runs in the workspace named by each request's `anthropic-workspace-id` header. Accounts must have access to the workspace to use it. Resources scoped to workspaces include: @@ -838,7 +838,7 @@ Some resources are managed differently: * **[MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview)** are managed with a `workspace:manage_tunnels` OAuth token obtained through [Workload Identity Federation](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation), not an API key. Tunnels are created in a workspace, and the Console **MCP tunnels** list and the Managed Agent server picker show tunnels in the current workspace only; the cap of 10 active tunnels applies organization-wide. Tunnel management requires a role with tunnel management permissions; organization developers can view but not change them. * **Workspaces** themselves and **organization members** are managed at the organization level through the [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api), using an Admin API key, an `org:admin` OAuth token, or a personal or service account key that isn't scoped to a specific workspace. -To look up your organization's workspace IDs, call the [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) endpoint (pass `include_default=true` to include the Default Workspace) or find them in the [Claude Console](https://platform.claude.com/settings/workspaces). +To look up your organization's workspace IDs, call the [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) endpoint (pass `include_default=true` to include the Default Workspace) or find them on the [Workspaces](https://platform.claude.com/settings/workspaces) page in the Claude Console. [Prompt caches](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) are also isolated per workspace on the Claude API, [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), and [Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry). On Amazon Bedrock and Google Cloud, prompt caches are isolated per organization. @@ -914,7 +914,7 @@ The following examples send a Messages API request and read the workspace ID fro { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello, Claude" }] + Messages = [new UserMessageParam { Content = "Hello, Claude" }] }); var workspaceId = response.GetHeaderValues("anthropic-workspace-id").First(); Console.WriteLine($"Workspace ID: {workspaceId}"); @@ -1009,7 +1009,7 @@ The same accessors read the header from other Claude API endpoints too, includin With the workspace ID from a response, you can: * Confirm which workspace's usage, cost, and [rate limits](https://platform.claude.com/docs/en/api/rate-limits) the request counted toward -* Match it against the `workspace_id` field in [Usage and Cost API](https://platform.claude.com/docs/en/manage-claude/usage-cost-api) reports and on [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api) objects such as API keys (both report `null` for the Default Workspace, as API keys also do for all-workspaces keys; an API key's `scope` field tells the two apart and, for a key bound to one workspace, carries that workspace's real ID) +* Match it against the `workspace_id` field in [Usage and Cost API](https://platform.claude.com/docs/en/manage-claude/usage-cost-api) reports, which is `null` for the Default Workspace. Also match it against the `scope` field of API keys in the [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api), which carries the real ID of the workspace a key is bound to, including the Default Workspace * Check whether it's your Default Workspace's ID by passing it to [Get Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/retrieve) with an [Admin API key](https://platform.claude.com/docs/en/manage-claude/admin-api-keys): the Default Workspace comes back with `"name": "Default"`, even though [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) omits it unless you pass `include_default=true` * Open that workspace in the [Console](https://platform.claude.com/settings/workspaces) to find the request's resources, such as sessions, files, message batches, and skills @@ -1025,9 +1025,9 @@ You can set workspace limits lower than (but not higher than) your organization' * **Rate limits:** Limit requests per minute, input tokens per minute, or output tokens per minute. To set these, go to the [Rate limits](https://platform.claude.com/usage/limits) page in the Claude Console, select the workspace from the **Workspace** dropdown menu, and click **Edit** next to a model. - - You cannot set spend limits on the Default Workspace - - If not set, workspace limits match the organization's limits - - Organization-wide limits always apply, even if workspace limits add up to more + - You cannot set spend limits on the Default Workspace. + - If not set, workspace limits match the organization's limits. + - Organization-wide limits always apply, even if workspace limits add up to more. For detailed information on rate limits and how they work, see [Rate limits](https://platform.claude.com/docs/en/api/rate-limits). You can also read your current organization and workspace rate limits programmatically with the [Rate Limits API](https://platform.claude.com/docs/en/manage-claude/rate-limits-api). @@ -1101,7 +1101,7 @@ Create workspaces for specific projects or products to track usage and costs sep - Every organization has a "Default Workspace" that cannot be renamed, archived, or deleted. Like every workspace, it has a `wrkspc_` ID: the API returns it in the [`anthropic-workspace-id` response header](https://platform.claude.com/docs/en/manage-claude/workspaces#identify-the-workspace-behind-an-api-response), and you can pass it to [Get Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/retrieve) and [Update Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/update). It has no member list of its own, because access to it follows each member's organization role. It appears in [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) results only when you pass `include_default=true`, and API keys, usage reports, and cost reports that belong to it show `null` for `workspace_id`, as do all-workspaces API keys; an API key's `scope` field tells the two apart and, for a key that belongs to the Default Workspace, carries its real ID. + Every organization has a "Default Workspace" that cannot be renamed, archived, or deleted. Like every workspace, it has a `wrkspc_` ID: the API returns it in the [`anthropic-workspace-id` response header](https://platform.claude.com/docs/en/manage-claude/workspaces#identify-the-workspace-behind-an-api-response), and you can pass it to [Get Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/retrieve) and [Update Workspace](https://platform.claude.com/docs/en/api/organization/workspaces/update). It has no member list of its own, because access to it follows each member's organization role. It appears in [List Workspaces](https://platform.claude.com/docs/en/api/organization/workspaces/list) results only when you pass `include_default=true`, and usage reports and cost reports that belong to it show `null` for `workspace_id`. For an API key that belongs to it, the key's `scope` field carries the workspace's real ID. diff --git a/content/en/managed-agents/agent-setup.md b/content/en/managed-agents/agent-setup.md index e4a0908570..7c07a9b27e 100644 --- a/content/en/managed-agents/agent-setup.md +++ b/content/en/managed-agents/agent-setup.md @@ -34,7 +34,7 @@ You can also override `model` (csharp, go: `Model`), `system` (csharp, go: `Syst The following example defines a coding agent that uses the newest Claude Opus model with access to the pre-built agent toolset. The toolset lets the agent write code, read files, search the web, and more. See the [agent tools reference](https://platform.claude.com/docs/en/managed-agents/tools) for the full list of supported tools. -The examples use curl, the `ant` CLI, or one of the SDKs. If you haven't set one up, the [quickstart](https://platform.claude.com/docs/en/managed-agents/quickstart#install-the-cli) covers installation and client setup. +The examples use curl, the `ant` CLI, or the SDK. If you haven't set one up, the [quickstart](https://platform.claude.com/docs/en/managed-agents/quickstart#install-the-cli) covers installation and client setup. ```bash cURL @@ -98,13 +98,7 @@ The examples use curl, the `ant` CLI, or one of the SDKs. If you haven't set one Name = "Coding Assistant", Model = BetaManagedAgentsModel.ClaudeOpus5_5, System = "You are a helpful coding agent.", - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, - ], + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], }); ``` @@ -132,11 +126,7 @@ The examples use curl, the `ant` CLI, or one of the SDKs. If you haven't set one .name("Coding Assistant") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You are a helpful coding agent.") - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .build() ); ``` @@ -147,9 +137,7 @@ The examples use curl, the `ant` CLI, or one of the SDKs. If you haven't set one model: 'claude-opus-5-5', system: 'You are a helpful coding agent.', tools: [ - BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', - ), + BetaManagedAgentsAgentToolset20260401Params::with(), ], ); ``` @@ -844,7 +832,7 @@ Archiving makes the agent read-only and cannot be undone. Existing sessions cont - Create a session to run your agent and begin executing tasks. + Create a session to run your agent and start running tasks. diff --git a/content/en/managed-agents/budgets.md b/content/en/managed-agents/budgets.md index cdb363aa4d..7eec9b07f5 100644 --- a/content/en/managed-agents/budgets.md +++ b/content/en/managed-agents/budgets.md @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -A session budget is an optional hard spend ceiling you set when you [create a session](https://platform.claude.com/docs/en/managed-agents/sessions). The platform continuously prices everything the session consumes at public list rates (the session's **list cost**) and stops issuing new model requests once that cost reaches the budget. The request in flight when the cap is crossed still finishes, so the final list cost can land [a fraction past the budget](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget). A session at its budget pauses and goes [idle](https://platform.claude.com/docs/en/managed-agents/session-operations#session-statuses) rather than terminating; changing or removing the budget resumes the work that the budget paused. Deployments accept the same budget and apply it to each session they start; see [Budgets on deployments](https://platform.claude.com/docs/en/managed-agents/budgets#budgets-on-deployments). +A session budget is an optional hard spend ceiling you set when you [create a session](https://platform.claude.com/docs/en/managed-agents/sessions). The platform continuously prices everything the session consumes at public list rates (the session's **list cost**) and stops issuing new model requests once that cost reaches the budget. The request in flight when the cap is crossed still completes, so the final list cost can land [a fraction past the budget](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget). A session at its budget pauses and goes [idle](https://platform.claude.com/docs/en/managed-agents/session-operations#session-statuses) rather than terminating; changing or removing the budget resumes the work that the budget paused. Deployments accept the same budget and apply it to each session they start; see [Budgets on deployments](https://platform.claude.com/docs/en/managed-agents/budgets#budgets-on-deployments). ## Set a budget at session creation @@ -72,7 +72,6 @@ Pass the optional `budget` (csharp, go: `Budget`) field when you create the sess EnvironmentID = environment.ID, Budget = new() { - Type = BetaManagedAgentsBudgetLimitType.Limit, MaxListCost = new() { Amount = "125", Currency = BetaCurrency.Usd }, }, }); @@ -104,7 +103,6 @@ Pass the optional `budget` (csharp, go: `Budget`) field when you create the sess .agent(agent.id()) .environmentId(environment.id()) .budget(BetaManagedAgentsBudgetLimit.builder() - .type(BetaManagedAgentsBudgetLimit.Type.LIMIT) .maxListCost(BetaMonetaryAmount.builder() .amount("125") .currency(BetaCurrency.USD) @@ -142,7 +140,7 @@ Pass the optional `budget` (csharp, go: `Budget`) field when you create the sess The `budget` (csharp, go: `Budget`) object has two fields: * `type` (csharp, go: `Type`) is always `"limit"`. -* `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`) is the cap itself: `amount` (csharp, go: `Amount`) is a whole number of US cents written as a string with no leading zeros (`"125"` is $1.25 and `"50"` is 50 cents) and must be greater than zero. Decimal forms such as `"25.00"` are rejected. The amount is a string rather than a number so no float rounding is ever applied to it. `currency` (csharp, go: `Currency`) is an uppercase ISO-4217 currency code; `USD` is the only supported currency. +* `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`) is the cap itself: `amount` (csharp, go: `Amount`) is a whole number of US cents written as a string with no leading zeros (`"125"` is $1.25 USD and `"50"` is 50 cents) and must be greater than zero. Decimal forms such as `"25.00"` are rejected. The amount is a string rather than a number so no float rounding is ever applied to it. `currency` (csharp, go: `Currency`) is an uppercase ISO-4217 currency code; `USD` is the only supported currency. A budget can only be attached when the session is created. Adding a budget to an existing session that doesn't have one is rejected with a 400 error. A budgeted session's cap can be [changed](https://platform.claude.com/docs/en/managed-agents/budgets#change-the-budget) or [removed](https://platform.claude.com/docs/en/managed-agents/budgets#remove-the-budget) at any time. @@ -185,7 +183,7 @@ Any event that would start new work, such as `user.message`, is rejected with a A `user.interrupt` sent while the session is paused at its budget (all threads paused at the cap) is accepted, and it does not appear in the event list. It stops no thread, because every thread is already paused. Change or remove the budget to continue. -If the session has open [workflow runs](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open), the interrupt can pause them, as an interrupt at any other time can. A run that an interrupt paused doesn't resume when you change or remove the budget. To continue it, change or remove the budget, then send a `user.message` asking the agent to continue its runs. +If the session has open workflow runs, the interrupt can pause them, as an interrupt at any other time can. A run that an interrupt paused doesn't resume when you change or remove the budget. To continue it, change or remove the budget, then send a `user.message` asking the agent to continue its runs. See [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). ## Resume a session at its budget @@ -244,7 +242,6 @@ Update the session with a new `max_list_cost` (java, php: `maxListCost`; csharp, { Budget = new() { - Type = BetaManagedAgentsBudgetLimitType.Limit, MaxListCost = new() { Amount = "500", Currency = BetaCurrency.Usd }, }, }); @@ -270,7 +267,6 @@ Update the session with a new `max_list_cost` (java, php: `maxListCost`; csharp, ```java Java var updatedSession = client.beta().sessions().update(session.id(), SessionUpdateParams.builder() .budget(BetaManagedAgentsBudgetLimit.builder() - .type(BetaManagedAgentsBudgetLimit.Type.LIMIT) .maxListCost(BetaMonetaryAmount.builder() .amount("500") .currency(BetaCurrency.USD) @@ -378,7 +374,7 @@ Pass `"budget": null` (python: `budget=None`; typescript: `budget: null`; ruby: ## Monitor spend -The session object carries its `budget` (csharp, go: `Budget`) and a `usage` (csharp, go: `Usage`) object with the tracked spend: `usage.list_cost` (java, php: `usage.listCost`; csharp, go: `Usage.ListCost`) is the session's consumed list cost, and `usage.active_seconds` (java, php: `usage.activeSeconds`; csharp, go: `Usage.ActiveSeconds`) is the running time its runtime cost is priced on. On a session paused at `budget_reached`, expect `usage.list_cost` (java, php: `usage.listCost`; csharp, go: `Usage.ListCost`) to read at or a fraction past `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`): the [request that crossed the cap](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget) finished before the pause. Session-level `active_seconds` (java, php: `activeSeconds`; csharp, go: `ActiveSeconds`) counts overlapping activity from concurrent threads once. Thread retrieval responses carry the same two fields on the thread's own `usage` (csharp, go: `Usage`), priced per thread. Per-thread figures are rounded independently and exclude the session's running-time cost, so they don't sum exactly to the session's `list_cost` (java, php: `listCost`; csharp, go: `ListCost`); the session figure is the one the budget is enforced against. +The session object carries its `budget` (csharp, go: `Budget`) and a `usage` (csharp, go: `Usage`) object with the tracked spend: `usage.list_cost` (java, php: `usage.listCost`; csharp, go: `Usage.ListCost`) is the session's consumed list cost, and `usage.active_seconds` (java, php: `usage.activeSeconds`; csharp, go: `Usage.ActiveSeconds`) is the running time its runtime cost is priced on. On a session paused at `budget_reached`, expect `usage.list_cost` (java, php: `usage.listCost`; csharp, go: `Usage.ListCost`) to read at or a fraction past `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`): the [request that crossed the cap](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget) completed before the pause. Session-level `active_seconds` (java, php: `activeSeconds`; csharp, go: `ActiveSeconds`) counts overlapping activity from concurrent threads once. Thread retrieval responses carry the same two fields on the thread's own `usage` (csharp, go: `Usage`), priced for each thread. Per-thread figures are rounded independently and exclude the session's running-time cost, so they don't sum exactly to the session's `list_cost` (java, php: `listCost`; csharp, go: `ListCost`); the session figure is the one the budget is enforced against. The `session.usage` event is a snapshot of the session's cumulative usage and tracked list cost. It carries the session's token totals, `list_cost` (java, php: `listCost`; csharp, go: `ListCost`), `active_seconds` (java, php: `activeSeconds`; csharp, go: `ActiveSeconds`), `server_tool_use` (java, php: `serverToolUse`; csharp, go: `ServerToolUse`) request counts (`web_search_requests` (java, php: `webSearchRequests`; csharp, go: `WebSearchRequests`), priced into list cost per request, and `web_fetch_requests` (java, php: `webFetchRequests`; csharp, go: `WebFetchRequests`), which reads `0` because web fetch requests carry no per-request charge and aren't metered), and the session's `budget` (csharp, go: `Budget`) if the session has one. It appears in the events list and the session stream. The session emits one immediately before it goes idle, whatever the stop reason, so a session that reaches its budget always emits one immediately before the budget-reached idle event. @@ -386,7 +382,7 @@ To read usage from the stream and the session object, see [Track usage](https:// ## Budgets in multiagent sessions -A [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session has a single budget shared across all of its threads; there are no per-thread caps. Each thread's consumption is priced at its own served model, and threads pause independently as the shared cap is reached. [Advisor](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#give-the-session-an-advisor) consultations count against the same budget, priced at the advisor model's rates. One thread can pause at `budget_reached` while another finishes its in-flight request. +A [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session has a single budget shared across all of its threads; there are no per-thread caps. Each thread's consumption is priced at its own served model, and threads pause independently as the shared cap is reached. [Advisor](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#give-the-session-an-advisor) consultations count against the same budget, priced at the advisor model's rates. One thread can pause at `budget_reached` while another completes its in-flight request. A pending ask outranks the cap: a session with one thread waiting on `requires_action` and another paused at `budget_reached` reports `requires_action` at the session level. The pending request still needs an answer, and answering it is a [settle event](https://platform.claude.com/docs/en/managed-agents/budgets#events-accepted-at-the-cap) the budget doesn't block. diff --git a/content/en/managed-agents/choosing-an-environment.md b/content/en/managed-agents/choosing-an-environment.md index 1982bd71bc..e2a6b69345 100644 --- a/content/en/managed-agents/choosing-an-environment.md +++ b/content/en/managed-agents/choosing-an-environment.md @@ -13,7 +13,7 @@ featureMetadata: An environment sets where your agent's tools and code run. They run in a sandbox. A sandbox is an isolated workspace, such as a container, where the agent runs commands and works on files. You have two options: * **Cloud environment:** Anthropic runs the sandbox for you. Each session gets its own fresh Linux container on Anthropic-managed infrastructure, with common languages, databases, and utilities already installed. You choose its network rules and any extra packages to install. -* **Self-hosted sandbox:** You run the sandbox on your own infrastructure. Claude still runs on Anthropic's side and decides which tool to call next. A program that you run, called a worker, carries out the agent's bash and file tool calls on your machines and sends each result back. It can also serve custom tools. +* **Self-hosted sandbox:** You run the sandbox on your own infrastructure. Claude still runs on Anthropic's side and determines which tool to call next. A program that you run, called a worker, carries out the agent's bash and file tool calls on your machines and sends each result back. It can also serve custom tools. The agent definition is the same whichever you choose. You set the model, prompt, and tools on the [agent](https://platform.claude.com/docs/en/managed-agents/agent-setup), not on the environment. diff --git a/content/en/managed-agents/cloud-sandboxes-reference.md b/content/en/managed-agents/cloud-sandboxes-reference.md index c609acede6..f4e1c2e5f5 100644 --- a/content/en/managed-agents/cloud-sandboxes-reference.md +++ b/content/en/managed-agents/cloud-sandboxes-reference.md @@ -20,7 +20,7 @@ These specifications apply to `cloud` environments. Self-hosted sandboxes run on | -------- | --------------------------- | -------------------- | | Python | 3.10, 3.11, 3.12, and 3.13 | pip, uv, poetry | | Node.js | 20, 21, and 22 (default) | npm, yarn, pnpm, bun | -| Go | 1.24 (default) and 1.25 | go modules | +| Go | 1.24 (default) and 1.25 | Go modules | | Rust | Stable toolchain (rustup) | cargo | | Java | OpenJDK 21 | maven, gradle | | Ruby | 3.1, 3.2, and 3.3 (default) | bundler, gem | diff --git a/content/en/managed-agents/define-outcomes.md b/content/en/managed-agents/define-outcomes.md index 64d6ed80c0..1f94b38b97 100644 --- a/content/en/managed-agents/define-outcomes.md +++ b/content/en/managed-agents/define-outcomes.md @@ -23,7 +23,7 @@ A rubric is a markdown document describing per-criterion scoring. The rubric is Structure the rubric as explicit, gradeable criteria, such as "The CSV contains a price column with numeric values" rather than "The data looks good." The grader scores each criterion independently, so vague criteria produce noisy evaluations. - If you don't have a rubric on hand, try giving Claude an example of a known-good artifact and asking it to analyze what makes that content good, then turn that analysis into a rubric. This middle-ground approach often produces better results than writing criteria from scratch. + If you don't have a rubric, try giving Claude an example of a known-good artifact and asking it to analyze what makes that content good, then turn that analysis into a rubric. This middle-ground approach often produces better results than writing criteria with no example to start from. Example rubric: @@ -285,7 +285,7 @@ Pass the rubric as inline text on `user.define_outcome` (see [Create a session w ## Create a session with an outcome -The following examples create a [session](https://platform.claude.com/docs/en/managed-agents/sessions) for an existing [agent](https://platform.claude.com/docs/en/managed-agents/agent-setup) and [environment](https://platform.claude.com/docs/en/managed-agents/environments) (both created separately), then send a `user.define_outcome` event. The agent begins work immediately. No additional user message event is required. +The following examples create a [session](https://platform.claude.com/docs/en/managed-agents/sessions) for an existing [agent](https://platform.claude.com/docs/en/managed-agents/agent-setup) and [environment](https://platform.claude.com/docs/en/managed-agents/environments) (both created separately), then send a `user.define_outcome` event. The agent starts work immediately. No additional user message event is required. ```bash cURL @@ -347,7 +347,7 @@ The following examples create a [session](https://platform.claude.com/docs/en/ma title="Financial analysis on Costco", ) - # Define the outcome — agent starts working on receipt + # Define the outcome. The agent starts working on receipt. client.beta.sessions.events.send( session_id=session.id, events=[ @@ -370,7 +370,7 @@ The following examples create a [session](https://platform.claude.com/docs/en/ma title: "Financial analysis on Costco" }); - // Define the outcome — agent starts working on receipt + // Define the outcome. The agent starts working on receipt. await client.beta.sessions.events.send(session.id, { events: [ { @@ -400,15 +400,9 @@ The following examples create a [session](https://platform.claude.com/docs/en/ma [ new BetaManagedAgentsUserDefineOutcomeEventParams { - Type = BetaManagedAgentsUserDefineOutcomeEventParamsType.UserDefineOutcome, Description = "Build a DCF model for Costco in .xlsx", - Rubric = new BetaManagedAgentsTextRubricParams - { - Type = BetaManagedAgentsTextRubricParamsType.Text, - Content = Rubric, - }, - // or: Rubric = new BetaManagedAgentsFileRubricParams - // { Type = BetaManagedAgentsFileRubricParamsType.File, FileID = rubric.ID }, + Rubric = new BetaManagedAgentsTextRubricParams { Content = Rubric }, + // or: Rubric = new BetaManagedAgentsFileRubricParams { FileID = rubric.ID }, MaxIterations = 5, // optional; default 3, max 20 }, ], @@ -465,14 +459,11 @@ The following examples create a [session](https://platform.claude.com/docs/en/ma session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserDefineOutcomeEventParams.builder() - .type(BetaManagedAgentsUserDefineOutcomeEventParams.Type.USER_DEFINE_OUTCOME) .description("Build a DCF model for Costco in .xlsx") .rubric(BetaManagedAgentsTextRubricParams.builder() - .type(BetaManagedAgentsTextRubricParams.Type.TEXT) .content(RUBRIC) .build()) - // or: .rubric(BetaManagedAgentsFileRubricParams.builder() - // .type(BetaManagedAgentsFileRubricParams.Type.FILE).fileId(rubric.id()).build()) + // or: .rubric(BetaManagedAgentsFileRubricParams.builder().fileId(rubric.id()).build()) .maxIterations(5) // optional; default 3, max 20 .build()) .build()); @@ -509,7 +500,7 @@ The following examples create a [session](https://platform.claude.com/docs/en/ma title: "Financial analysis on Costco" ) - # Define the outcome — agent starts working on receipt + # Define the outcome. The agent starts working on receipt. client.beta.sessions.events.send_( session.id, events: [ @@ -536,13 +527,13 @@ Progress on an outcome-oriented session is surfaced on the events [stream](https * `agent.*` events (such as messages and tool use) show progress toward the outcome. * `span.outcome_evaluation_*` events are only emitted for outcome-oriented sessions and show the number of iteration loops and the grader's feedback process. * You can also send `user.message` [events](https://platform.claude.com/docs/en/managed-agents/reference#event-types) to an outcome-oriented session to direct the agent's work as it progresses, but it isn't required: the agent works toward the outcome on its own, iterating until it succeeds or runs out of iterations. -* A `user.interrupt` event pauses work on the current outcome and marks the `result` (csharp, go: `Result`) of the `span.outcome_evaluation_end` event as `interrupted`, allowing you to kick off a new outcome. +* A `user.interrupt` event pauses work on the current outcome and marks the `result` (csharp, go: `Result`) of the `span.outcome_evaluation_end` event as `interrupted`, allowing you to start a new outcome. * After the final outcome evaluation, the session can be continued as a conversational session, or a new outcome can be started. The session retains history of the prior outcome. ### Define outcome user event - Only one outcome is supported at a time, but you may chain outcomes in sequence. To do this, send a new `user.define_outcome` event after the terminal `span.outcome_evaluation_end` event of the previous outcome. + Only one outcome is supported at a time, but you can chain outcomes in sequence. To do this, send a new `user.define_outcome` event after the terminal `span.outcome_evaluation_end` event of the previous outcome. This is the event you send to initiate an outcome. It is echoed back on receipt, including a `processed_at` (java, php: `processedAt`; csharp, go: `ProcessedAt`) timestamp and `outcome_id` (java: `outcomeId`; php: `outcomeID`; csharp, go: `OutcomeID`). @@ -586,7 +577,7 @@ Heartbeat emitted while the grader runs. The grader's internal reasoning is opaq ### Outcome evaluation end -Emitted when an outcome evaluation cycle ends: after the grader finishes evaluating one iteration, or when the session is interrupted while an outcome is active. The `result` field indicates what happens next. +Emitted when an outcome evaluation cycle ends: after the grader finishes evaluating one iteration, or when the session is interrupted while an outcome is active. The `result` field indicates what occurs next. | Result | Next | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -872,7 +863,7 @@ The agent writes output files to `/mnt/session/outputs/` inside the sandbox. To - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/dreams.md b/content/en/managed-agents/dreams.md index 8e1b3983c6..411161519c 100644 --- a/content/en/managed-agents/dreams.md +++ b/content/en/managed-agents/dreams.md @@ -1,7 +1,7 @@ --- title: Dreams url: https://platform.claude.com/docs/en/managed-agents/dreams -description: Let Claude reflect on past sessions to curate an agent's memory and surface new insights. +description: Let Claude review past sessions to curate an agent's memory and surface new insights. --- @@ -36,7 +36,7 @@ The dream produces another **output memory store**, separate from the input. The -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01,dreaming-2026-04-21" \ -H "content-type: application/json" \ - --data '{ + -d '{ "inputs": [ { "type": "memory_store", "memory_store_id": "'"$store_id"'" }, { "type": "sessions", "session_ids": ["'"$session_a"'", "'"$session_b"'"] } @@ -87,16 +87,8 @@ The dream produces another **output memory store**, separate from the input. The { Inputs = [ - new BetaDreamMemoryStoreInput - { - Type = BetaDreamMemoryStoreInputType.MemoryStore, - MemoryStoreID = storeID, - }, - new BetaDreamSessionsInput - { - Type = BetaDreamSessionsInputType.Sessions, - SessionIds = [sessionA, sessionB], - }, + new BetaDreamMemoryStoreInput { MemoryStoreID = storeID }, + new BetaDreamSessionsInput { SessionIds = [sessionA, sessionB] }, ], Model = "claude-opus-5-5", Instructions = "Focus on coding-style preferences; ignore one-off debugging notes.", @@ -196,7 +188,7 @@ The response is the full `dream` resource with `status: "pending"`: The optional `instructions` (csharp, go: `Instructions`) field steers what the dreaming pipeline synthesizes. It is applied throughout the pipeline: what to read closely, what to merge or drop, and how to structure the output store. -Use `instructions` (csharp, go: `Instructions`) for high-level synthesis guidance such as focus areas ("focus on coding-style preferences"), content to preserve unchanged, or output conventions you want applied across the store. The pipeline is a synthesis pass over the inputs, not an editor applied to the text of the store, so imperative directives that target specific lines ("change sentence X to Y", "fix the count in section Z") generally produce no change. To make targeted edits to individual memories, use the [Memory Stores API](https://platform.claude.com/docs/en/managed-agents/memory#view-and-edit-memories) on the output store directly. +Use `instructions` (csharp, go: `Instructions`) for high-level synthesis guidance such as focus areas ("focus on coding-style preferences"), content to preserve unchanged, or output conventions you want applied across the store. The pipeline is a synthesis pass over the inputs, not an editor applied to the text of the store, so imperative directives that target specific lines ("change sentence X to Y," "fix the count in section Z") generally produce no change. To make targeted edits to individual memories, use the [Memory Stores API](https://platform.claude.com/docs/en/managed-agents/memory#view-and-edit-memories) on the output store directly. ## Track progress @@ -291,9 +283,9 @@ Once a dream is `running`, its `session_id` (java: `sessionId`; php: `sessionID` ## Use the output -When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` entry in `outputs` (csharp, go: `Outputs`) references a fully populated store. It's an ordinary memory store in your workspace. Review it with the [Memory Stores API](https://platform.claude.com/docs/en/managed-agents/memory#view-and-edit-memories) or in the Console, then either: +When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` entry in `outputs` (csharp, go: `Outputs`) references a fully populated store. It's an ordinary memory store in your workspace. Review it with the [Memory Stores API](https://platform.claude.com/docs/en/managed-agents/memory#view-and-edit-memories) or in the Claude Console, then either: -* **Leverage it:** attach it to future sessions as a `memory_store` resource in place of (or alongside) the input memory store, or +* **Use it:** attach it to future sessions as a `memory_store` resource in place of (or alongside) the input memory store, or * **Discard it:** [delete the memory store](https://platform.claude.com/docs/en/api/beta/memory_stores/delete) or [archive the memory store](https://platform.claude.com/docs/en/api/beta/memory_stores/archive). @@ -304,7 +296,7 @@ When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` ent -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "agent": "'"$agent_id"'", "environment_id": "'"$environment_id"'", "resources": [ @@ -352,7 +344,7 @@ When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` ent ``` ```csharp C# - var output = dream.Outputs.FirstOrDefault(entry => entry.Type == "memory_store"); + var output = dream.Outputs.FirstOrDefault(entry => entry.Type.GetString() == "memory_store"); if (output is { MemoryStoreID: var outputStoreID }) { await client.Beta.Sessions.Create(new() @@ -361,11 +353,7 @@ When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` ent EnvironmentID = environmentID, Resources = [ - new BetaManagedAgentsMemoryStoreResourceParam - { - Type = BetaManagedAgentsMemoryStoreResourceParamType.MemoryStore, - MemoryStoreID = outputStoreID, - }, + new BetaManagedAgentsMemoryStoreResourceParam { MemoryStoreID = outputStoreID }, ], }); } @@ -400,7 +388,7 @@ When `status` (csharp, go: `Status`) reaches `completed`, the `memory_store` ent ```java Java var output = dream.outputs().stream() - .filter(entry -> entry.type().equals(BetaDreamOutput.Type.MEMORY_STORE)) + .filter(entry -> entry._type().equals(JsonValue.from("memory_store"))) .findFirst(); if (output.isPresent()) { var outputStoreId = output.get().memoryStoreId(); diff --git a/content/en/managed-agents/environments.md b/content/en/managed-agents/environments.md index d34edb57cd..0780fbc341 100644 --- a/content/en/managed-agents/environments.md +++ b/content/en/managed-agents/environments.md @@ -23,7 +23,7 @@ This page covers `type: cloud` environments. To run sandboxes on your own infras -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "name": "python-dev", "config": { "type": "cloud", @@ -49,7 +49,7 @@ This page covers `type: cloud` environments. To run sandboxes on your own infras ``` - [`ant apply`](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/apply) creates the environment from `environment.yaml`, prints its ID, and records it in `claude-lock.json`. Commit `claude-lock.json` so the next `ant apply` updates this environment instead of trying to create it again. + [`ant apply`](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/apply) creates the environment from `environment.yaml`, prints its ID, and records it in `claude-lock.json`. Commit `claude-lock.json` so the next `ant apply` updates this environment instead of attempting to create it again. ```python Python @@ -161,7 +161,7 @@ Pass the environment ID as a string when [creating a session](https://platform.c -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "agent": "'"$AGENT_ID"'", "environment_id": "'"$ENVIRONMENT_ID"'" }' @@ -240,7 +240,7 @@ The `packages` (csharp, go: `Packages`) field pre-installs packages into the san -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "name": "data-analysis", "config": { "type": "cloud", @@ -623,7 +623,7 @@ With `unrestricted` networking, code in the sandbox can send requests to any hos * **The agent can change things on external sites, not only read them:** The `bash` tool can send any request. The agent can post data, submit forms, call APIs, and run scripts that change data on external sites. Even a request that only fetches a URL can change data on some sites. * **Nothing pauses these requests by default:** The agent toolset's default [permission policy](https://platform.claude.com/docs/en/managed-agents/permission-policies) is `always_allow`, so `bash` commands run without approval. * **Anything in the sandbox can leave it:** This includes files, tool outputs, and any credentials or secrets you put in the sandbox. -* **Fetched content can steer the agent:** Web pages, API responses, and other content the agent reads can contain instructions (prompt injection) that change what it does next. +* **Fetched content can steer the agent:** Webpages, API responses, and other content the agent reads can contain instructions (prompt injection) that change what it does next. * **The agent acts on your behalf:** Its actions can violate a site's terms of service, or create accounts and records there. * **Model behavior is not a security control:** The agent can act on external sites in ways you did not ask for, including retrying in a different way after a site blocks a request. Use network settings and permission policies to limit what it can do. * **The safety blocklist is not an allowlist:** It does not limit which other sites the agent reaches, or what the agent does on them. diff --git a/content/en/managed-agents/event-deltas.md b/content/en/managed-agents/event-deltas.md index 5ce9fd6b00..d7f09d285f 100644 --- a/content/en/managed-agents/event-deltas.md +++ b/content/en/managed-agents/event-deltas.md @@ -10,13 +10,13 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -By default, the agent's response text reaches the [session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) as buffered `agent.message` events. Each one is emitted only after the model request that produced it finishes. Event deltas let you render that text incrementally, as a live preview, while the model is still generating it. +By default, the agent's response text reaches the [session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) as buffered `agent.message` events. Each one is emitted only after the model request that produced it completes. Event deltas let you render that text incrementally, as a live preview, while the model is still generating it. Previews are a best-effort display aid, and the buffered `agent.message` is always the authoritative record. A client that ignores previews still receives a complete, correct stream. ## Opt in to previews -Previews are opt-in per stream connection. Add the `event_deltas[]` query parameter to the stream you're reading, and repeat it once for each event type you want previewed. The accepted values are `agent.message` and `agent.thinking`. Any other value returns a 400 error, as does a request with more than 100 values. +Previews are opt-in for each stream connection. Add the `event_deltas[]` query parameter to the stream you're reading, and repeat it once for each event type you want previewed. The accepted values are `agent.message` and `agent.thinking`. Any other value returns a 400 error, as does a request with more than 100 values. Both stream endpoints accept the parameter: @@ -29,7 +29,7 @@ A subagent's previews appear on [that subagent's own thread stream](https://plat ### Preview events -When a previewed event begins, the stream emits an `event_start` carrying the upcoming event's type and `id`: +When a previewed event starts, the stream emits an `event_start` carrying the upcoming event's type and `id`: ```json { @@ -70,7 +70,7 @@ Unlike persisted events, `event_start` and `event_delta` have no `id` or `proces Every SDK that supports event deltas includes an [accumulator helper](https://platform.claude.com/docs/en/managed-agents/event-deltas#sdk-accumulator-helpers) that handles the `index` bookkeeping for you. The manual pattern in this section works in every language when you need custom bookkeeping. Apply it to the generated event types. -In the manual pattern, hold preview text in a temporary map keyed by `(event_id, index)`, and treat the buffered event as the record. Reconcile the two per model request. +In the manual pattern, hold preview text in a temporary map keyed by `(event_id, index)`, and treat the buffered event as the record. Reconcile the two for each model request. A turn opens with a single `session.status_running` event. On a turn that completes normally, each model request then produces these events, in order: @@ -78,7 +78,7 @@ A turn opens with a single `session.status_running` event. On a turn that comple 2. `event_start` 3. The `event_delta` events 4. The buffered `agent.message` -5. [`span.model_request_end`](https://platform.claude.com/docs/en/managed-agents/reference#event-types) (in the Span events tab) +5. [`span.model_request_end`](https://platform.claude.com/docs/en/managed-agents/reference#event-types) (in the **Span events** tab) On the wire, this is the previewed portion of that sequence, interleaved with the connection's other buffered events: @@ -89,7 +89,7 @@ event_delta {"event_id": "sevt_01abc...", "delta": {"type": "content_delta", agent.message {"id": "sevt_01abc...", "content": [...]} ``` -The `event_delta` line repeats once per text fragment. Process each event as it arrives: +The `event_delta` line repeats once for each text fragment. Process each event as it arrives: 1. On `event_start`, note the announced `id`. The identifiers always line up: `event_start.event.id`, every `event_delta.event_id`, and the buffered `agent.message`'s `id` are the same value. 2. On each `event_delta`, append `delta.content.text` to the entry at `(event_id, delta.index)` and render the running text. The first delta for an `index` creates that entry. @@ -99,7 +99,7 @@ The `event_delta` line repeats once per text fragment. Process each event as it The pattern relies on two guarantees: * Concatenating a preview's deltas in arrival order, keyed by `(event_id, index)`, gives a prefix of `content[index].text` in the buffered event. It is not necessarily the whole text, because deltas might be [shed under load](https://platform.claude.com/docs/en/managed-agents/event-deltas#limitations). -* A connection emits at most one `event_start` per `event_id`, and the buffered event is the last thing that connection delivers for that `id`. +* A connection emits at most one `event_start` for each `event_id`, and the buffered event is the last thing that connection delivers for that `id`. ### SDK accumulator helpers @@ -248,14 +248,9 @@ The following examples opt in to `agent.message` previews and reconcile them wit [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ - new BetaManagedAgentsTextBlock - { - Type = BetaManagedAgentsTextBlockType.Text, - Text = "Write a haiku about event streams.", - }, + new BetaManagedAgentsTextBlock { Text = "Write a haiku about event streams." }, ], }, ], @@ -275,7 +270,7 @@ The following examples opt in to `agent.message` previews and reconcile them wit // so other preview types (including ones added later) are skipped. if (start.Event.TryPickAgentMessage(out var preview)) { - Console.WriteLine($"event_start {preview.Type.Raw()} {preview.ID}"); + Console.WriteLine($"event_start {preview.Type.GetString()} {preview.ID}"); } } else if (streamEvent.TryPickDeltaEvent(out var delta)) @@ -385,7 +380,6 @@ The following examples opt in to `agent.message` previews and reconcile them wit session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Describe the repo in one sentence.") .build()) .build() @@ -398,7 +392,7 @@ The following examples opt in to `agent.message` previews and reconcile them wit case EVENT_START -> { if (event.asEventStart().event().isAgentMessage()) { var preview = event.asEventStart().event().asAgentMessage(); - IO.println("event_start " + preview.type().asString() + " " + preview.id()); + IO.println("event_start " + preview._type() + " " + preview.id()); } } case EVENT_DELTA -> { @@ -570,7 +564,7 @@ A connection previews only the thread it's reading. The session-level stream pre A thread stream's path ends in `/threads/{thread_id}/stream`. `/events/stream` exists only at the session level, so there is no `/threads/{thread_id}/events/stream` endpoint. -`event_start` and `event_delta` have the same shape on a thread stream as on the session-level stream, and the [accumulate and reconcile](https://platform.claude.com/docs/en/managed-agents/event-deltas#accumulate-and-reconcile) pattern applies as written. Run one accumulator instance per stream connection. +`event_start` and `event_delta` have the same shape on a thread stream as on the session-level stream, and the [accumulate and reconcile](https://platform.claude.com/docs/en/managed-agents/event-deltas#accumulate-and-reconcile) pattern applies as written. Run one accumulator instance for each stream connection. ```bash cURL @@ -861,7 +855,7 @@ A thread stream's path ends in `/threads/{thread_id}/stream`. `/events/stream` e ``` -The read loop exits on [`session.thread_status_idle`](https://platform.claude.com/docs/en/managed-agents/reference#event-types), the event emitted when the session thread's turn finishes and the thread goes idle. +The read loop exits on [`session.thread_status_idle`](https://platform.claude.com/docs/en/managed-agents/reference#event-types), the event emitted when the session thread's turn completes and the thread goes idle. ## Limitations @@ -883,7 +877,7 @@ The read loop exits on [`session.thread_status_idle`](https://platform.claude.co - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/events-and-streaming.md b/content/en/managed-agents/events-and-streaming.md index 3f59335570..f861b9e621 100644 --- a/content/en/managed-agents/events-and-streaming.md +++ b/content/en/managed-agents/events-and-streaming.md @@ -1,7 +1,7 @@ --- title: Session event stream url: https://platform.claude.com/docs/en/managed-agents/events-and-streaming -description: Send events, stream responses, and interrupt or redirect your session mid-execution. +description: Send events, stream responses, and interrupt or redirect your session while it runs. featureMetadata: topic: title: Managed Agents @@ -109,15 +109,7 @@ Stream events from the session to receive real-time updates as the agent works. [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, - Content = - [ - new BetaManagedAgentsTextBlock - { - Type = BetaManagedAgentsTextBlockType.Text, - Text = "Summarize the repo README", - }, - ], + Content = [new BetaManagedAgentsTextBlock { Text = "Summarize the repo README" }], }, ], }); @@ -194,7 +186,6 @@ Stream events from the session to receive real-time updates as the agent works. session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Summarize the repo README") .build()) .build() @@ -285,7 +276,7 @@ Stream events from the session to receive real-time updates as the agent works. The session reports errors through the `session.error` event. See [Event types](https://platform.claude.com/docs/en/managed-agents/reference#event-types) for its fields. -The agent's response text arrives as buffered `agent.message` events, each emitted only after the model request that produced it finishes. To render the text while the model is still generating it, see [Preview responses with event deltas](https://platform.claude.com/docs/en/managed-agents/event-deltas). +The agent's response text arrives as buffered `agent.message` events, each emitted only after the model request that produced it completes. To render the text while the model is still generating it, see [Preview responses with event deltas](https://platform.claude.com/docs/en/managed-agents/event-deltas). ### Reconnect without missing events @@ -493,7 +484,7 @@ To reconnect to an existing session without missing events, combine a new stream seen_event_ids = Set.new client.beta.sessions.events.list(session.id).auto_paging_each { seen_event_ids << it.id } - # Tail live events, skipping anything already seen — Set#add? returns nil for duplicates + # Tail live events, skipping anything already seen (Set#add? returns nil for duplicates) stream.each do |event| next unless seen_event_ids.add?(event.id) case event @@ -581,12 +572,10 @@ Send a `user.message` event to start or continue the agent's work: [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "Analyze the performance of the sort function in utils.py", }, ], @@ -618,7 +607,6 @@ Send a `user.message` event to start or continue the agent's work: session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Analyze the performance of the sort function in utils.py") .build()) .build()); @@ -675,7 +663,7 @@ No event you send resumes a session paused at its budget. The work that the budg ## Answer tool calls that pause the session -A session pauses when the agent invokes a [custom tool](https://platform.claude.com/docs/en/managed-agents/tools#custom-tools), and when a tool call needs your confirmation under a [permission policy](https://platform.claude.com/docs/en/managed-agents/permission-policies). Both pauses follow the same sequence: +A session pauses when the agent calls a [custom tool](https://platform.claude.com/docs/en/managed-agents/tools#custom-tools), and when a tool call needs your confirmation under a [permission policy](https://platform.claude.com/docs/en/managed-agents/permission-policies). Both pauses follow the same sequence: 1. The session emits the tool call as an `agent.custom_tool_use`, `agent.tool_use`, or `agent.mcp_tool_use` event. 2. The session pauses with a `session.status_idle` event whose `stop_reason.type` is `requires_action`. The blocking event IDs are in the `stop_reason.event_ids` array. @@ -772,16 +760,8 @@ The following example answers each call as it arrives: [ new BetaManagedAgentsUserCustomToolResultEventParams { - Type = BetaManagedAgentsUserCustomToolResultEventParamsType.UserCustomToolResult, CustomToolUseID = toolUse.ID, - Content = - [ - new BetaManagedAgentsTextBlock - { - Type = BetaManagedAgentsTextBlockType.Text, - Text = result, - }, - ], + Content = [new BetaManagedAgentsTextBlock { Text = result }], }, ], }); @@ -847,7 +827,6 @@ The following example answers each call as it arrives: session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserCustomToolResultEventParams.builder() - .type(BetaManagedAgentsUserCustomToolResultEventParams.Type.USER_CUSTOM_TOOL_RESULT) .customToolUseId(toolUse.id()) .addTextContent(result) .build()) @@ -1001,7 +980,6 @@ The following example approves every pending call: [ new BetaManagedAgentsUserToolConfirmationEventParams { - Type = BetaManagedAgentsUserToolConfirmationEventParamsType.UserToolConfirmation, ToolUseID = eventId, Result = BetaManagedAgentsUserToolConfirmationEventParamsResult.Allow, }, @@ -1064,7 +1042,6 @@ The following example approves every pending call: session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserToolConfirmationEventParams.builder() - .type(BetaManagedAgentsUserToolConfirmationEventParams.Type.USER_TOOL_CONFIRMATION) .toolUseId(toolUseId) .result(BetaManagedAgentsUserToolConfirmationEventParams.Result.ALLOW) .build()) @@ -1207,12 +1184,10 @@ Sessions persist between interactions. To resume a session, send a `user.message [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "Now run the tests against the changes you made earlier.", }, ], @@ -1248,7 +1223,6 @@ Sessions persist between interactions. To resume a session, send a `user.message session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Now run the tests against the changes you made earlier.") .build()) .build()); @@ -1298,7 +1272,7 @@ Conversation history is preserved unless the session is explicitly deleted. When ## Interrupt the agent -Send a `user.interrupt` event to stop the agent mid-execution, then follow up with a `user.message` event to redirect it: +Send a `user.interrupt` event to stop the agent while it runs, then follow up with a `user.message` event to redirect it: ```bash cURL @@ -1381,18 +1355,13 @@ Send a `user.interrupt` event to stop the agent mid-execution, then follow up wi { Events = [ - new BetaManagedAgentsUserInterruptEventParams - { - Type = BetaManagedAgentsUserInterruptEventParamsType.UserInterrupt, - }, + new BetaManagedAgentsUserInterruptEventParams(), new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "Instead, focus on fixing the bug in line 42.", }, ], @@ -1434,11 +1403,8 @@ Send a `user.interrupt` event to stop the agent mid-execution, then follow up wi client.beta().sessions().events().send( session.id(), EventSendParams.builder() - .addEvent(BetaManagedAgentsUserInterruptEventParams.builder() - .type(BetaManagedAgentsUserInterruptEventParams.Type.USER_INTERRUPT) - .build()) + .addEvent(BetaManagedAgentsUserInterruptEventParams.builder().build()) .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Instead, focus on fixing the bug in line 42.") .build()) .build()); @@ -1488,7 +1454,7 @@ The call returns as soon as the events are queued. The interrupt then takes effe 2. The `user.interrupt` event appears on the stream, and the interrupted turn ends with a `session.status_idle` event. 3. The agent starts its next turn with the `user.message` you sent after the interrupt. -The idle event's `stop_reason.type` is `end_turn`, the same value as a turn that finishes on its own. If workflow runs are open, the interrupt ends none of them. A run that's running can keep the session `running`, so the `session.status_idle` event in step 2 might not arrive. See [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). +The idle event's `stop_reason.type` is `end_turn`, the same value as a turn that completes on its own. If workflow runs are open, the interrupt ends none of them. A run that's running can keep the session `running`, so the `session.status_idle` event in step 2 might not arrive. See [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). ## List past events @@ -1631,9 +1597,9 @@ Pass a `types` (curl: `types[]`; cli: `--type`; csharp, go: `Types`) filter to r .build()); for (var event : events.data()) { event.agentToolUse().ifPresent(toolUse -> - IO.println("[" + toolUse.type() + "] " + toolUse.processedAt())); + IO.println("[" + toolUse._type() + "] " + toolUse.processedAt())); event.agentToolResult().ifPresent(toolResult -> - IO.println("[" + toolResult.type() + "] " + toolResult.processedAt())); + IO.println("[" + toolResult._type() + "] " + toolResult.processedAt())); } ``` @@ -1661,7 +1627,7 @@ Pass a `types` (curl: `types[]`; cli: `--type`; csharp, go: `Types`) filter to r On a [supported model](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#supported-models), send a `system.message` event to give the agent privileged system-level context. The context applies to the accompanying turn and all subsequent turns. Use it when the agent needs updated system-level guidance mid-session, for example a different persona, revised constraints, or context fetched at runtime. -The event's `content` (csharp, go: `Content`) accepts 1–1000 text items. The content is appended to the session's system context as a `role: "system"` turn. It doesn't replace the top-level system prompt, which the `system` (csharp, go: `System`; ruby: `system_`) field on the agent definition sets. +The event's `content` (csharp, go: `Content`) accepts 1–1,000 text items. The content is appended to the session's system context as a `role: "system"` turn. It doesn't replace the top-level system prompt, which the `system` (csharp, go: `System`; ruby: `system_`) field on the agent definition sets. ```bash cURL @@ -1732,12 +1698,10 @@ The event's `content` (csharp, go: `Content`) accepts 1–1000 text items. The c [ new BetaManagedAgentsSystemMessageEventParams { - Type = BetaManagedAgentsSystemMessageEventParamsType.SystemMessage, Content = [ new BetaManagedAgentsSystemContentBlock { - Type = BetaManagedAgentsSystemContentBlockType.Text, Text = "The user's current timezone is America/New_York.", }, ], @@ -1767,7 +1731,6 @@ The event's `content` (csharp, go: `Content`) accepts 1–1000 text items. The c session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsSystemMessageEventParams.builder() - .type(BetaManagedAgentsSystemMessageEventParams.Type.SYSTEM_MESSAGE) .addTextContent("The user's current timezone is America/New_York.") .build()) .build()); @@ -1837,7 +1800,7 @@ While the session is idle with a `requires_action` stop reason, a `system.messag - Get notified when major events happen without polling. + Get notified when major events occur without polling. diff --git a/content/en/managed-agents/files.md b/content/en/managed-agents/files.md index 96555b6cf2..4074d832f0 100644 --- a/content/en/managed-agents/files.md +++ b/content/en/managed-agents/files.md @@ -159,7 +159,6 @@ Mount uploaded files into the sandbox by adding them to the `resources` (csharp, [ new BetaManagedAgentsFileResourceParams { - Type = "file", FileID = file.ID, MountPath = "/data.csv", }, @@ -193,7 +192,6 @@ Mount uploaded files into the sandbox by adding them to the `resources` (csharp, .environmentId(environment.id()) .addResource( BetaManagedAgentsFileResourceParams.builder() - .type(BetaManagedAgentsFileResourceParams.Type.FILE) .fileId(file.id()) .mountPath("/data.csv") .build() @@ -208,7 +206,6 @@ Mount uploaded files into the sandbox by adding them to the `resources` (csharp, environmentID: $environment->id, resources: [ BetaManagedAgentsFileResourceParams::with( - type: 'file', fileID: $file->id, mountPath: '/data.csv', ), @@ -307,9 +304,9 @@ Mount multiple files by adding entries to the `resources` (csharp, go: `Resource var resources = new[] { - new BetaManagedAgentsFileResourceParams { Type = BetaManagedAgentsFileResourceParamsType.File, FileID = "file_abc123", MountPath = "/data.csv" }, - new BetaManagedAgentsFileResourceParams { Type = BetaManagedAgentsFileResourceParamsType.File, FileID = "file_def456", MountPath = "/config.json" }, - new BetaManagedAgentsFileResourceParams { Type = BetaManagedAgentsFileResourceParamsType.File, FileID = "file_ghi789", MountPath = "/src/main.py" }, + new BetaManagedAgentsFileResourceParams { FileID = "file_abc123", MountPath = "/data.csv" }, + new BetaManagedAgentsFileResourceParams { FileID = "file_def456", MountPath = "/config.json" }, + new BetaManagedAgentsFileResourceParams { FileID = "file_ghi789", MountPath = "/src/main.py" }, }; ``` @@ -327,11 +324,11 @@ Mount multiple files by adding entries to the `resources` (csharp, go: `Resource var resources = List.of( BetaManagedAgentsFileResourceParams.builder() - .type(BetaManagedAgentsFileResourceParams.Type.FILE).fileId("file_abc123").mountPath("/data.csv").build(), + .fileId("file_abc123").mountPath("/data.csv").build(), BetaManagedAgentsFileResourceParams.builder() - .type(BetaManagedAgentsFileResourceParams.Type.FILE).fileId("file_def456").mountPath("/config.json").build(), + .fileId("file_def456").mountPath("/config.json").build(), BetaManagedAgentsFileResourceParams.builder() - .type(BetaManagedAgentsFileResourceParams.Type.FILE).fileId("file_ghi789").mountPath("/src/main.py").build() + .fileId("file_ghi789").mountPath("/src/main.py").build() ); ``` @@ -352,7 +349,7 @@ Mount multiple files by adding entries to the `resources` (csharp, go: `Resource ``` -A maximum of 500 files is supported per session. +A maximum of 500 files is supported for each session. ## Managing files on a running session @@ -401,7 +398,6 @@ You can add or remove files from a session after creation using the session reso ```csharp C# var resource = await client.Beta.Sessions.Resources.Add(session.ID, new() { - Type = "file", FileID = file.ID, }); Console.WriteLine(resource.ID); // "sesrsc_01ABC..." @@ -426,7 +422,6 @@ You can add or remove files from a session after creation using the session reso ResourceAddParams.builder() .betaManagedAgentsFileResourceParams( BetaManagedAgentsFileResourceParams.builder() - .type(BetaManagedAgentsFileResourceParams.Type.FILE) .fileId(file.id()) .build() ) @@ -438,7 +433,6 @@ You can add or remove files from a session after creation using the session reso ```php PHP $resource = $client->beta->sessions->resources->add( $session->id, - type: 'file', fileID: $file->id, ); echo "{$resource->id}\n"; // "sesrsc_01ABC..." @@ -502,8 +496,7 @@ List all resources on a session with `GET /v1/sessions/{session_id}/resources` ( var listed = await client.Beta.Sessions.Resources.List(session.ID); await foreach (var entry in listed.Paginate()) { - var type = entry.Match(repo => repo.Type, fileRes => fileRes.Type, memoryStore => memoryStore.Type); - Console.WriteLine($"{entry.ID} {type}"); + Console.WriteLine($"{entry.ID} {entry.Type.Raw()}"); } await client.Beta.Sessions.Resources.Delete(resource.ID, new() { SessionID = session.ID }); @@ -531,11 +524,11 @@ List all resources on a session with `GET /v1/sessions/{session_id}/resources` ( switch (entry.type().value()) { case FILE -> { var fileResource = entry.asFile(); - IO.println(fileResource.id() + " " + fileResource.type()); + IO.println(fileResource.id() + " " + fileResource._type()); } case GITHUB_REPOSITORY -> { var repoResource = entry.asGitHubRepository(); - IO.println(repoResource.id() + " " + repoResource.type()); + IO.println(repoResource.id() + " " + repoResource._type()); } } } @@ -722,8 +715,8 @@ The agent can work with any file type, including: Files mounted in the sandbox are read-only copies. The agent can read them but cannot modify the original uploaded file. To work with modified versions, the agent writes to new paths within the sandbox. -* The path you specify is rooted under the session's uploads directory: a `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) of `/data.csv` places the file at `/mnt/session/uploads/data.csv` in the sandbox -* If you omit `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`), the file is placed at `/mnt/session/uploads/` -* Parent directories are created automatically -* Paths should be absolute (starting with `/`) -* Files the agent writes to `/mnt/session/outputs/` become available through the Files API, scoped to the session; see [Listing and downloading session files](https://platform.claude.com/docs/en/managed-agents/files#listing-and-downloading-session-files) +* The path you specify is rooted under the session's uploads directory: a `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) of `/data.csv` places the file at `/mnt/session/uploads/data.csv` in the sandbox. +* If you omit `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`), the file is placed at `/mnt/session/uploads/`. +* Parent directories are created automatically. +* Paths should be absolute (starting with `/`). +* Files the agent writes to `/mnt/session/outputs/` become available through the Files API, scoped to the session; see [Listing and downloading session files](https://platform.claude.com/docs/en/managed-agents/files#listing-and-downloading-session-files). diff --git a/content/en/managed-agents/github.md b/content/en/managed-agents/github.md index d74e6376c4..1f5ecef099 100644 --- a/content/en/managed-agents/github.md +++ b/content/en/managed-agents/github.md @@ -123,19 +123,12 @@ First, create an agent that declares the GitHub MCP server. The agent definition System = "You are a code review assistant with access to GitHub.", McpServers = [ - new() { Type = "url", Name = "github", Url = "https://api.githubcopilot.com/mcp/" }, + new() { Name = "github", Url = "https://api.githubcopilot.com/mcp/" }, ], Tools = [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, - new BetaManagedAgentsMcpToolsetParams - { - Type = "mcp_toolset", - McpServerName = "github", - }, + new BetaManagedAgentsAgentToolset20260401Params(), + new BetaManagedAgentsMcpToolsetParams { McpServerName = "github" }, ], }); ``` @@ -179,15 +172,11 @@ First, create an agent that declares the GitHub MCP server. The agent definition .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You are a code review assistant with access to GitHub.") .addMcpServer(BetaManagedAgentsUrlMcpServerParams.builder() - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .name("github") .url("https://api.githubcopilot.com/mcp/") .build()) - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .addTool(BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("github") .build()) .build()); @@ -314,7 +303,6 @@ Then create a session that mounts the GitHub repository. With a `limited` [envir [ new BetaManagedAgentsGitHubRepositoryResourceParams { - Type = "github_repository", Url = "https://github.com/org/repo", MountPath = "/workspace/repo", AuthorizationToken = "ghp_your_github_token", @@ -348,7 +336,6 @@ Then create a session that mounts the GitHub repository. With a `limited` [envir .agent(agent.id()) .environmentId(environment.id()) .addResource(BetaManagedAgentsGitHubRepositoryResourceParams.builder() - .type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY) .url("https://github.com/org/repo") .mountPath("/workspace/repo") .authorizationToken("ghp_your_github_token") @@ -397,7 +384,7 @@ A `github_repository` resource accepts the following fields: | `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) | Optional. The directory under `/workspace` to clone the repository into. Defaults to `/workspace/`. | | `checkout` (csharp, go: `Checkout`) | Optional. A branch (`{"type": "branch", "name": "main"}`) or commit (`{"type": "commit", "sha": "..."}`) to check out. Defaults to the repository's default branch. | -Mounting a repository also loads any skills stored in its root `.claude/skills` directory. Skills are discovered once per session, from the repository state checked out at session start. See [Load skills from a GitHub repository](https://platform.claude.com/docs/en/managed-agents/skills#load-skills-from-a-github-repository). +Mounting a repository also loads any skills stored in its root `.claude/skills` directory. Skills are discovered once for each session, from the repository state checked out at session start. See [Load skills from a GitHub repository](https://platform.claude.com/docs/en/managed-agents/skills#load-skills-from-a-github-repository). ## Token permissions @@ -502,14 +489,12 @@ Mount multiple repositories by adding entries to the `resources` (csharp, go: `R [ new() { - Type = "github_repository", Url = "https://github.com/org/frontend", MountPath = "/workspace/frontend", AuthorizationToken = "ghp_your_github_token", }, new() { - Type = "github_repository", Url = "https://github.com/org/backend", MountPath = "/workspace/backend", AuthorizationToken = "ghp_your_github_token", @@ -541,13 +526,11 @@ Mount multiple repositories by adding entries to the `resources` (csharp, go: `R ```java Java var resources = List.of( BetaManagedAgentsGitHubRepositoryResourceParams.builder() - .type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY) .url("https://github.com/org/frontend") .mountPath("/workspace/frontend") .authorizationToken("ghp_your_github_token") .build(), BetaManagedAgentsGitHubRepositoryResourceParams.builder() - .type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY) .url("https://github.com/org/backend") .mountPath("/workspace/backend") .authorizationToken("ghp_your_github_token") @@ -806,12 +789,10 @@ With the GitHub MCP server, the agent can create branches, commit changes, and p [ new BetaManagedAgentsUserMessageEventParams { - Type = "user.message", Content = [ new BetaManagedAgentsTextBlock { - Type = "text", Text = "Fix the type error in src/utils.ts, commit it to a new branch, and push it.", }, ], @@ -846,9 +827,7 @@ With the GitHub MCP server, the agent can create branches, commit changes, and p ```java Java client.beta().sessions().events().send(session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addContent(BetaManagedAgentsTextBlock.builder() - .type(BetaManagedAgentsTextBlock.Type.TEXT) .text("Fix the type error in src/utils.ts, commit it to a new branch, and push it.") .build()) .build()) diff --git a/content/en/managed-agents/mcp-connector.md b/content/en/managed-agents/mcp-connector.md index 54ba4842f1..fea88e6635 100644 --- a/content/en/managed-agents/mcp-connector.md +++ b/content/en/managed-agents/mcp-connector.md @@ -115,15 +115,12 @@ Each declared server also needs a matching `mcp_toolset` entry in the `tools` (c Model = BetaManagedAgentsModel.ClaudeOpus5_5, McpServers = [ - new() { Type = "url", Name = "github", Url = "https://api.githubcopilot.com/mcp/" }, + new() { Name = "github", Url = "https://api.githubcopilot.com/mcp/" }, ], Tools = [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, - new BetaManagedAgentsMcpToolsetParams { Type = "mcp_toolset", McpServerName = "github" }, + new BetaManagedAgentsAgentToolset20260401Params(), + new BetaManagedAgentsMcpToolsetParams { McpServerName = "github" }, ], }); ``` @@ -165,19 +162,13 @@ Each declared server also needs a matching `mcp_toolset` entry in the `tools` (c .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addMcpServer( BetaManagedAgentsUrlMcpServerParams.builder() - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .name("github") .url("https://api.githubcopilot.com/mcp/") .build() ) - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .addTool( BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("github") .build() ) @@ -191,17 +182,13 @@ Each declared server also needs a matching `mcp_toolset` entry in the `tools` (c model: 'claude-opus-5-5', mcpServers: [ BetaManagedAgentsURLMCPServerParams::with( - type: 'url', name: 'github', url: 'https://api.githubcopilot.com/mcp/', ), ], tools: [ - BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', - ), + BetaManagedAgentsAgentToolset20260401Params::with(), BetaManagedAgentsMCPToolsetParams::with( - type: 'mcp_toolset', mcpServerName: 'github', ), ], @@ -228,7 +215,7 @@ Each declared server also needs a matching `mcp_toolset` entry in the `tools` (c - The MCP toolset defaults to a permission policy of `always_ask`, which requires user approval before each tool call. See [permission policies](https://platform.claude.com/docs/en/managed-agents/permission-policies) to configure this behavior. + The MCP toolset defaults to a permission policy of `always_ask`, which requires user approval before each tool call. See [Permission policies](https://platform.claude.com/docs/en/managed-agents/permission-policies) to configure this behavior. ### `mcp_servers` field reference @@ -379,10 +366,10 @@ Credentials are matched by URL, so the vault must contain a credential whose `mc Session creation does not validate MCP connectivity or credentials. It does check each declared server's host against the environment's networking: with a `limited` environment, session creation fails with a 400 error when a host is not allowed, as described under [Provide authentication at session creation](https://platform.claude.com/docs/en/managed-agents/mcp-connector#provide-authentication-at-session-creation). If an MCP server is unreachable or rejects the supplied credential, the session still starts and interaction remains possible. A [`session.error`](https://platform.claude.com/docs/en/managed-agents/reference#event-types) event is emitted with the `mcp_server_name` (java, php: `mcpServerName`; csharp: `McpServerName`; go: `MCPServerName`) of the affected server and a `retry_status` (java, php: `retryStatus`; csharp, go: `RetryStatus`): -| Error type | Meaning | -| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `mcp_connection_failed_error` | The MCP server could not be reached (network error, timeout, or non-authentication HTTP failure). | -| `mcp_authentication_failed_error` | Authentication with the MCP server failed: the server rejected the credential from the attached vault, required authentication when no matching credential was configured, or an OAuth token refresh failed. | +| Error type | Meaning | +| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `mcp_connection_failed_error` | The MCP server could not be reached (network error, timeout, or non-authentication HTTP failure). | +| `mcp_authentication_failed_error` | Authentication with the MCP server failed: the server rejected the credential from the attached vault, the server required authentication when no matching credential was configured, or an OAuth token refresh failed. | You can decide whether to block further interaction on this error, trigger a credential rotation, or let the session continue without the affected server's tools. The connection is retried on the next `session.status_idle` to `session.status_running` transition. @@ -394,7 +381,7 @@ You can decide whether to block further interaction on this error, trigger a cre - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/memory.md b/content/en/managed-agents/memory.md index 8dc3eeae60..bc7726b0c0 100644 --- a/content/en/managed-agents/memory.md +++ b/content/en/managed-agents/memory.md @@ -206,7 +206,7 @@ Pre-load a store with reference material before any agent runs: - Individual memories within the store are capped at 100 kB (\~25k tokens). A store holds a maximum of 10,000 memories. Structure memory as many small focused files, not a few large ones. + Individual memories within the store are capped at 100 kB (\~25k tokens). A store holds a maximum of 10,000 memories. Structure memory as many small focused files, not a few large ones. ## Attach a memory store to a session @@ -224,7 +224,7 @@ You can configure `access` (csharp, go: `Access`) as well. It defaults to `read_ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "agent": "'"$agent_id"'", "environment_id": "'"$environment_id"'", "resources": [ @@ -289,7 +289,6 @@ You can configure `access` (csharp, go: `Access`) as well. It defaults to `read_ [ new BetaManagedAgentsMemoryStoreResourceParam { - Type = "memory_store", MemoryStoreID = store.ID, Access = "read_write", Instructions = "User preferences and project context. Check before starting any task.", @@ -325,7 +324,6 @@ You can configure `access` (csharp, go: `Access`) as well. It defaults to `read_ .environmentId(environment.id()) .addResource( BetaManagedAgentsMemoryStoreResourceParam.builder() - .type(BetaManagedAgentsMemoryStoreResourceParam.Type.MEMORY_STORE) .memoryStoreId(store.id()) .access(BetaManagedAgentsMemoryStoreResourceParam.Access.READ_WRITE) .instructions("User preferences and project context. Check before starting any task.") @@ -370,17 +368,17 @@ You can configure `access` (csharp, go: `Access`) as well. It defaults to `read_ Memory stores attach with `read_write` access by default. If the agent processes untrusted input (user-supplied prompts, fetched web content, or third-party tool output), a successful prompt injection could write malicious content into the store. Later sessions then read that content as trusted memory. Use `read_only` for reference material, shared lookups, and any store the agent does not need to modify. -A maximum of **8 memory stores** are supported per session. Attach multiple stores when different parts of memory have different owners or access rules. Common reasons: +A maximum of **8 memory stores** is supported for each session. Attach multiple stores when different parts of memory have different owners or access rules. Common reasons: * **Shared reference material:** one read-only store attached to many sessions (standards, conventions, domain knowledge), kept separate from each session's own read-write store. -* **Mapping to your product's structure:** one store per end user, per team, or per project, while sharing a single agent configuration. +* **Mapping to your product's structure:** one store for each end user, team, or project, while sharing a single agent configuration. * **Different lifecycles:** a store that outlives any single session, or one you want to archive on its own schedule. ### How the agent accesses memory -Each attached store is mounted inside the session's sandbox as a directory under `/mnt/memory/`. The directory name is the store's display name sanitized to a filesystem-safe slug (lowercased; non-alphanumeric runs become a single hyphen), so a store named "Demo Memory" mounts at `/mnt/memory/demo-memory/`. The exact path is returned in the `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) field on the session's memory-store resource; read it from there rather than constructing it yourself. The agent reads and writes the store with the standard [agent toolset](https://platform.claude.com/docs/en/managed-agents/tools). Writes under the mount path are persisted back to the store and stay in sync across sessions that share it; writes to any other path under `/mnt/memory/` fail, because the sandbox mounts that parent directory read-only. A short description of each mount (display name, mount path, access mode, store `description` (csharp, go: `Description`), and any `instructions` (csharp, go: `Instructions`)) is automatically added to the system prompt. +Each attached store is mounted inside the session's sandbox as a directory under `/mnt/memory/`. The directory name is the store's display name sanitized to a filesystem-safe slug (lowercased, with each non-alphanumeric run replaced by a single hyphen), so a store named "Demo Memory" mounts at `/mnt/memory/demo-memory/`. The exact path is returned in the `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) field on the session's memory-store resource; read it from there rather than constructing it yourself. The agent reads and writes the store with the standard [agent toolset](https://platform.claude.com/docs/en/managed-agents/tools). Writes under the mount path are persisted back to the store and stay in sync across sessions that share it; writes to any other path under `/mnt/memory/` fail, because the sandbox mounts that parent directory read-only. A short description of each mount (display name, mount path, access mode, store `description` (csharp, go: `Description`), and any `instructions` (csharp, go: `Instructions`)) is automatically added to the system prompt. -`access` (csharp, go: `Access`) is enforced at the filesystem level: a `read_only` mount rejects writes, while writes to a `read_write` mount produce [memory versions](https://platform.claude.com/docs/en/managed-agents/memory#audit-memory-changes) attributed to the session. +`access` (csharp, go: `Access`) is enforced at the filesystem level: a `read_only` mount rejects writes, whereas writes to a `read_write` mount produce [memory versions](https://platform.claude.com/docs/en/managed-agents/memory#audit-memory-changes) attributed to the session. On [self-hosted sandboxes](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory), each store's directory is a local copy that the worker manages rather than a live mount. The worker reconciles each copy with its store after tool calls, at most once per sync interval (15 seconds by default), and once more when the session ends. The agent's `write` and `edit` tools change only the local copy; the worker uploads those changes at its next sync, so another session running on a self-hosted sandbox sees a change only after both workers have synced. Paths under `/mnt/memory/` outside the store directories are not scratch space there: the worker's file tools refuse to write to them, and anything a shell command writes there is never synced to a store. @@ -399,7 +397,7 @@ Memory stores can be managed directly through the API. Use this for building rev List the memories in a store. Results are returned in a stable, server-defined order. * `path_prefix` scopes the list to one directory. It must end with `/` and matches whole path segments, so `path_prefix=/notes/` returns `/notes/todo.md` but not `/notes-archive/todo.md`. -* `depth` controls how deep the listing goes below `path_prefix`: omit it (or pass `0`) to list the whole subtree, or pass `1` to list only the immediate children. Other values return a `400` error. +* `depth` controls how deep the list goes below `path_prefix`: omit it (or pass `0`) to list the whole subtree, or pass `1` to list only the immediate children. Other values return a `400` error. ```bash cURL @@ -491,7 +489,7 @@ List the memories in a store. Results are returned in a stable, server-defined o ``` -See the [List memories reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/list) for full parameters and response schema. +See the [List memories](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/list) reference for full parameters and response schema. ### Read a memory @@ -566,11 +564,11 @@ Fetching an individual memory returns the full content. ``` -See the [Retrieve a memory reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/retrieve) for full parameters and response schema. +See the [Retrieve a memory](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/retrieve) reference for full parameters and response schema. ### Create a memory -`POST /v1/memory_stores/{memory_store_id}/memories` (python, ruby: `client.beta.memory_stores.memories.create()`; typescript: `client.beta.memoryStores.memories.create()`; go: `client.Beta.MemoryStores.Memories.New()`; java: `client.beta().memoryStores().memories().create()`; csharp: `client.Beta.MemoryStores.Memories.Create()`; php: `$client->beta->memoryStores->memories->create()`; cli: `ant beta:memory-stores:memories create`) creates a memory at a given `path` (csharp, go: `Path`). Create does not overwrite; to change an existing memory, [update it](https://platform.claude.com/docs/en/managed-agents/memory#update-a-memory) with `POST /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.update()`; typescript: `client.beta.memoryStores.memories.update()`; go, csharp: `client.Beta.MemoryStores.Memories.Update()`; java: `client.beta().memoryStores().memories().update()`; php: `$client->beta->memoryStores->memories->update()`; cli: `ant beta:memory-stores:memories update`). +`POST /v1/memory_stores/{memory_store_id}/memories` (python, ruby: `client.beta.memory_stores.memories.create()`; typescript: `client.beta.memoryStores.memories.create()`; go: `client.Beta.MemoryStores.Memories.New()`; java: `client.beta().memoryStores().memories().create()`; csharp: `client.Beta.MemoryStores.Memories.Create()`; php: `$client->beta->memoryStores->memories->create()`; cli: `ant beta:memory-stores:memories create`) creates a memory at a given `path` (csharp, go: `Path`). Create does not overwrite; to [update an existing memory](https://platform.claude.com/docs/en/managed-agents/memory#update-a-memory), use `POST /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.update()`; typescript: `client.beta.memoryStores.memories.update()`; go, csharp: `client.Beta.MemoryStores.Memories.Update()`; java: `client.beta().memoryStores().memories().update()`; php: `$client->beta->memoryStores->memories->update()`; cli: `ant beta:memory-stores:memories update`). ```bash cURL @@ -649,7 +647,7 @@ See the [Retrieve a memory reference](https://platform.claude.com/docs/en/api/be ``` -See the [Create a memory reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/create) for full parameters and response schema. +See the [Create a memory](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/create) reference for full parameters and response schema. ### Update a memory @@ -732,11 +730,11 @@ See the [Create a memory reference](https://platform.claude.com/docs/en/api/beta ``` -See the [Update a memory reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/update) for full parameters and response schema. +See the [Update a memory](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/update) reference for full parameters and response schema. #### Safe content edits (optimistic concurrency) -To avoid clobbering a concurrent write, pass a `content_sha256` precondition. The update only applies if the stored content hash still matches the one you read; on mismatch, re-read the memory and retry against the fresh state. +To avoid overwriting a concurrent write, pass a `content_sha256` precondition. The update only applies if the stored content hash still matches the one you read; on mismatch, re-read the memory and retry against the fresh state. ```bash cURL @@ -781,11 +779,7 @@ To avoid clobbering a concurrent write, pass a `content_sha256` precondition. Th { MemoryStoreID = store.ID, Content = "CORRECTED: Always use 2-space indentation.", - Precondition = new BetaManagedAgentsPrecondition - { - Type = "content_sha256", - ContentSha256 = mem.ContentSha256, - }, + Precondition = new BetaManagedAgentsPrecondition { ContentSha256 = mem.ContentSha256 }, }); ``` @@ -811,7 +805,6 @@ To avoid clobbering a concurrent write, pass a `content_sha256` precondition. Th .content("CORRECTED: Always use 2-space indentation.") .precondition( BetaManagedAgentsPrecondition.builder() - .type(BetaManagedAgentsPrecondition.Type.CONTENT_SHA256) .contentSha256(mem.contentSha256()) .build() ) @@ -902,13 +895,13 @@ To avoid clobbering a concurrent write, pass a `content_sha256` precondition. Th ``` -See the [Delete a memory reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/delete) for full parameters and response schema. +See the [Delete a memory](https://platform.claude.com/docs/en/api/beta/memory_stores/memories/delete) reference for full parameters and response schema. ## Audit memory changes Every mutation to a memory creates an immutable **memory version** (`memver_...`). Use the version endpoints to audit who changed what and when, to inspect or restore a prior snapshot, and to scrub sensitive content out of history with redact. -Versions belong to the store (not the individual memory) and are not deleted when the memory itself is deleted, so the audit trail also covers deleted memories, subject to the retention described below. Versions are retained for 30 days after they are written; however, the recent versions of a live memory are always kept regardless of age, so memories that change infrequently might retain history beyond 30 days. The live `GET /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.retrieve()`; typescript: `client.beta.memoryStores.memories.retrieve()`; go: `client.Beta.MemoryStores.Memories.Get()`; java: `client.beta().memoryStores().memories().retrieve()`; csharp: `client.Beta.MemoryStores.Memories.Retrieve()`; php: `$client->beta->memoryStores->memories->retrieve()`; cli: `ant beta:memory-stores:memories retrieve`) call always returns the latest version; the version endpoints give you the retained history. +Versions belong to the store (not the individual memory) and are not deleted when the memory itself is deleted, so the audit trail also covers deleted memories, subject to the retention described later. Versions are retained for 30 days after they are written; however, the recent versions of a live memory are always kept regardless of age, so memories that change infrequently might retain history beyond 30 days. The live `GET /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.retrieve()`; typescript: `client.beta.memoryStores.memories.retrieve()`; go: `client.Beta.MemoryStores.Memories.Get()`; java: `client.beta().memoryStores().memories().retrieve()`; csharp: `client.Beta.MemoryStores.Memories.Retrieve()`; php: `$client->beta->memoryStores->memories->retrieve()`; cli: `ant beta:memory-stores:memories retrieve`) call always returns the latest version; the version endpoints give you the retained history. There is no dedicated restore endpoint; to roll back, retrieve the version you want and write its `content` (csharp, go: `Content`) back with `POST /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.update()`; typescript: `client.beta.memoryStores.memories.update()`; go, csharp: `client.Beta.MemoryStores.Memories.Update()`; java: `client.beta().memoryStores().memories().update()`; php: `$client->beta->memoryStores->memories->update()`; cli: `ant beta:memory-stores:memories update`) (or `POST /v1/memory_stores/{memory_store_id}/memories` (python, ruby: `client.beta.memory_stores.memories.create()`; typescript: `client.beta.memoryStores.memories.create()`; go: `client.Beta.MemoryStores.Memories.New()`; java: `client.beta().memoryStores().memories().create()`; csharp: `client.Beta.MemoryStores.Memories.Create()`; php: `$client->beta->memoryStores->memories->create()`; cli: `ant beta:memory-stores:memories create`) if the parent memory has been deleted, provided the version you want is still retained). @@ -948,8 +941,8 @@ List version history for a store, newest first. The example filters to a single const versions = await client.beta.memoryStores.memoryVersions.list(store.id, { memory_id: mem.id }); - for await (const v of versions) { - console.log(`${v.id}: ${v.operation}`); + for await (const memoryVersion of versions) { + console.log(`${memoryVersion.id}: ${memoryVersion.operation}`); } const versionId = versions.data[1].id; @@ -1028,7 +1021,7 @@ List version history for a store, newest first. The example filters to a single ``` -See the [List memory versions reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/list) for full parameters and response schema. +See the [List memory versions](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/list) reference for full parameters and response schema. ### Retrieve a version @@ -1106,11 +1099,11 @@ Fetching an individual version returns the same fields as the list response plus ``` -See the [Retrieve a memory version reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/retrieve) for full parameters and response schema. +See the [Retrieve a memory version](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/retrieve) reference for full parameters and response schema. ### Redact a version -Redact scrubs content out of a historical version while preserving the audit trail (who did what, when). Use it for compliance workflows such as removing leaked secrets, PII, or user deletion requests. +Redact scrubs content out of a historical version while preserving the audit trail (who did what, when). Use it for compliance workflows such as removing leaked secrets or PII, or fulfilling user deletion requests. A version that is the current head of a live memory cannot be redacted. Write a new version first (or delete the memory), then redact the old one. @@ -1181,7 +1174,7 @@ A version that is the current head of a live memory cannot be redacted. Write a ``` -See the [Redact a memory version reference](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/redact) for full parameters and response schema. +See the [Redact a memory version](https://platform.claude.com/docs/en/api/beta/memory_stores/memory_versions/redact) reference for full parameters and response schema. ## Manage memory stores @@ -1209,8 +1202,8 @@ List stores in the workspace. Archived stores are excluded by default; set `incl ``` ```typescript TypeScript - for await (const s of client.beta.memoryStores.list({ include_archived: true })) { - console.log(s.id, s.name, s.archived_at); + for await (const memoryStore of client.beta.memoryStores.list({ include_archived: true })) { + console.log(memoryStore.id, memoryStore.name, memoryStore.archived_at); } ``` @@ -1258,7 +1251,7 @@ List stores in the workspace. Archived stores are excluded by default; set `incl ``` -See the [List memory stores reference](https://platform.claude.com/docs/en/api/beta/memory_stores/list) for full parameters and response schema. +See the [List memory stores](https://platform.claude.com/docs/en/api/beta/memory_stores/list) reference for full parameters and response schema. ### Archive a store @@ -1308,15 +1301,15 @@ Archiving makes a store read-only and prevents it from being attached to new ses ``` -See the [Archive a memory store reference](https://platform.claude.com/docs/en/api/beta/memory_stores/archive) for full parameters and response schema. +See the [Archive a memory store](https://platform.claude.com/docs/en/api/beta/memory_stores/archive) reference for full parameters and response schema. -To [permanently remove a store](https://platform.claude.com/docs/en/api/beta/memory_stores/delete) along with all of its memories and versions, call `DELETE /v1/memory_stores/{memory_store_id}` (python, ruby: `client.beta.memory_stores.delete()`; typescript: `client.beta.memoryStores.delete()`; go, csharp: `client.Beta.MemoryStores.Delete()`; java: `client.beta().memoryStores().delete()`; php: `$client->beta->memoryStores->delete()`; cli: `ant beta:memory-stores delete`). +To [permanently delete a store](https://platform.claude.com/docs/en/api/beta/memory_stores/delete) along with all of its memories and versions, call `DELETE /v1/memory_stores/{memory_store_id}` (python, ruby: `client.beta.memory_stores.delete()`; typescript: `client.beta.memoryStores.delete()`; go, csharp: `client.Beta.MemoryStores.Delete()`; java: `client.beta().memoryStores().delete()`; php: `$client->beta->memoryStores->delete()`; cli: `ant beta:memory-stores delete`). ## Best practices for memory management When a store reaches its 10,000-memory limit, writes to new memories fail: both direct `POST /v1/memory_stores/{memory_store_id}/memories` (python, ruby: `client.beta.memory_stores.memories.create()`; typescript: `client.beta.memoryStores.memories.create()`; go: `client.Beta.MemoryStores.Memories.New()`; java: `client.beta().memoryStores().memories().create()`; csharp: `client.Beta.MemoryStores.Memories.Create()`; php: `$client->beta->memoryStores->memories->create()`; cli: `ant beta:memory-stores:memories create`) calls and the agent's file writes to unmapped paths. Existing memories remain readable and editable. The following practices help you stay well under the limit and recover gracefully if you reach it. -* **Use focused stores.** Rather than one large general-purpose store, use smaller purpose-built stores: one per user, one for shared domain knowledge, and one for project-specific context. Each store has its own 10,000-memory limit, so keeping stores scoped reduces the chance any single one fills up. +* **Use focused stores.** Rather than one large general-purpose store, use smaller purpose-built stores: one for each user, one for shared domain knowledge, and one for project-specific context. Each store has its own 10,000-memory limit, so keeping stores scoped reduces the chance any single one fills up. * **Condense or prune before the store fills up.** Delete stale or redundant memories with `DELETE /v1/memory_stores/{memory_store_id}/memories/{memory_id}` (python, ruby: `client.beta.memory_stores.memories.delete()`; typescript: `client.beta.memoryStores.memories.delete()`; go, csharp: `client.Beta.MemoryStores.Memories.Delete()`; java: `client.beta().memoryStores().memories().delete()`; php: `$client->beta->memoryStores->memories->delete()`; cli: `ant beta:memory-stores:memories delete`). You can also run a [dreaming session](https://platform.claude.com/docs/en/managed-agents/dreams), which consolidates fragmented content into a separate new output store rather than modifying the original. Switch your sessions over to that output store, then archive or delete the original. diff --git a/content/en/managed-agents/migration.md b/content/en/managed-agents/migration.md index ceaa5c4456..7d4c4e830f 100644 --- a/content/en/managed-agents/migration.md +++ b/content/en/managed-agents/migration.md @@ -20,7 +20,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes | Before | After | | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | -| You maintain the conversation history array and pass it back on every turn. | The session stores history server-side. Send events, receive events. | +| You maintain the conversation history array and pass it back on every turn. | The session stores history server-side. You send events and receive events. | | You iterate `tool_use` content blocks, run each tool, and loop back with `tool_result` messages. | Pre-built tools run inside the sandbox automatically. You only handle custom tools through `agent.custom_tool_use` events. | | You provision your own sandbox for running agent-generated code. | The session sandbox handles code execution, file operations, and bash. | | You decide when the loop is done. | The session emits `session.status_idle` when the agent has nothing more to do. | @@ -91,7 +91,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes ``` ```csharp C# - List messages = [new() { Role = Role.User, Content = task }]; + List messages = [new UserMessageParam { Content = task }]; while (true) { var response = await client.Messages.Create(new() @@ -101,9 +101,8 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes Messages = messages, Tools = tools, }); - messages.Add(new() + messages.Add(new AssistantMessageParam { - Role = Role.Assistant, Content = new([.. response.Content.Select(block => new ContentBlockParam(block.Json))]), }); if (response.StopReason == StopReason.EndTurn) @@ -115,9 +114,8 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes if (block.Value is ToolUseBlock toolUse) { var result = ExecuteTool(toolUse.Name, toolUse.Input); - messages.Add(new() + messages.Add(new UserMessageParam { - Role = Role.User, Content = new([new ToolResultBlockParam { ToolUseID = toolUse.ID, Content = result }]), }); } @@ -156,10 +154,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes ```java Java var messages = new ArrayList(); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .content(task) - .build()); + messages.add(MessageParam.ofUser(task)); while (true) { var response = client.messages().create(MessageCreateParams.builder() .model(Model.CLAUDE_OPUS_5_5) @@ -174,14 +169,11 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes for (var block : response.content()) { block.toolUse().ifPresent(toolUse -> { var result = executeTool(toolUse.name(), toolUse._input()); - messages.add(MessageParam.builder() - .role(MessageParam.Role.USER) - .contentOfBlockParams(List.of( - ContentBlockParam.ofToolResult(ToolResultBlockParam.builder() - .toolUseId(toolUse.id()) - .content(result) - .build()))) - .build()); + messages.add(MessageParam.ofUserOfContentBlockParams(List.of( + ContentBlockParam.ofToolResult(ToolResultBlockParam.builder() + .toolUseId(toolUse.id()) + .content(result) + .build())))); }); } } @@ -315,20 +307,13 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes { Name = "Task Runner", Model = BetaManagedAgentsModel.ClaudeOpus5_5, - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, - ], + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], }); var session = await client.Beta.Sessions.Create(new() { Agent = new BetaManagedAgentsAgentParams { - Type = "agent", ID = agent.ID, Version = agent.Version, }, @@ -343,8 +328,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes [ new BetaManagedAgentsUserMessageEventParams { - Type = "user.message", - Content = [new BetaManagedAgentsTextBlock { Type = "text", Text = task }], + Content = [new BetaManagedAgentsTextBlock { Text = task }], }, ], }); @@ -424,11 +408,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes AgentCreateParams.builder() .name("Task Runner") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .build() ); @@ -436,7 +416,6 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes SessionCreateParams.builder() .agent( BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(agent.id()) .version(agent.version()) .build() @@ -451,7 +430,6 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes EventSendParams.builder() .addEvent( BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent(task) .build() ) @@ -468,15 +446,12 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes name: 'Task Runner', model: 'claude-opus-5-5', tools: [ - BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', - ), + BetaManagedAgentsAgentToolset20260401Params::with(), ], ); $session = $client->beta->sessions->create( agent: BetaManagedAgentsAgentParams::with( - type: 'agent', id: $agent->id, version: $agent->version, ), @@ -534,7 +509,7 @@ If you built an agent by calling `client.messages.create()` (csharp: `client.Mes ## From the Claude Agent SDK -If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/overview), you're already working with agents, tools, and sessions as concepts. The difference is where they run: the SDK runs in a process you operate, while Managed Agents runs in Anthropic's infrastructure. Most of the migration is mapping SDK configuration objects to their API-side equivalents. +If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/overview), you're already working with agents, tools, and sessions as concepts. The difference is where they run: the SDK runs in a process you operate, whereas Managed Agents runs in Anthropic's infrastructure. Most of the migration is mapping SDK configuration objects to their API-side equivalents. ### What changes @@ -788,7 +763,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s [ new BetaManagedAgentsCustomToolParams { - Type = "custom", Name = "get_weather", Description = "Get the current weather for a city.", InputSchema = new() @@ -815,7 +789,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s { Agent = new BetaManagedAgentsAgentParams { - Type = "agent", ID = agent.ID, Version = agent.Version, }, @@ -832,8 +805,7 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s [ new BetaManagedAgentsUserMessageEventParams { - Type = "user.message", - Content = [new BetaManagedAgentsTextBlock { Type = "text", Text = "What's the weather in Tokyo?" }], + Content = [new BetaManagedAgentsTextBlock { Text = "What's the weather in Tokyo?" }], }, ], }); @@ -855,16 +827,8 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s [ new BetaManagedAgentsUserCustomToolResultEventParams { - Type = "user.custom_tool_result", CustomToolUseID = toolUse.ID, - Content = - [ - new BetaManagedAgentsTextBlock - { - Type = "text", - Text = result, - }, - ], + Content = [new BetaManagedAgentsTextBlock { Text = result }], }, ], }); @@ -1024,7 +988,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You are a concise weather assistant.") .addTool(BetaManagedAgentsCustomToolParams.builder() - .type(BetaManagedAgentsCustomToolParams.Type.CUSTOM) .name("get_weather") .description("Get the current weather for a city.") .inputSchema(BetaManagedAgentsCustomToolInputSchema.builder() @@ -1046,7 +1009,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s var session = client.beta().sessions().create(SessionCreateParams.builder() .agent(BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(agent.id()) .version(agent.version()) .build()) @@ -1060,7 +1022,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("What's the weather in Tokyo?") .build()) .build()); @@ -1081,7 +1042,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserCustomToolResultEventParams.builder() - .type(BetaManagedAgentsUserCustomToolResultEventParams.Type.USER_CUSTOM_TOOL_RESULT) .customToolUseId(toolUse.id()) .addTextContent(result) .build()) @@ -1116,7 +1076,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s system: 'You are a concise weather assistant.', tools: [ BetaManagedAgentsCustomToolParams::with( - type: 'custom', name: 'get_weather', description: 'Get the current weather for a city.', inputSchema: BetaManagedAgentsCustomToolInputSchema::with( @@ -1136,7 +1095,6 @@ If you built with the [Claude Agent SDK](https://code.claude.com/docs/en/agent-s $session = $client->beta->sessions->create( agent: BetaManagedAgentsAgentParams::with( - type: 'agent', id: $agent->id, version: $agent->version, ), @@ -1283,7 +1241,7 @@ The tradeoff for Anthropic running the agent loop is that a few things the SDK h ## Migrating between model versions -When a new Claude model is released, migrating a Claude Managed Agents integration is typically a one-field change: update `model` (csharp, go: `Model`) on your [agent definition](https://platform.claude.com/docs/en/managed-agents/agent-setup) and the change takes effect on the next session you create. +When a new Claude model is released, migrating a Claude Managed Agents integration is typically a one-field change: update `model` (csharp, go: `Model`) on your [agent definition](https://platform.claude.com/docs/en/managed-agents/agent-setup), and the change takes effect on the next session you create. ```bash cURL diff --git a/content/en/managed-agents/multiagent-orchestration.md b/content/en/managed-agents/multiagent-orchestration.md index 064e97c0f8..5b6176d44c 100644 --- a/content/en/managed-agents/multiagent-orchestration.md +++ b/content/en/managed-agents/multiagent-orchestration.md @@ -22,11 +22,11 @@ You decide which of these the agent can use, and the agent determines when to us With subagents, the agent itself determines what happens next. A [subagent's thread](https://platform.claude.com/docs/en/managed-agents/session-threads) stays available until you archive it, so the agent can send it follow-up messages. With dynamic workflows, Claude writes a program to orchestrate agents without Claude's direct involvement. Context and results are passed programmatically from one agent to another, freeing up the main session thread to communicate with the user and check in on one or several running workflows to report on progress. The agent can't send follow-up messages to a run's threads, and the server archives each one by the end of its run. -| Approach | What happens | Use it when | Consider | -| -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Subagents](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#delegate-to-subagents) | The agent delegates tasks to its subagents. Each subagent works in its own [session thread](https://platform.claude.com/docs/en/managed-agents/session-threads), which you can list and stream. | The agent should follow up with a subagent after it reports, or it needs specialists that you list, with their own system prompts and tools. | Delegation is one level deep, and a session can have at most 25 child threads at a time, idle ones included. Advisor threads and a workflow run's threads don't count. | -| [Dynamic workflows](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#dynamic-workflows) | The agent writes a workflow: a program that runs many agents in phases and combines their results. The server runs it in the background as one workflow run, which you can follow. The workflow defines the agents or picks them from a list you give. | Most work that needs more than one agent: work with many pieces, parallel work, or a long task that should finish sooner. Examples are audits, migrations, deep research, and cross-checking. | Every agent in a run uses tokens, so set a [session budget](https://platform.claude.com/docs/en/managed-agents/budgets) to cap the session's spend, runs included. Tell the agent in its system prompt when to use a run. You follow the run by its phases and can read each of its threads. | -| [Give the session an advisor](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#give-the-session-an-advisor) | The session's [primary thread](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#how-it-works) consults an advisor model mid-turn for guidance, such as planning an approach or reviewing work, and keeps doing the work itself. | One agent should do the work, with an advisor model's judgment at key moments such as planning or a final review. | Only the primary thread can consult the advisor, and consultations are billed at the advisor model's rates. | +| Approach | What happens | Use it when | Consider | +| -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Delegate to subagents](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#delegate-to-subagents) | The agent delegates tasks to its subagents. Each subagent works in its own [session thread](https://platform.claude.com/docs/en/managed-agents/session-threads), which you can list and stream. | The agent should follow up with a subagent after it reports, or it needs specialists that you list, with their own system prompts and tools. | Delegation is one level deep, and a session can have at most 25 child threads at a time, idle ones included. Advisor threads and a workflow run's threads don't count. | +| [Dynamic workflows](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#dynamic-workflows) | The agent writes a workflow: a program that runs many agents in phases and combines their results. The server runs it in the background as one workflow run, which you can follow. The workflow defines the agents or picks them from a list you give. | Most work that needs more than one agent: work with many pieces, parallel work, or a long task that should complete sooner. Examples are audits, migrations, deep research, and cross-checking. | Every agent in a run uses tokens, so set a [session budget](https://platform.claude.com/docs/en/managed-agents/budgets) to cap the session's spend, runs included. Tell the agent in its system prompt when to use a run. You follow the run by its phases and can read each of its threads. | +| [Give the session an advisor](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#give-the-session-an-advisor) | The session's [primary thread](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#how-it-works) consults an advisor model mid-turn for guidance, such as planning an approach or reviewing work, and keeps doing the work itself. | One agent should do the work, with an advisor model's judgment at key moments such as planning or a final review. | Only the primary thread can consult the advisor, and consultations are billed at the advisor model's rates. | You set these up in the `multiagent` block of the agent's definition, which has a `type`. With the `multiagent_20261001` type, an agent can use all three together, and you can turn each one on or off. By default, `subagents` and `workflows` are both enabled. `subagents` and `workflows` each have `inline_agents` enabled, the setting for [agents that the agent or a workflow defines itself](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#predefined-and-inline-agents): @@ -89,7 +89,7 @@ The following agent allows only the agents that it lists. It can delegate to one ### What to delegate -Multiagent coordination is best suited for complex tasks that either require work across a variety of surfaces, or where multiple well-scoped tasks contribute to an overall goal. +Multiagent coordination is best suited for complex tasks that either require work across a variety of surfaces or consist of multiple well-scoped tasks that contribute to an overall goal. Patterns that work well: @@ -234,13 +234,7 @@ When [defining your agent](https://platform.claude.com/docs/en/managed-agents/ag Name = "Engineering Lead", Model = BetaManagedAgentsModel.ClaudeOpus5_5, System = "You coordinate engineering work. Delegate code review to the reviewer agent and test writing to the test agent.", - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, - }, - ], + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], Multiagent = new BetaManagedAgentsMultiagent20261001Params { Subagents = new BetaManagedAgentsMultiagentSubagentsEnabledParams @@ -285,19 +279,13 @@ When [defining your agent](https://platform.claude.com/docs/en/managed-agents/ag .name("Engineering Lead") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You coordinate engineering work. Delegate code review to the reviewer agent and test writing to the test agent.") - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .multiagent(BetaManagedAgentsMultiagent20261001Params.builder() .subagents(BetaManagedAgentsMultiagentSubagentsEnabledParams.builder() .addPredefinedAgent(BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(reviewerAgent.id()) .build()) .addPredefinedAgent(BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(testWriterAgent.id()) .build()) .build()) @@ -359,7 +347,7 @@ The following rules apply to the agents you list in the `predefined_agents` (jav * **Pinning:** The agent's configuration, including the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`), is snapshotted when the agent is created or updated. Referenced agents stay pinned to the versions resolved then and don't pick up later updates to their definitions. An update that doesn't send the list keeps the versions that are already pinned. To delegate to a newer version of a referenced agent, [update the agent](https://platform.claude.com/docs/en/managed-agents/agent-setup#update-an-agent) so the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) references that version. * **One level:** The agent can delegate to only one level of agents. Referencing another agent that has `multiagent` (csharp, go: `Multiagent`) set fails the create or update request with a 400 validation error. -* **Up to 20 agents:** The `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) can list up to 20 unique agents. The limit is per list: the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`) can also list up to 20. The agent can call multiple copies of each subagent, within the session's [thread limit](https://platform.claude.com/docs/en/managed-agents/session-threads). +* **Up to 20 agents:** The `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) can list up to 20 unique agents. The limit is for each list: the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`) can also list up to 20. The agent can call multiple copies of each subagent, within the session's [thread limit](https://platform.claude.com/docs/en/managed-agents/session-threads). * **Inference geography:** The agent and every agent that you list, in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) or of `workflows` (csharp, go: `Workflows`), must pin the same [inference geography](https://platform.claude.com/docs/en/manage-claude/data-residency) (`inference_geo` (java, php: `inferenceGeo`; csharp, go: `InferenceGeo`) in the `model` (csharp, go: `Model`) of the [agent definition](https://platform.claude.com/docs/en/managed-agents/agent-setup)), or none of them can pin one. A mismatch in either list is rejected with a 400 validation error. That check runs both when the agent is saved and when a [session-create override](https://platform.claude.com/docs/en/managed-agents/sessions#override-agent-configuration-for-a-session) changes any of the pins. ### Create the session @@ -583,44 +571,23 @@ Create the researcher, which declares the GitHub MCP server, and the agent that [ new() { - Type = BetaManagedAgentsUrlMcpServerParamsType.Url, Name = "github", Url = "https://api.githubcopilot.com/mcp/", }, ], - Tools = - [ - new BetaManagedAgentsMcpToolsetParams - { - Type = BetaManagedAgentsMcpToolsetParamsType.McpToolset, - McpServerName = "github", - }, - ], + Tools = [new BetaManagedAgentsMcpToolsetParams { McpServerName = "github" }], }); var leadAgent = await client.Beta.Agents.Create(new() { Name = "lead", Model = BetaManagedAgentsModel.ClaudeOpus5_5, - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, - }, - ], + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], Multiagent = new BetaManagedAgentsMultiagent20261001Params { Subagents = new BetaManagedAgentsMultiagentSubagentsEnabledParams { - PredefinedAgents = - [ - new BetaManagedAgentsAgentParams - { - Type = BetaManagedAgentsAgentParamsType.Agent, - ID = researchAgent.ID, - }, - ], + PredefinedAgents = [new BetaManagedAgentsAgentParams { ID = researchAgent.ID }], }, }, }); @@ -681,11 +648,9 @@ Create the researcher, which declares the GitHub MCP server, and the agent that .model(BetaManagedAgentsModel.CLAUDE_HAIKU_5_5) .addMcpServer(BetaManagedAgentsUrlMcpServerParams.builder() .name("github") - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .url("https://api.githubcopilot.com/mcp/") .build()) .addTool(BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("github") .build()) .build() @@ -695,13 +660,10 @@ Create the researcher, which declares the GitHub MCP server, and the agent that AgentCreateParams.builder() .name("lead") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .multiagent(BetaManagedAgentsMultiagent20261001Params.builder() .subagents(BetaManagedAgentsMultiagentSubagentsEnabledParams.builder() .addPredefinedAgent(BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(researcher.id()) .build()) .build()) @@ -876,7 +838,7 @@ Each agent's session thread has its own event stream. To list, interrupt, or arc ## Dynamic workflows -With dynamic workflows, an agent can take on work with many pieces, such as reviewing hundreds of documents or cross-checking many sources. The agent writes a **workflow**: a program that runs many agents in phases and combines what they return. The server runs it in the background as a **workflow run**, while the agent keeps working or ends its turn. You turn dynamic workflows on or off with the `workflows` (csharp, go: `Workflows`) setting in the agent's `multiagent` (csharp, go: `Multiagent`) block. A run's agents can work at the same time, so a long task can finish sooner than if one agent did each piece in turn. +With dynamic workflows, an agent can take on work with many pieces, such as reviewing hundreds of documents or cross-checking many sources. The agent writes a **workflow:** a program that runs many agents in phases and combines what they return. The server runs it in the background as a **workflow run**, while the agent keeps working or ends its turn. You turn dynamic workflows on or off with the `workflows` (csharp, go: `Workflows`) setting in the agent's `multiagent` (csharp, go: `Multiagent`) block. A run's agents can work at the same time, so a long task can complete sooner than if one agent did each piece in turn. * **How a run starts:** You describe the work in a `user.message`. From that, the agent determines whether and when to start a run, so there's no additional API call. Instead, you influence the agent's determination by describing when to use a run in `user.message` or in the agent's system prompt. (Permission policies apply to the tools that a run's agents call, not to starting the run.) * **Which agents it uses:** [Inline agents](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#predefined-and-inline-agents) that the workflow defines, predefined agents that you list in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`), or both. If you list none, the workflow defines them all. An inline agent uses the model of the agent that the session runs. To let a run use another model for some of its agents, create them as agents and list them in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`). @@ -954,14 +916,7 @@ Before you change an existing agent's `multiagent.type`, see [how to move an age Name = "Contract Reviewer", Model = BetaManagedAgentsModel.ClaudeOpus5_5, System = "You review contracts. When you're asked to review more than a few contracts, start a workflow run that reads them in parallel and combines the findings. Review one or two contracts yourself, without a run.", - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, - }, - ], - // The configuration class sets the type for you. + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], Multiagent = new BetaManagedAgentsMultiagent20261001Params { Workflows = new BetaManagedAgentsMultiagentWorkflowsEnabledParams(), @@ -998,12 +953,7 @@ Before you change an existing agent's `multiagent.type`, see [how to move an age .name("Contract Reviewer") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You review contracts. When you're asked to review more than a few contracts, start a workflow run that reads them in parallel and combines the findings. Review one or two contracts yourself, without a run.") - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) - // The configuration class sets the type for you. + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .multiagent(BetaManagedAgentsMultiagent20261001Params.builder() .workflows(BetaManagedAgentsMultiagentWorkflowsEnabledParams.builder().build()) .build()) @@ -1090,7 +1040,7 @@ Keep the following in mind: ### Tell the agent when to use a run -Turning dynamic workflows on gives the agent the ability to start workflow runs. The agent determines when to start one. To guide that choice, add an instruction like the following to the agent's system prompt. The contract-review agent in [Turn on dynamic workflows](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#turn-on-dynamic-workflows) uses this system prompt: +Turning dynamic workflows on gives the agent the ability to start workflow runs. The agent determines when to start one. To guide that choice, add an instruction such as the following to the agent's system prompt. The contract-review agent in [Turn on dynamic workflows](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#turn-on-dynamic-workflows) uses this system prompt: ```text wrap You review contracts. When you're asked to review more than a few contracts, start a workflow run that reads them in parallel and combines the findings. Review one or two contracts yourself, without a run. @@ -1111,7 +1061,7 @@ For a run's events, interrupting a session with runs open, what changes while a ## Give the session an advisor -An enabled `advisor` setting in the agent's `multiagent` (csharp, go: `Multiagent`) block gives the session's primary thread an **advisor**: a model it can consult mid-turn for strategic guidance, such as planning an approach, getting unstuck, or reviewing work before finishing. The setting is disabled by default. To enable it, set `advisor` to `{"type": "enabled", "model": "..."}`, which has exactly two fields, `type` and `model`: +An enabled `advisor` setting in the agent's `multiagent` (csharp, go: `Multiagent`) block gives the session's primary thread an **advisor:** a model it can consult mid-turn for strategic guidance, such as planning an approach, getting unstuck, or reviewing work before finishing. The setting is disabled by default. To enable it, set `advisor` to `{"type": "enabled", "model": "..."}`, which has exactly two fields, `type` and `model`: ```bash cURL @@ -1262,7 +1212,7 @@ This example sets only `advisor` (csharp, go: `Advisor`). The other two settings You can't list the advisor in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) or `workflows` (csharp, go: `Workflows`). An enabled `advisor` (csharp, go: `Advisor`) reserves the name `anthropic.advisor`. While it is enabled, neither list can hold an agent literally named `anthropic.advisor`: the request is rejected with a 400 validation error. -The advisor model must meet a minimum capability bar, and the agent's own model must not be more capable than its advisor; models of equal capability can pair. An invalid pairing is rejected with a 400 validation error when the agent is saved, and again when a session is created. The pairing is also checked when each consultation starts: if it's no longer valid, that consultation fails and the session continues. Valid pairings follow the advisor tool's [model compatibility](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#model-compatibility) table. +The advisor model must meet a minimum capability level, and the agent's own model must not be more capable than its advisor; models of equal capability can pair. An invalid pairing is rejected with a 400 validation error when the agent is saved, and again when a session is created. The pairing is also checked when each consultation starts: if it's no longer valid, that consultation fails and the session continues. Valid pairings follow the advisor tool's [model compatibility](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#model-compatibility) table. The advisor is also available as a [server tool on the Messages API](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool). The Managed Agents surface differs in configuration and delivery: the `advisor` (csharp, go: `Advisor`) setting has no `max_uses`, `max_tokens`, or `caching` fields, and advice arrives through thread events rather than `advisor_tool_result` blocks. diff --git a/content/en/managed-agents/onboarding.md b/content/en/managed-agents/onboarding.md index c185ecb7c9..38a3da52a0 100644 --- a/content/en/managed-agents/onboarding.md +++ b/content/en/managed-agents/onboarding.md @@ -1,7 +1,7 @@ --- title: Build in Console url: https://platform.claude.com/docs/en/managed-agents/onboarding -description: Create, test, and iterate on agents visually in Console, then run them from your code with the API. +description: Create, test, and iterate on agents visually in the Claude Console, then run them from your code with the API. featureMetadata: topic: title: Managed Agents @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -[Console](https://platform.claude.com/workspaces/default/agent-quickstart/) provides a visual interface for creating and configuring agents. It lets you iterate on configuration interactively before writing code. +The [Claude Console](https://platform.claude.com/workspaces/default/agent-quickstart/) provides a visual interface for creating and configuring agents. It lets you iterate on configuration interactively before writing code. ## How to build an agent @@ -27,7 +27,7 @@ As you configure, Console shows the equivalent API request so you can copy it in Console includes an inline session runner. After configuring your agent, you can start a test session directly, send messages, and watch the event stream without leaving the page. This is the fastest way to check that your system prompt and tool selection produce the behavior you expect. -## From Console to your codebase +## From Console to your code base Once your agent works as expected: diff --git a/content/en/managed-agents/overview.md b/content/en/managed-agents/overview.md index 664f1b8c40..76c7f1cfbe 100644 --- a/content/en/managed-agents/overview.md +++ b/content/en/managed-agents/overview.md @@ -68,7 +68,7 @@ Claude Managed Agents is built around four concepts: - Send additional user events to guide the agent mid-execution, or interrupt it to change direction. + Send additional user events to guide the agent while it runs, or interrupt it to change direction. diff --git a/content/en/managed-agents/permission-policies.md b/content/en/managed-agents/permission-policies.md index 25ff53b17f..6b62676b5e 100644 --- a/content/en/managed-agents/permission-policies.md +++ b/content/en/managed-agents/permission-policies.md @@ -1,7 +1,7 @@ --- title: Permission policies url: https://platform.claude.com/docs/en/managed-agents/permission-policies -description: Control when agent and MCP tools execute. +description: Control when agent and MCP tools run. featureMetadata: topic: title: Managed Agents @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -Permission policies control whether server-executed tools (the pre-built agent toolset and MCP toolset) run automatically, wait for your approval, or have each call evaluated by the server. Custom tools are executed by your application and controlled by you, so they are not governed by permission policies. +Permission policies control whether server-executed tools (the pre-built agent toolset and MCP toolset) run automatically, wait for your approval, or have each call evaluated by the server. Custom tools are run by your application and controlled by you, so they are not governed by permission policies. ## Permission policy types @@ -114,10 +114,9 @@ When creating an agent, you can apply a policy to every tool in `agent_toolset_2 [ new BetaManagedAgentsAgentToolset20260401Params { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, DefaultConfig = new() { - PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy { Type = "always_ask" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy(), }, }, ], @@ -158,14 +157,9 @@ When creating an agent, you can apply a policy to every tool in `agent_toolset_2 .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addTool( BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .defaultConfig( BetaManagedAgentsAgentToolsetDefaultConfigParams.builder() - .permissionPolicy( - BetaManagedAgentsAlwaysAskPolicy.builder() - .type(BetaManagedAgentsAlwaysAskPolicy.Type.ALWAYS_ASK) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAskPolicy.builder().build()) .build() ) .build() @@ -184,9 +178,8 @@ When creating an agent, you can apply a policy to every tool in `agent_toolset_2 model: 'claude-opus-5-5', tools: [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', defaultConfig: BetaManagedAgentsAgentToolsetDefaultConfigParams::with( - permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(type: 'always_ask'), + permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(), ), ), ], @@ -213,7 +206,7 @@ When creating an agent, you can apply a policy to every tool in `agent_toolset_2 ### MCP toolset permissions -MCP toolsets default to `always_ask`. This ensures that new tools added to an MCP server do not execute in your application without approval. To auto-approve tools from a trusted MCP server, set `default_config.permission_policy` (java, php: `defaultConfig.permissionPolicy`; csharp, go: `DefaultConfig.PermissionPolicy`) on the `mcp_toolset` entry. +MCP toolsets default to `always_ask`. This ensures that new tools added to an MCP server do not run in your application without approval. To auto-approve tools from a trusted MCP server, set `default_config.permission_policy` (java, php: `defaultConfig.permissionPolicy`; csharp, go: `DefaultConfig.PermissionPolicy`) on the `mcp_toolset` entry. The `mcp_server_name` (java, php: `mcpServerName`; csharp: `McpServerName`; go: `MCPServerName`) must match the `name` (csharp, go: `Name`) of a server in the `mcp_servers` (java, php: `mcpServers`; csharp: `McpServers`; go: `MCPServers`) array. @@ -320,24 +313,19 @@ This example connects a GitHub MCP server and allows its tools to run without co [ new() { - Type = BetaManagedAgentsUrlMcpServerParamsType.Url, Name = "github", Url = "https://mcp.example.com/github", }, ], Tools = [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, - }, + new BetaManagedAgentsAgentToolset20260401Params(), new BetaManagedAgentsMcpToolsetParams { - Type = BetaManagedAgentsMcpToolsetParamsType.McpToolset, McpServerName = "github", DefaultConfig = new() { - PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy { Type = "always_allow" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy(), }, }, ], @@ -391,27 +379,17 @@ This example connects a GitHub MCP server and allows its tools to run without co .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addMcpServer( BetaManagedAgentsUrlMcpServerParams.builder() - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .name("github") .url("https://mcp.example.com/github") .build() ) - .addTool( - BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build() - ) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .addTool( BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("github") .defaultConfig( BetaManagedAgentsMcpToolsetDefaultConfigParams.builder() - .permissionPolicy( - BetaManagedAgentsAlwaysAllowPolicy.builder() - .type(BetaManagedAgentsAlwaysAllowPolicy.Type.ALWAYS_ALLOW) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAllowPolicy.builder().build()) .build() ) .build() @@ -432,20 +410,16 @@ This example connects a GitHub MCP server and allows its tools to run without co model: 'claude-opus-5-5', mcpServers: [ BetaManagedAgentsURLMCPServerParams::with( - type: 'url', name: 'github', url: 'https://mcp.example.com/github', ), ], tools: [ - BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', - ), + BetaManagedAgentsAgentToolset20260401Params::with(), BetaManagedAgentsMCPToolsetParams::with( - type: 'mcp_toolset', mcpServerName: 'github', defaultConfig: BetaManagedAgentsMCPToolsetDefaultConfigParams::with( - permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(type: 'always_allow'), + permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(), ), ), ], @@ -570,16 +544,15 @@ Use the `configs` (csharp, go: `Configs`) array to override the default for indi [ new BetaManagedAgentsAgentToolset20260401Params { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, DefaultConfig = new() { - PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy { Type = "always_allow" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy(), }, Configs = [ new BetaManagedAgentsBashToolConfigParams { - PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy { Type = "always_ask" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy(), }, ], }, @@ -618,23 +591,14 @@ Use the `configs` (csharp, go: `Configs`) array to override the default for indi var tools = List.of( AgentCreateParams.Tool.ofAgentToolset20260401( BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .defaultConfig( BetaManagedAgentsAgentToolsetDefaultConfigParams.builder() - .permissionPolicy( - BetaManagedAgentsAlwaysAllowPolicy.builder() - .type(BetaManagedAgentsAlwaysAllowPolicy.Type.ALWAYS_ALLOW) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAllowPolicy.builder().build()) .build() ) .addConfig( BetaManagedAgentsBashToolConfigParams.builder() - .permissionPolicy( - BetaManagedAgentsAlwaysAskPolicy.builder() - .type(BetaManagedAgentsAlwaysAskPolicy.Type.ALWAYS_ASK) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAskPolicy.builder().build()) .build() ) .build() @@ -651,13 +615,12 @@ Use the `configs` (csharp, go: `Configs`) array to override the default for indi $tools = [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', defaultConfig: BetaManagedAgentsAgentToolsetDefaultConfigParams::with( - permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(type: 'always_allow'), + permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(), ), configs: [ BetaManagedAgentsBashToolConfigParams::with( - permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(type: 'always_ask'), + permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(), ), ], ), @@ -826,7 +789,6 @@ The following example sets `auto` as the default for the agent toolset and for t [ new() { - Type = BetaManagedAgentsUrlMcpServerParamsType.Url, Name = "github", Url = "https://mcp.example.com/github", }, @@ -835,7 +797,6 @@ The following example sets `auto` as the default for the agent toolset and for t [ new BetaManagedAgentsAgentToolset20260401Params { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, DefaultConfig = new() { PermissionPolicy = new BetaManagedAgentsAutoPolicy(), @@ -844,13 +805,12 @@ The following example sets `auto` as the default for the agent toolset and for t [ new BetaManagedAgentsBashToolConfigParams { - PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy { Type = "always_ask" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy(), }, ], }, new BetaManagedAgentsMcpToolsetParams { - Type = BetaManagedAgentsMcpToolsetParamsType.McpToolset, McpServerName = "github", DefaultConfig = new() { @@ -920,14 +880,12 @@ The following example sets `auto` as the default for the agent toolset and for t .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addMcpServer( BetaManagedAgentsUrlMcpServerParams.builder() - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .name("github") .url("https://mcp.example.com/github") .build() ) .addTool( BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .defaultConfig( BetaManagedAgentsAgentToolsetDefaultConfigParams.builder() .permissionPolicy(BetaManagedAgentsAutoPolicy.builder().build()) @@ -935,18 +893,13 @@ The following example sets `auto` as the default for the agent toolset and for t ) .addConfig( BetaManagedAgentsBashToolConfigParams.builder() - .permissionPolicy( - BetaManagedAgentsAlwaysAskPolicy.builder() - .type(BetaManagedAgentsAlwaysAskPolicy.Type.ALWAYS_ASK) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAskPolicy.builder().build()) .build() ) .build() ) .addTool( BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("github") .defaultConfig( BetaManagedAgentsMcpToolsetDefaultConfigParams.builder() @@ -974,25 +927,22 @@ The following example sets `auto` as the default for the agent toolset and for t model: 'claude-opus-5-5', mcpServers: [ BetaManagedAgentsURLMCPServerParams::with( - type: 'url', name: 'github', url: 'https://mcp.example.com/github', ), ], tools: [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', defaultConfig: BetaManagedAgentsAgentToolsetDefaultConfigParams::with( permissionPolicy: BetaManagedAgentsAutoPolicy::with(), ), configs: [ BetaManagedAgentsBashToolConfigParams::with( - permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(type: 'always_ask'), + permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(), ), ], ), BetaManagedAgentsMCPToolsetParams::with( - type: 'mcp_toolset', mcpServerName: 'github', defaultConfig: BetaManagedAgentsMCPToolsetDefaultConfigParams::with( permissionPolicy: BetaManagedAgentsAutoPolicy::with(), @@ -1081,12 +1031,12 @@ Write your client to tolerate an `evaluation.type` or `reason_code` it does not ## Respond to confirmation requests -A tool call evaluates to `ask` under an `always_ask` policy, or under `auto` when the server reaches no determination. When that happens: +A tool call evaluates to `ask` under an `always_ask` policy, or under `auto` when the server reaches no determination. When that occurs: 1. The session emits an `agent.tool_use` or `agent.mcp_tool_use` event. 2. The session pauses with a `session.status_idle` event whose `stop_reason.type` is `requires_action`. The blocking event IDs are in the `stop_reason.event_ids` array. The session waits indefinitely for a response. A call from a thread of a [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs#while-a-run-is-open) reaches your client on the primary stream. While anything else in the session is working, the session can stay `running` and send no `session.status_idle`, so answer the tool-use event itself. The call waits only until the run finishes with that thread or the run ends. An interrupt might leave it waiting, so allow or deny it yourself. 3. Send a `user.tool_confirmation` event for each blocking event, passing the event ID in the `tool_use_id` (java: `toolUseId`; php: `toolUseID`; csharp, go: `ToolUseID`) parameter. Set `result` (csharp, go: `Result`) to `"allow"` or `"deny"`. Use `deny_message` (java, php: `denyMessage`; csharp, go: `DenyMessage`) to explain a denial. You can send several confirmations in a single `events` request. -4. Once all blocking events are resolved, the session transitions back to `running`. Allowed tools execute. Denied tools do not run, and the agent receives a tool result saying the call was rejected, including your `deny_message` (java, php: `denyMessage`; csharp, go: `DenyMessage`). +4. Once all blocking events are resolved, the session transitions back to `running`. Allowed tools run. Denied tools do not run, and the agent receives a tool result saying the call was rejected, including your `deny_message` (java, php: `denyMessage`; csharp, go: `DenyMessage`). For example, a `bash` call paused under an `always_ask` policy appears on the stream as follows: @@ -1221,7 +1171,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve [ new BetaManagedAgentsUserToolConfirmationEventParams { - Type = BetaManagedAgentsUserToolConfirmationEventParamsType.UserToolConfirmation, ToolUseID = agentToolUseEvent.ID, Result = "allow", }, @@ -1235,7 +1184,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve [ new BetaManagedAgentsUserToolConfirmationEventParams { - Type = BetaManagedAgentsUserToolConfirmationEventParamsType.UserToolConfirmation, ToolUseID = mcpToolUseEvent.ID, Result = "deny", DenyMessage = "Don't create issues in the production project. Use the staging project.", @@ -1282,7 +1230,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve EventSendParams.builder() .addEvent( BetaManagedAgentsUserToolConfirmationEventParams.builder() - .type(BetaManagedAgentsUserToolConfirmationEventParams.Type.USER_TOOL_CONFIRMATION) .toolUseId(agentToolUseEvent.id()) .result(BetaManagedAgentsUserToolConfirmationEventParams.Result.ALLOW) .build() @@ -1296,7 +1243,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve EventSendParams.builder() .addEvent( BetaManagedAgentsUserToolConfirmationEventParams.builder() - .type(BetaManagedAgentsUserToolConfirmationEventParams.Type.USER_TOOL_CONFIRMATION) .toolUseId(mcpToolUseEvent.id()) .result(BetaManagedAgentsUserToolConfirmationEventParams.Result.DENY) .denyMessage("Don't create issues in the production project. Use the staging project.") @@ -1314,7 +1260,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve $session->id, events: [ ManagedAgentsUserToolConfirmationEventParams::with( - type: 'user.tool_confirmation', toolUseID: $agentToolUseEvent->id, result: 'allow', ), @@ -1326,7 +1271,6 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve $session->id, events: [ ManagedAgentsUserToolConfirmationEventParams::with( - type: 'user.tool_confirmation', toolUseID: $mcpToolUseEvent->id, result: 'deny', denyMessage: "Don't create issues in the production project. Use the staging project.", @@ -1365,7 +1309,7 @@ In the following examples, the tool-use event IDs come from the `stop_reason.eve ## Custom tools -Permission policies do not apply to custom tools. When the agent invokes a custom tool, your application receives an `agent.custom_tool_use` event and is responsible for deciding whether to execute it before sending back a `user.custom_tool_result`. See [Session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#answer-tool-calls-that-pause-the-session) for the full flow. +Permission policies do not apply to custom tools. When the agent invokes a custom tool, your application receives an `agent.custom_tool_use` event and is responsible for deciding whether to run it before sending back a `user.custom_tool_result`. See [Answer tool calls that pause the session](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#answer-tool-calls-that-pause-the-session) for the full flow. ## Next steps @@ -1375,6 +1319,6 @@ Permission policies do not apply to custom tools. When the agent invokes a custo - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/quickstart.md b/content/en/managed-agents/quickstart.md index 590fd3e76b..d3d21ec65b 100644 --- a/content/en/managed-agents/quickstart.md +++ b/content/en/managed-agents/quickstart.md @@ -49,7 +49,7 @@ This guide walks you through creating an agent, setting up an environment, start For Linux environments, download the release binary directly. ```bash - VERSION=1.44.0 + VERSION=2.0.0 OS=$(uname -s | tr '[:upper:]' '[:lower:]') case $(uname -m) in x86_64) ARCH=amd64 ;; @@ -66,7 +66,7 @@ This guide walks you through creating an agent, setting up an environment, start You can also install the CLI from source using `go install`. Requires Go 1.25 or later. ```bash - go install github.com/anthropics/anthropic-cli/cmd/ant@latest + go install github.com/anthropics/anthropic-cli/v2/cmd/ant@latest ``` The binary is placed in `$(go env GOPATH)/bin`. Add it to your `PATH` if it isn't already: @@ -100,7 +100,7 @@ ant --version ```groovy Gradle - implementation("com.anthropic:anthropic-java:2.75.0") + implementation("com.anthropic:anthropic-java:3.0.0") ``` @@ -238,13 +238,7 @@ export ANTHROPIC_API_KEY="your-api-key-here" Name = "Coding Assistant", Model = BetaManagedAgentsModel.ClaudeOpus5_5, System = "You are a helpful coding assistant. Write clean, well-documented code.", - Tools = - [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, - ], + Tools = [new BetaManagedAgentsAgentToolset20260401Params()], }); Console.WriteLine($"Agent ID: {agent.ID}, version: {agent.Version}"); @@ -311,9 +305,7 @@ export ANTHROPIC_API_KEY="your-api-key-here" .name("Coding Assistant") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .system("You are a helpful coding assistant. Write clean, well-documented code.") - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .build()); IO.println("Agent ID: " + agent.id() + ", version: " + agent.version()); @@ -734,12 +726,10 @@ export ANTHROPIC_API_KEY="your-api-key-here" [ new BetaManagedAgentsUserMessageEventParams { - Type = "user.message", Content = [ new BetaManagedAgentsTextBlock { - Type = "text", Text = "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt", }, ], @@ -821,7 +811,6 @@ export ANTHROPIC_API_KEY="your-api-key-here" // Send the user message after the stream opens client.beta().sessions().events().send(session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt") .build()) .build()); @@ -962,7 +951,7 @@ Each of these quickstarts pairs Claude Managed Agents with a popular chat framew - Handle events and steer the agent mid-execution + Handle events and steer the agent while it runs diff --git a/content/en/managed-agents/reference.md b/content/en/managed-agents/reference.md index ee59dac259..c0669ffc2e 100644 --- a/content/en/managed-agents/reference.md +++ b/content/en/managed-agents/reference.md @@ -14,14 +14,14 @@ This page collects reference material for Claude Managed Agents. For task-orient ## Event types -Persisted event type strings follow a `{domain}.{action}` naming convention; the stream-only event deltas (see the Event deltas tab) are the exception. See [Session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) for sending, streaming, and listing events. Webhook event types are listed separately in [Subscribe to webhooks](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types), and some of their names differ from the stream's (for example, `session.status_idled` rather than `session.status_idle`). +Persisted event type strings follow a `{domain}.{action}` naming convention; the stream-only event deltas (see the **Event deltas** tab) are the exception. See [Session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) for sending, streaming, and listing events. Webhook event types are listed separately in [Subscribe to webhooks](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types), and some of their names differ from the stream's (for example, `session.status_idled` rather than `session.status_idle`). | Type | Description | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `user.message` | A user message with text, image, or document content. | - | `user.interrupt` | Stop the agent mid-execution. It ends no [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). | + | `user.interrupt` | Stop the agent while it runs. It ends no [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). | | `user.custom_tool_result` | Response to a custom tool call from the agent. | | `user.tool_confirmation` | Approve or deny an agent or MCP tool call when a permission policy requires confirmation. | | `user.define_outcome` | Define an [outcome](https://platform.claude.com/docs/en/managed-agents/define-outcomes) for the agent to work toward. | @@ -29,18 +29,18 @@ Persisted event type strings follow a `{domain}.{action}` naming convention; the - | Type | Description | - | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `agent.message` | Agent response content blocks. | - | `agent.thinking` | Signals the agent is making forward progress through extended thinking. This is a progress signal only and does not carry the thinking content. | - | `agent.tool_use` | Agent invokes a pre-built agent tool (bash, file operations, and so on). Carries `evaluated_permission` (java, php: `evaluatedPermission`; csharp, go: `EvaluatedPermission`) and, usually, `evaluation` (csharp, go: `Evaluation`) (see [how each call was evaluated](https://platform.claude.com/docs/en/managed-agents/permission-policies#see-how-each-call-was-evaluated)). | - | `agent.tool_result` | Result of a pre-built agent tool execution. | - | `agent.mcp_tool_use` | Agent invokes an MCP server tool. Carries `evaluated_permission` (java, php: `evaluatedPermission`; csharp, go: `EvaluatedPermission`) and, usually, `evaluation` (csharp, go: `Evaluation`) (see [how each call was evaluated](https://platform.claude.com/docs/en/managed-agents/permission-policies#see-how-each-call-was-evaluated)). | - | `agent.mcp_tool_result` | Result of an MCP tool execution. | - | `agent.custom_tool_use` | Agent invokes one of your custom tools. Respond with a `user.custom_tool_result` event. | - | `agent.thread_context_compacted` | Conversation history was compacted to fit the context window. | - | `agent.thread_message_received` | In a [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session, a message from another thread arrived on the thread whose stream carries this event; on the primary thread, an agent sent a report or question to the agent that the session runs. | - | `agent.thread_message_sent` | In a [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session, the thread whose stream carries this event sent a message to another thread; on the primary thread, the agent that the session runs sent a task or follow-up message to another agent. | + | Type | Description | + | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | `agent.message` | Agent response content blocks. | + | `agent.thinking` | Signals the agent is making forward progress through extended thinking. This is a progress signal only and does not carry the thinking content. | + | `agent.tool_use` | Agent calls a pre-built agent tool (bash, file operations, and so on). Carries `evaluated_permission` (java, php: `evaluatedPermission`; csharp, go: `EvaluatedPermission`) and, usually, `evaluation` (csharp, go: `Evaluation`) (see [how each call was evaluated](https://platform.claude.com/docs/en/managed-agents/permission-policies#see-how-each-call-was-evaluated)). | + | `agent.tool_result` | Result of a pre-built agent tool execution. | + | `agent.mcp_tool_use` | Agent calls an MCP server tool. Carries `evaluated_permission` (java, php: `evaluatedPermission`; csharp, go: `EvaluatedPermission`) and, usually, `evaluation` (csharp, go: `Evaluation`) (see [how each call was evaluated](https://platform.claude.com/docs/en/managed-agents/permission-policies#see-how-each-call-was-evaluated)). | + | `agent.mcp_tool_result` | Result of an MCP tool execution. | + | `agent.custom_tool_use` | Agent calls one of your custom tools. Respond with a `user.custom_tool_result` event. | + | `agent.thread_context_compacted` | Conversation history was compacted to fit the context window. | + | `agent.thread_message_received` | In a [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session, a message from another thread arrived on the thread whose stream carries this event; on the primary thread, an agent sent a report or question to the agent that the session runs. | + | `agent.thread_message_sent` | In a [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) session, the thread whose stream carries this event sent a message to another thread; on the primary thread, the agent that the session runs sent a task or follow-up message to another agent. | Message content in these events can include a `redacted` content block, `{"type": "redacted"}`: a placeholder for content withheld by Anthropic model policy. The block carries no other fields. Redacted blocks appear only in content the platform emits; a user event that includes one is rejected with a 400 error. @@ -52,11 +52,11 @@ Persisted event type strings follow a `{domain}.{action}` naming convention; the | `session.status_idle` | Agent finished its current task and is waiting for input. Includes a `stop_reason` (java, php: `stopReason`; csharp, go: `StopReason`) indicating why the agent stopped. | | `session.status_rescheduled` | A transient error occurred and the session is retrying automatically. | | `session.status_terminated` | Session ended, either because of an unrecoverable error or because it was archived. | - | `session.deleted` | Session was deleted. Terminates any active event stream; no further events are emitted for this session. | + | `session.deleted` | Session was deleted. Ends any active event stream; no further events are emitted for this session. | | `session.updated` | Session update request changed at least one field. Includes only the fields that changed. Updates apply on the next turn. | | `session.error` | An error occurred during processing. Includes a typed `error` (csharp, go: `Error`) object with a `retry_status` (java, php: `retryStatus`; csharp, go: `RetryStatus`). | | `session.usage` | Snapshot of the session's cumulative usage and tracked list cost. Carries the session's usage totals and, if the session has one, its [budget](https://platform.claude.com/docs/en/managed-agents/budgets). | - | `session.thread_created` | A [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) thread was created. It includes `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`): the run's ID for a [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs#a-runs-threads)'s thread, and `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) for any other thread. | + | `session.thread_created` | A [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) thread was created. It includes `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`): the run's ID for a [workflow run's thread](https://platform.claude.com/docs/en/managed-agents/workflow-runs#a-runs-threads), and `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) for any other thread. | | `session.thread_status_running` | A session thread began executing. Every session emits this for its primary thread; in [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) sessions, child-thread transitions are also cross-posted to the primary stream. | | `session.thread_status_idle` | A session thread finished its turn and is awaiting input. Includes `stop_reason` (java, php: `stopReason`; csharp, go: `StopReason`). | | `session.thread_status_rescheduled` | A session thread hit a transient error and is retrying automatically. | @@ -115,7 +115,7 @@ For more information on MCP and building MCP servers, see the [MCP documentation ## Rate limits -Managed Agents endpoints are rate-limited per organization: +Managed Agents endpoints are rate-limited for each organization: | Operation | Limit | | ------------------------------------------------------------- | ------------------------- | diff --git a/content/en/managed-agents/scheduled-deployments.md b/content/en/managed-agents/scheduled-deployments.md index 1f28037096..f1dc257a02 100644 --- a/content/en/managed-agents/scheduled-deployments.md +++ b/content/en/managed-agents/scheduled-deployments.md @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -A **scheduled deployment** allows an [agent](https://platform.claude.com/docs/en/managed-agents/agent-setup) to start [sessions](https://platform.claude.com/docs/en/managed-agents/sessions) autonomously, enabling task completion over a predictable cadence. You create and manage deployments with the Deployments API, part of the Claude API. +A **scheduled deployment** allows an [agent](https://platform.claude.com/docs/en/managed-agents/agent-setup) to start [sessions](https://platform.claude.com/docs/en/managed-agents/sessions) autonomously, so the agent can complete tasks on a predictable cadence. You create and manage deployments with the Deployments API, part of the Claude API. For the launch context and examples of what teams run on schedules, see [scheduled deployments and vaults in Claude Managed Agents](https://claude.com/blog/whats-new-in-claude-managed-agents) on the blog. @@ -18,7 +18,7 @@ For the launch context and examples of what teams run on schedules, see [schedul When creating a deployment, you pass the [session configurations](https://platform.claude.com/docs/en/managed-agents/sessions) required for execution, in addition to a `schedule` (csharp, go: `Schedule`). -* Deployments require [agent configuration](https://platform.claude.com/docs/en/managed-agents/agent-setup) and [environment configuration](https://platform.claude.com/docs/en/managed-agents/environments), and optionally accept [files](https://platform.claude.com/docs/en/managed-agents/files), [GitHub](https://platform.claude.com/docs/en/managed-agents/github), [memory stores](https://platform.claude.com/docs/en/managed-agents/memory), and [vaults](https://platform.claude.com/docs/en/managed-agents/vaults). A deployment that targets a [self-hosted environment](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory) can attach memory stores; `file` and `github_repository` resources require a cloud environment. The Claude Console deployment form does not currently offer memory stores for self-hosted environments; attach them through the API or an SDK instead. +* Deployments require [agent configuration](https://platform.claude.com/docs/en/managed-agents/agent-setup) and [environment configuration](https://platform.claude.com/docs/en/managed-agents/environments), and optionally accept [files](https://platform.claude.com/docs/en/managed-agents/files), [GitHub](https://platform.claude.com/docs/en/managed-agents/github), [memory stores](https://platform.claude.com/docs/en/managed-agents/memory), and [vaults](https://platform.claude.com/docs/en/managed-agents/vaults). A deployment that targets a [self-hosted environment](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory) can attach memory stores; `file` and `github_repository` resources require a cloud environment. The Claude Console deployment form does not currently offer memory stores for self-hosted environments; attach them through the API or the SDK instead. * Deployments also require at least one initial event, a `user.message` or `user.define_outcome`, that starts each session's work. In a deployment file for `ant apply`, the text below the frontmatter becomes that `user.message`. * In the `schedule` (csharp, go: `Schedule`), you define a cron `expression` (csharp, go: `Expression`) and a `timezone` (csharp, go: `Timezone`). Maximum granularity supported is at the minute level. @@ -124,20 +124,11 @@ When creating a deployment, you pass the [session configurations](https://platfo [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, - Content = - [ - new BetaManagedAgentsTextBlock - { - Type = BetaManagedAgentsTextBlockType.Text, - Text = "Run the weekly compliance scan.", - }, - ], + Content = [new BetaManagedAgentsTextBlock { Text = "Run the weekly compliance scan." }], }, ], Schedule = new BetaManagedAgentsScheduleParams { - Type = BetaManagedAgentsScheduleParamsType.Cron, Expression = "0 20 * * 5", Timezone = "America/New_York", }, @@ -179,13 +170,11 @@ When creating a deployment, you pass the [session configurations](https://platfo .environmentId(environment.id()) .addInitialEvent( BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Run the weekly compliance scan.") .build() ) .schedule( BetaManagedAgentsScheduleParams.builder() - .type(BetaManagedAgentsScheduleParams.Type.CRON) .expression("0 20 * * 5") .timezone("America/New_York") .build() @@ -254,11 +243,11 @@ The response includes a deployment object with a populated `schedule.upcoming_ru } ``` -The upcoming run timestamps reflect the exact schedule configured. However, to distribute load, actual execution applies jitter of up to 15% of the interval between runs, with a minimum of 5 seconds and a maximum of 9 minutes. +The upcoming run timestamps reflect the exact schedule configured. However, to distribute load, actual execution applies jitter of up to 15 percent of the interval between runs, with a minimum of 5 seconds and a maximum of 9 minutes. -A maximum of **1,000 scheduled deployments** is supported per organization. Contact Anthropic support if you need more. +A maximum of **1,000 scheduled deployments** is supported for each organization. Contact Anthropic support if you need more. -See the [Create Deployment reference](https://platform.claude.com/docs/en/api/beta/deployments/create) for full parameters and response schema. +See the [Create Deployment](https://platform.claude.com/docs/en/api/beta/deployments/create) reference for full parameters and response schema. ### Cron and timezone semantics @@ -272,7 +261,7 @@ See the [Create Deployment reference](https://platform.claude.com/docs/en/api/be ### Set a budget on each run -Pass the optional `budget` (csharp, go: `Budget`) object when you create or update the deployment. It takes the same shape as a [session budget](https://platform.claude.com/docs/en/managed-agents/budgets). The deployment copies the cap onto each session it starts, so the budget bounds every run separately rather than acting as a cumulative ceiling across runs: a deployment with a `"2000"` cap can spend up to about $20 on every run. +Pass the optional `budget` (csharp, go: `Budget`) object when you create or update the deployment. It takes the same shape as a [session budget](https://platform.claude.com/docs/en/managed-agents/budgets). The deployment copies the cap onto each session it starts, so the budget bounds every run separately rather than acting as a cumulative ceiling across runs: a deployment with a `"2000"` cap can spend up to about $20 USD on every run. A session started by the deployment behaves exactly like any other budgeted session: it pauses with `budget_reached` when its own list cost [reaches the cap](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget). Changing the deployment's budget applies to runs started afterward; a session already running keeps the cap it started with, which you can [change through the session itself](https://platform.claude.com/docs/en/managed-agents/session-operations#updating-the-session-budget). Unlike a session budget, a deployment's budget can be removed with `"budget": null` (python: `budget=None`; typescript: `budget: null`; ruby: `budget: nil`; go: `Budget: param.NullStruct[anthropic.BetaManagedAgentsBudgetLimitParam]()`; java: `.budget(Optional.empty())`; csharp: `Budget = null`; php: `requestOptions: ['extraBodyParams' => ['budget' => null]]`; cli: `--budget null`) and set again later. @@ -346,7 +335,6 @@ The following example sets a budget on an existing deployment: { Budget = new() { - Type = BetaManagedAgentsBudgetLimitType.Limit, MaxListCost = new() { Amount = "2000", Currency = BetaCurrency.Usd }, }, }); @@ -374,7 +362,6 @@ The following example sets a budget on an existing deployment: deployment.id(), DeploymentUpdateParams.builder() .budget(BetaManagedAgentsBudgetLimit.builder() - .type(BetaManagedAgentsBudgetLimit.Type.LIMIT) .maxListCost(BetaMonetaryAmount.builder() .amount("2000") .currency(BetaCurrency.USD) @@ -410,9 +397,9 @@ The following example sets a budget on an existing deployment: ## Deployment runs -Deployments can fail to trigger for a variety of reasons: for example, if the `environment` resource has been archived, or if session creation is rate-limited. Each attempt at executing a deployment generates a **deployment run** record, allowing you to track successes and failures independent of the session lifecycle. +Deployments can fail to trigger for a variety of reasons: for example, if the `environment` resource has been archived, or if session creation is rate-limited. Each attempt generates a **deployment run** record, allowing you to track successes and failures independent of the session lifecycle. -Successful deployments generate active sessions, and a successful deployment run contains the associated `session_id` (java: `sessionId`; php: `sessionID`; csharp, go: `SessionID`). To follow a session's lifecycle, track the session events through the [event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) or [webhooks](https://platform.claude.com/docs/en/managed-agents/webhooks). Deployment lifecycle changes and the outcome of each scheduled run are also delivered as webhook events, listed in the Deployment events and Deployment run events tabs of [Supported event types](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types). +Successful deployments generate active sessions, and a successful deployment run contains the associated `session_id` (java: `sessionId`; php: `sessionID`; csharp, go: `SessionID`). To follow a session's lifecycle, track the session events through the [event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) or [webhooks](https://platform.claude.com/docs/en/managed-agents/webhooks). Deployment lifecycle changes and the outcome of each scheduled run are also delivered as webhook events, listed in the **Deployment events** and **Deployment run events** tabs of [Supported event types](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types). List all deployment runs for a deployment as follows: @@ -589,7 +576,7 @@ You can additionally filter on deployment runs with errors: ``` -A failed run includes an `error` with a `type` describing why session creation was rejected (for example, `environment_archived_error`, `agent_archived_error`, or `session_rate_limited_error`). See the [List Deployment Runs reference](https://platform.claude.com/docs/en/api/beta/deployment_runs/list) for all filter parameters and the response schema. +A failed run includes an `error` with a `type` describing why session creation was rejected (for example, `environment_archived_error`, `agent_archived_error`, or `session_rate_limited_error`). See the [List Deployment Runs](https://platform.claude.com/docs/en/api/beta/deployment_runs/list) reference for all filter parameters and the response schema. ```json { @@ -611,9 +598,9 @@ To retrieve a single run by ID, call [`GET /v1/deployment_runs/{deployment_run_i ## Managing deployment lifecycle -Each lifecycle change emits a [webhook event](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types), so you can react to a paused, unpaused, or archived deployment without polling; see the Deployment events tab. +Each lifecycle change emits a [webhook event](https://platform.claude.com/docs/en/managed-agents/webhooks#supported-event-types), so you can react to a paused, unpaused, or archived deployment without polling; see the **Deployment events** tab. -**Pause** suppresses scheduled triggers on a go-forward basis; running sessions from a prior deployment run continue to execute. Manual runs through the `run` endpoint are still allowed while paused. Pausing sets `paused_reason` to `{"type": "manual"}`; unpausing clears it. +**Pause** suppresses scheduled triggers from that point on; sessions already running from a prior deployment run continue. Manual runs through the `run` endpoint are still allowed while paused. Pausing sets `paused_reason` to `{"type": "manual"}`; unpausing clears it. ```bash cURL @@ -703,7 +690,7 @@ Each lifecycle change emits a [webhook event](https://platform.claude.com/docs/e ``` -**Archive**, unlike **pause**, is terminal: the schedule terminates and the deployment cannot be modified. +**Archive**, unlike **pause**, is terminal: the schedule ends and the deployment cannot be modified. ```bash cURL diff --git a/content/en/managed-agents/secure-deployment-risks.md b/content/en/managed-agents/secure-deployment-risks.md index 7504331acf..04f09c1006 100644 --- a/content/en/managed-agents/secure-deployment-risks.md +++ b/content/en/managed-agents/secure-deployment-risks.md @@ -16,7 +16,7 @@ This page explains why the settings in [Secure your Managed Agents deployment](h Hidden instructions in content that an agent reads can steer the agent. This is called [prompt injection](https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks). Claude is inherently resilient to it, but model behavior is not a security control. The settings in [Secure your Managed Agents deployment](https://platform.claude.com/docs/en/managed-agents/secure-deployment) limit the effect if an attempt succeeds. -Claude can also take a step you did not expect while it keeps working to finish the task you gave it. For example, it might use a tool or credential it can reach to get past an obstacle. The same settings limit what such a step can reach, and an [offline reviewer](https://platform.claude.com/docs/en/managed-agents/secure-deployment-monitoring#optionally-have-an-offline-reviewer-read-every-transcript) can flag it afterward. +Claude can also take a step you did not expect while it keeps working to complete the task you gave it. For example, it might use a tool or credential it can reach to get past an obstacle. The same settings limit what such a step can reach, and an [offline reviewer](https://platform.claude.com/docs/en/managed-agents/secure-deployment-monitoring#optionally-have-an-offline-reviewer-read-every-transcript) can flag it afterward. | What can go wrong | Example | Controls | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | diff --git a/content/en/managed-agents/secure-deployment.md b/content/en/managed-agents/secure-deployment.md index 8113b1ec14..bfd1274419 100644 --- a/content/en/managed-agents/secure-deployment.md +++ b/content/en/managed-agents/secure-deployment.md @@ -40,7 +40,7 @@ The command changes nothing, and its report lists each setting to change with it ## Choose where the agent runs -Where the agent's tools run decides who secures the sandbox: Anthropic, with a cloud environment, or you, with a self-hosted sandbox. To choose between them and learn what reaches Anthropic with each, see [Choosing an agent environment](https://platform.claude.com/docs/en/managed-agents/choosing-an-environment). +Where the agent's tools run determines who secures the sandbox: Anthropic, with a cloud environment, or you, with a self-hosted sandbox. To choose between them and learn what reaches Anthropic with each, see [Choosing an agent environment](https://platform.claude.com/docs/en/managed-agents/choosing-an-environment). If you use a [self-hosted sandbox](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes), keep these four points in mind: @@ -53,9 +53,9 @@ Neither option changes the compliance coverage of Managed Agents or how long it ## Limit the network -Set `networking.type` to `limited` and list only the hosts the agent needs in `allowed_hosts`. An environment create request that omits `networking` might get `unrestricted`, so set `networking` in every create request. See [Risks of unrestricted networking](https://platform.claude.com/docs/en/managed-agents/environments#risks-of-unrestricted-networking). +Use `limited` networking and list only the hosts the agent needs in `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`). An environment create request that omits `networking` (csharp, go: `Networking`) might get `unrestricted`, so set `networking` (csharp, go: `Networking`) in every create request. See [Risks of unrestricted networking](https://platform.claude.com/docs/en/managed-agents/environments#risks-of-unrestricted-networking). -Files, memory stores, and GitHub repositories that you attach stay available to the agent regardless of `allowed_hosts`. +Files, memory stores, and GitHub repositories that you attach stay available to the agent regardless of `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`). The examples on this page use a support agent. It reads a customer's ticket, looks up the order, reads your help center, and drafts a reply. Your application runs the order lookup, which needs no host, so this environment allows one host, the help center, for `web_fetch`: @@ -201,21 +201,21 @@ The examples on this page use a support agent. It reads a customer's ticket, loo A `limited` environment has three networking settings: -| Setting | What it opens to code in the sandbox | Recommended | -| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `allowed_hosts` | The hosts you list, for any request | Only the hosts the agent needs, including the host of each MCP server you operate or trust | -| `allow_package_managers` | The [package manager hosts](https://platform.claude.com/docs/en/managed-agents/environments#package-manager-hosts). They include every repository and path on `github.com`, `gitlab.com`, and `bitbucket.org`, where anyone can publish content and where code in the sandbox can upload files | `false`, unless the environment's `packages` setting lists packages, which requires `true`. If the agent installs packages while it runs, list only the registry hosts it needs in `allowed_hosts` instead | -| `allow_mcp_servers` | No host. Managed Agents connects to MCP servers from Anthropic's servers | `false`, with the host of each MCP server you operate or trust listed in `allowed_hosts` | +| Setting | What it opens to code in the sandbox | Recommended | +| ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) | The hosts you list, for any request | Only the hosts the agent needs, including the host of each MCP server you operate or trust | +| `allow_package_managers` (java, php: `allowPackageManagers`; csharp, go: `AllowPackageManagers`) | The [package manager hosts](https://platform.claude.com/docs/en/managed-agents/environments#package-manager-hosts). They include every repository and path on `github.com`, `gitlab.com`, and `bitbucket.org`, where anyone can publish content and where code in the sandbox can upload files | `false`, unless the environment's `packages` (csharp, go: `Packages`) setting lists packages, which requires `true`. If the agent installs packages while it runs, list only the registry hosts it needs in `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) instead | +| `allow_mcp_servers` (java: `allowMcpServers`; php: `allowMCPServers`; csharp: `AllowMcpServers`; go: `AllowMCPServers`) | No host. Managed Agents connects to MCP servers from Anthropic's servers | `false`, with the host of each MCP server you operate or trust listed in `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) | -The `allow_package_managers` and `allow_mcp_servers` settings add no hosts for web search and web fetch. +The `allow_package_managers` (java, php: `allowPackageManagers`; csharp, go: `AllowPackageManagers`) and `allow_mcp_servers` (java: `allowMcpServers`; php: `allowMCPServers`; csharp: `AllowMcpServers`; go: `AllowMCPServers`) settings add no hosts for web search and web fetch. -Leave `allow_mcp_servers` off, which is the default, and list the host of each MCP server you operate or trust in `allowed_hosts`. Each host you list is also open to code in the sandbox. With `allow_mcp_servers` off, a check at session creation rejects the request if an MCP server's host is not listed. See [Provide authentication at session creation](https://platform.claude.com/docs/en/managed-agents/mcp-connector#provide-authentication-at-session-creation). The same check runs when a session update changes `mcp_servers`. +Leave `allow_mcp_servers` (java: `allowMcpServers`; php: `allowMCPServers`; csharp: `AllowMcpServers`; go: `AllowMCPServers`) off, which is the default, and list the host of each MCP server you operate or trust in `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`). Each host you list is also open to code in the sandbox. With `allow_mcp_servers` (java: `allowMcpServers`; php: `allowMCPServers`; csharp: `AllowMcpServers`; go: `AllowMCPServers`) off, a check at session creation rejects the request if an MCP server's host is not listed. See [Provide authentication at session creation](https://platform.claude.com/docs/en/managed-agents/mcp-connector#provide-authentication-at-session-creation). The same check runs when a session update changes `mcp_servers` (java, php: `mcpServers`; csharp: `McpServers`; go: `MCPServers`). Network access is granted for each host, not for each operation. The sandbox can send any request to an allowed host, including uploads such as `git push` and package publishing. It can also use any credential the command supplies, even one that someone hid in text the agent reads. -When you choose hosts for `allowed_hosts`, follow these two rules: +When you choose hosts for `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`), follow these two rules: * List only hosts you operate or trust. * Avoid `*.` wildcards and shared-hosting domains where anyone can publish content. @@ -230,18 +230,18 @@ See [Cloud environment setup](https://platform.claude.com/docs/en/managed-agents ## Keep credentials in vaults -Store every secret in a vault. For each environment variable credential, set the injection location to request headers only and list only the hosts the secret is for. Code in the sandbox sees a placeholder instead of the secret. Managed Agents swaps in the real secret only in outgoing HTTPS requests to the hosts the credential allows. So the secret stays out of direct reach of the model, unless a service sends it back, such as an endpoint that echoes request headers. If the credential's `networking` is `unrestricted`, Managed Agents swaps in the real secret in requests to any host the environment lets the sandbox reach. To use a vault, pass its ID in `vault_ids` when you create the session or deployment. +Store every secret in a vault. For each environment variable credential, set the injection location to request headers only and list only the hosts the secret is for. Code in the sandbox sees a placeholder instead of the secret. Managed Agents swaps in the real secret only in outgoing HTTPS requests to the hosts the credential allows. So the secret stays out of direct reach of the model, unless a service sends it back, such as an endpoint that echoes request headers. If the credential's `networking` (csharp, go: `Networking`) is `unrestricted`, Managed Agents swaps in the real secret in requests to any host the environment lets the sandbox reach. To use a vault, pass its ID in `vault_ids` (java: `vaultIds`; php: `vaultIDs`; csharp: `VaultIds`; go: `VaultIDs`) when you create the session or deployment. -| Setting | Set it to | Why | What it does not do | -| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `injection_location` | `{"header": true, "body": false}`, after you check that the service reads the key from a header | Request bodies are often built from content the agent reads, so a key in a body is more exposed. Name both fields: a create request that omits the object enables both locations, and an update changes only the fields you send | Code can still use the key on every host the credential allows. A service that expects the key in the body receives the placeholder and rejects the request | -| `networking` on the credential | `limited`, with the exact hosts the key is for | Responses reach the sandbox unredacted, so avoid wildcards, shared-hosting domains, and hosts that echo request headers | It does not open the host. The environment must also allow it | -| The key's permissions, at the service that issued the key | Only the permissions the agent needs | The agent can do anything the key allows | Not applicable | -| A mounted repository's GitHub token | A [fine-grained token](https://platform.claude.com/docs/en/managed-agents/github#token-permissions) with the minimum permissions | Code in the sandbox can fetch from and push to the mounted repository with it for the whole session. Grant write access only if the agent must push | Not applicable | +| Setting | Set it to | Why | What it does not do | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) | `{"header": true, "body": false}`, after you check that the service reads the key from a header | Request bodies are often built from content the agent reads, so a key in a body is more exposed. Name both fields: a create request that omits the object enables both locations, and an update changes only the fields you send | Code can still use the key on every host the credential allows. A service that expects the key in the body receives the placeholder and rejects the request | +| `networking` (csharp, go: `Networking`) on the credential | `limited`, with the exact hosts the key is for | Responses reach the sandbox unredacted, so avoid wildcards, shared-hosting domains, and hosts that echo request headers | It does not open the host. The environment must also allow it | +| The key's permissions, at the service that issued the key | Only the permissions the agent needs | The agent can do anything the key allows | Not applicable | +| A mounted repository's GitHub token | A [fine-grained token](https://platform.claude.com/docs/en/managed-agents/github#token-permissions) with the minimum permissions | Code in the sandbox can fetch from and push to the mounted repository with it for the whole session. Grant write access only if the agent must push | Not applicable | The support agent needs no vault credential, because your application holds the API key for your order API. If your agent does hold a vault credential, see [Add a credential](https://platform.claude.com/docs/en/managed-agents/vaults#add-a-credential) for the request in every language. -Keep keys out of system prompts, agent definitions, and messages. Do not give the agent a Claude API key or Claude API access token. Even when one is in a vault, code in the sandbox can use it to call the Claude API directly. It can do anything that credential allows, such as starting or deleting sessions, or using web search and web fetch. The agent's tool settings, approvals, and budget do not apply to those calls. In a `limited` environment, code can make these calls only if `allowed_hosts` lets the sandbox reach `api.anthropic.com`. +Keep keys out of system prompts, agent definitions, and messages. Do not give the agent a Claude API key or Claude API access token. Even when one is in a vault, code in the sandbox can use it to call the Claude API directly. It can do anything that credential allows, such as starting or deleting sessions, or using web search and web fetch. The agent's tool settings, approvals, and budget do not apply to those calls. In a `limited` environment, code can make these calls only if `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) lets the sandbox reach `api.anthropic.com`. Fetch third-party tokens yourself and store them in the vault. A token that code in the sandbox fetches with a stored secret comes back unredacted. @@ -251,11 +251,11 @@ See [Authenticate with vaults](https://platform.claude.com/docs/en/managed-agent ## Restrict web search and web fetch -Set `allowed_domains` on `web_fetch` to the sites the agent needs. Any URL the agent fetches can carry data to the site it points to, so this list is a security control. On `web_search`, set `allowed_domains` to the sites you want results from, so that results come only from sites you trust to be accurate. The list does not stop the search query from reaching the search provider. Search results include text from pages, so the list also limits which sites' text reaches the agent. Set `allowed_domains` on both tools for every type of environment. +Set `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) on `web_fetch` to the sites the agent needs. Any URL the agent fetches can carry data to the site it points to, so this list is a security control. On `web_search`, set `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) to the sites you want results from, so that results come only from sites you trust to be accurate. The list does not stop the search query from reaching the search provider. Search results include text from pages, so the list also limits which sites' text reaches the agent. Set `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) on both tools for every type of environment. -A `blocked_domains` list blocks the hosts you list and their subdomains, and no other host. The same content can still reach the agent from web archives, caches, mirrors, or related domains you did not list. Do not rely on `blocked_domains` for security. Use `allowed_domains` and name the hosts you trust. +A `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) list blocks the hosts you list and their subdomains, and no other host. The same content can still reach the agent from web archives, caches, mirrors, or related domains you did not list. Do not rely on `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) for security. Use `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) and name the hosts you trust. -In a `limited` environment, the `allowed_hosts` list from [Limit the network](https://platform.claude.com/docs/en/managed-agents/secure-deployment#limit-the-network) also limits the web tools. An `unrestricted` environment or a self-hosted sandbox does not limit the web tools. +In a `limited` environment, the `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) list from [Limit the network](https://platform.claude.com/docs/en/managed-agents/secure-deployment#limit-the-network) also limits the web tools. An `unrestricted` environment or a self-hosted sandbox does not limit the web tools. | In a `limited` environment | Result | | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -272,7 +272,7 @@ The two lists match hosts differently: | `allowed_hosts` (environment) | `*.example.com` | Every subdomain | `example.com` | | `allowed_domains` (web tool) | `example.com` | `example.com` and every subdomain | Other domains | -If the agent needs a site and all of its subdomains, list both `example.com` and `*.example.com` in `allowed_hosts`, and otherwise list exact hosts. If a tool lists `example.com` and `allowed_hosts` lists only `*.example.com`, the session is created. The check at session creation counts `example.com` as within `*.example.com`, but the tool returns nothing from `example.com` itself. See [Set domain lists on an agent](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#set-domain-lists-on-an-agent) for how the two lists match. +If the agent needs a site and all of its subdomains, list both `example.com` and `*.example.com` in `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`), and otherwise list exact hosts. If a tool lists `example.com` and `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) lists only `*.example.com`, the session is created. The check at session creation counts `example.com` as within `*.example.com`, but the tool returns nothing from `example.com` itself. See [Set domain lists on an agent](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#set-domain-lists-on-an-agent) for how the two lists match. The `web_fetch` tool also opens only URLs that have already appeared in the session: @@ -292,7 +292,7 @@ The `web_fetch` tool also opens only URLs that have already appeared in the sess In a multiagent session, `web_fetch` opens a URL from another agent only if it reached that agent through a source marked Yes. A custom tool's result from a direct call counts as a source marked Yes. This holds even if Claude wrote its text, for example when the tool repeats its input. A URL can count even when it is written without `https://`, such as `example.com/docs`. The `web_fetch` tool cannot always open a link that shows words instead of its URL, such as "Contact support." If the agent must fetch a URL that has not appeared in the session, send it in a user message. -This rule reduces the chance that injected text builds a URL that carries private data. End-user text, search results, fetched pages, and custom tool results can still add URLs, so keep `allowed_domains` set. The Messages API applies a similar rule with a different list of sources. See [URL validation](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#url-validation). +This rule reduces the chance that injected text builds a URL that carries private data. End-user text, search results, fetched pages, and custom tool results can still add URLs, so keep `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) set. The Messages API applies a similar rule with a different list of sources. See [URL validation](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#url-validation). A domain list on `web_fetch` does not limit the `bash` tool. [Limit the network](https://platform.claude.com/docs/en/managed-agents/secure-deployment#limit-the-network) as well. See [Domain list rules](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#domain-list-rules). @@ -300,15 +300,15 @@ A domain list on `web_fetch` does not limit the `bash` tool. [Limit the network] Set `auto` on `bash`, `write`, `edit`, and `web_fetch`, and on MCP tools that only read data. Use `always_ask` instead on a tool if you cannot undo its changes outside the sandbox. Also use it on a tool that should not run just because end-user text you relay asks for it. A [permission policy](https://platform.claude.com/docs/en/managed-agents/permission-policies) determines whether a tool call runs, waits for your approval, or is evaluated by the server. -| Tool | Recommended policy | Why | -| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| `read`, `glob`, `grep` | `always_allow` | They read files in the sandbox and change nothing | -| `bash`, `write`, `edit` | `auto`. Use `always_ask` on a tool if you cannot undo its changes outside the sandbox. Use `always_ask` on `bash` if you relay end-user text | The agent toolset default is `always_allow`, which runs every call without approval | -| `web_fetch` | `auto` | A URL the agent fetches can carry data to the site it points to | -| `web_search` | `always_ask` if the agent handles data you would not want sent in a search query. Otherwise `always_allow` | `allowed_domains` limits which sites results come from, not what the query contains | -| MCP tools that only read data | `auto`, set for each tool in the toolset's `configs` | The toolset default stays `always_ask`, so a tool the MCP server adds later still waits for approval | -| MCP tools that change data | `always_ask` | This is the MCP toolset default. Keep it | -| Custom tools | Your code decides whether each call runs | Permission policies do not apply | +| Tool | Recommended policy | Why | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `read`, `glob`, `grep` | `always_allow` | They read files in the sandbox and change nothing | +| `bash`, `write`, `edit` | `auto`. Use `always_ask` on a tool if you cannot undo its changes outside the sandbox. Use `always_ask` on `bash` if you relay end-user text | The agent toolset default is `always_allow`, which runs every call without approval | +| `web_fetch` | `auto` | A URL the agent fetches can carry data to the site it points to | +| `web_search` | `always_ask` if the agent handles data you would not want sent in a search query. Otherwise `always_allow` | `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) limits which sites results come from, not what the query contains | +| MCP tools that only read data | `auto`, set for each tool in the toolset's `configs` (csharp, go: `Configs`) | The toolset default stays `always_ask`, so a tool the MCP server adds later still waits for approval | +| MCP tools that change data | `always_ask` | This is the MCP toolset default. Keep it | +| Custom tools | Your code determines whether each call runs | Permission policies do not apply | The toolset in [Give the agent the smallest tool set](https://platform.claude.com/docs/en/managed-agents/secure-deployment#give-the-agent-the-smallest-tool-set) applies these policies. @@ -322,7 +322,7 @@ Review each paused call before you allow it. A client that allows every call wit ## Give the agent the smallest tool set -Set `default_config.enabled` to `false` and [enable only the tools the agent needs](https://platform.claude.com/docs/en/managed-agents/tools#enabling-only-specific-tools). The agent toolset enables all eight built-in tools by default. +Set `default_config.enabled` (java, php: `defaultConfig.enabled`; csharp, go: `DefaultConfig.Enabled`) to `false` and [enable only the tools the agent needs](https://platform.claude.com/docs/en/managed-agents/tools#enabling-only-specific-tools). The agent toolset enables all eight built-in tools by default. | Tool | What it does | | ------------------------- | ------------------------------------------------------------------------- | @@ -333,7 +333,7 @@ Set `default_config.enabled` to `false` and [enable only the tools the agent nee The support agent needs three built-in tools: `read` and `write` for its draft, and `web_fetch` for the help center. It looks up orders through a [custom tool](https://platform.claude.com/docs/en/managed-agents/tools#custom-tools), `lookup_order`, that your application runs. Your application holds the API key for your order API, so the agent needs neither `bash` nor a credential. -The following sample limits `web_fetch` to `help.example.com` with `allowed_domains`. It sets `auto` on `write` and `web_fetch`, as [Approve risky actions](https://platform.claude.com/docs/en/managed-agents/secure-deployment#approve-risky-actions) recommends. If a customer's ticket leads the agent to use these tools, the agent can only change files in the sandbox or open help center pages. That is why neither tool needs `always_ask`. The sample also sets `always_ask` in `default_config`, so a tool you enable later without its own policy uses `always_ask`: +The following sample limits `web_fetch` to `help.example.com` with `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`). It sets `auto` on `write` and `web_fetch`, as [Approve risky actions](https://platform.claude.com/docs/en/managed-agents/secure-deployment#approve-risky-actions) recommends. If a customer's ticket leads the agent to use these tools, the agent can only change files in the sandbox or open help center pages. That is why neither tool needs `always_ask`. The sample also sets `always_ask` in `default_config` (java, php: `defaultConfig`; csharp, go: `DefaultConfig`), so a tool you enable later without its own policy uses `always_ask`: ```bash cURL @@ -522,18 +522,17 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma [ new BetaManagedAgentsAgentToolset20260401Params { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, DefaultConfig = new() { Enabled = false, - PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy { Type = "always_ask" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAskPolicy(), }, Configs = [ new BetaManagedAgentsReadToolConfigParams { Enabled = true, - PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy { Type = "always_allow" }, + PermissionPolicy = new BetaManagedAgentsAlwaysAllowPolicy(), }, new BetaManagedAgentsWriteToolConfigParams { @@ -550,7 +549,6 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma }, new BetaManagedAgentsCustomToolParams { - Type = "custom", Name = "lookup_order", Description = "Look up one order by its ID. Returns the status, the items, and the delivery date.", InputSchema = new() @@ -631,25 +629,16 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma var tools = List.of( AgentCreateParams.Tool.ofAgentToolset20260401( BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .defaultConfig( BetaManagedAgentsAgentToolsetDefaultConfigParams.builder() .enabled(false) - .permissionPolicy( - BetaManagedAgentsAlwaysAskPolicy.builder() - .type(BetaManagedAgentsAlwaysAskPolicy.Type.ALWAYS_ASK) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAskPolicy.builder().build()) .build() ) .addConfig( BetaManagedAgentsReadToolConfigParams.builder() .enabled(true) - .permissionPolicy( - BetaManagedAgentsAlwaysAllowPolicy.builder() - .type(BetaManagedAgentsAlwaysAllowPolicy.Type.ALWAYS_ALLOW) - .build() - ) + .permissionPolicy(BetaManagedAgentsAlwaysAllowPolicy.builder().build()) .build() ) .addConfig( @@ -669,7 +658,6 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma ), AgentCreateParams.Tool.ofCustom( BetaManagedAgentsCustomToolParams.builder() - .type(BetaManagedAgentsCustomToolParams.Type.CUSTOM) .name("lookup_order") .description("Look up one order by its ID. Returns the status, the items, and the delivery date.") .inputSchema( @@ -703,15 +691,14 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma $tools = [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', defaultConfig: BetaManagedAgentsAgentToolsetDefaultConfigParams::with( enabled: false, - permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(type: 'always_ask'), + permissionPolicy: BetaManagedAgentsAlwaysAskPolicy::with(), ), configs: [ BetaManagedAgentsReadToolConfigParams::with( enabled: true, - permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(type: 'always_allow'), + permissionPolicy: BetaManagedAgentsAlwaysAllowPolicy::with(), ), BetaManagedAgentsWriteToolConfigParams::with( enabled: true, @@ -725,7 +712,6 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma ], ), BetaManagedAgentsCustomToolParams::with( - type: 'custom', name: 'lookup_order', description: 'Look up one order by its ID. Returns the status, the items, and the delivery date.', inputSchema: BetaManagedAgentsCustomToolInputSchema::with( @@ -777,32 +763,32 @@ The following sample limits `web_fetch` to `help.example.com` with `allowed_doma ``` -An [agent update](https://platform.claude.com/docs/en/managed-agents/agent-setup#update-semantics) replaces the whole `tools` array, so send every entry you want to keep. +An [agent update](https://platform.claude.com/docs/en/managed-agents/agent-setup#update-semantics) replaces the whole `tools` (csharp, go: `Tools`) array, so send every entry you want to keep. An agent update reaches only new sessions, so also check deployments, agents that list this agent, and existing sessions: * A deployment pins an agent version, so point each deployment at the new one. -* An agent that lists this one in [`subagents.predefined_agents`](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#list-the-subagents) or `workflows.predefined_agents` keeps the version it pinned, so update that agent too. -* To tighten a session that already exists, [update that session's tools](https://platform.claude.com/docs/en/managed-agents/session-operations#updating-the-agent-configuration). The session must be `idle`, and the update replaces the whole `tools` array. In a multiagent session, new `allowed_domains` and `blocked_domains` lists on the web tools of the agent the session runs also apply to every other agent. They apply from each agent's next turn. Those agents' enabled tools and permission policies do not change. To change those, update each agent, then start a new session. +* An agent that lists this one in the [`predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`)](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#list-the-subagents) or of `workflows` (csharp, go: `Workflows`) keeps the version it pinned. Update that agent too. +* To tighten a session that already exists, [update that session's tools](https://platform.claude.com/docs/en/managed-agents/session-operations#updating-the-agent-configuration). The session must be `idle`, and the update replaces the whole `tools` (csharp, go: `Tools`) array. In a multiagent session, new `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) and `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) lists on the web tools of the agent the session runs also apply to every other agent. They apply from each agent's next turn. Those agents' enabled tools and permission policies do not change. To change those, update each agent, then start a new session. Limit MCP servers and custom tools to what the agent needs, too: -* **MCP servers:** An MCP toolset enables every tool the server exposes by default. Set `default_config.enabled` to `false` and enable named tools, so tools a server adds later stay off. Remove servers the agent does not use. See [MCP connector](https://platform.claude.com/docs/en/managed-agents/mcp-connector#configure-which-mcp-tools-are-available). +* **MCP servers:** An MCP toolset enables every tool the server exposes by default. Set `default_config.enabled` (java, php: `defaultConfig.enabled`; csharp, go: `DefaultConfig.Enabled`) to `false` and enable named tools, so tools a server adds later stay off. Remove servers the agent does not use. See [MCP connector](https://platform.claude.com/docs/en/managed-agents/mcp-connector#configure-which-mcp-tools-are-available). * **Custom tools:** Your application runs them, and permission policies do not apply. Validate each call's input in your application and limit what the tool can touch. ## Keep untrusted input away from powerful tools Check which tools and credentials an agent holds whenever it reads untrusted input, which is text that someone outside your team can write. This section uses two terms: -* **Untrusted input:** Web pages, search results, support tickets, emails, repository files, uploads, MCP server results, and end-user messages that you relay. -* **Powerful tools:** `bash`, `write`, `edit`, `web_fetch`, `web_search`, MCP tools and custom tools that write or send data, and any tool that uses a credential. +* **Untrusted input:** Webpages, search results, support tickets, emails, repository files, uploads, MCP server results, and end-user messages that you relay +* **Powerful tools:** `bash`, `write`, `edit`, `web_fetch`, `web_search`, MCP tools and custom tools that write or send data, and any tool that uses a credential Text in untrusted input can tell the agent to use a powerful tool it holds. The support agent reads tickets, so it reaches your order API only through the custom tool `lookup_order`. Your application checks that the order belongs to the ticket's sender. | Input the agent reads | Power it also has | Do this | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Tickets, emails, or uploads | `bash` with a credential | Replace `bash` with a custom tool that does one thing. If the agent must keep `bash`, approve each call with `always_ask` | -| Web pages or search results | Writing files or changing records | Turn off the web tools, or limit them to sites you operate or trust | +| Webpages or search results | Writing files or changing records | Turn off the web tools, or limit them to sites you operate or trust | | MCP results or repository files | MCP tools that write | Keep the MCP toolset on `always_ask`, and enable only the tools the agent needs | | A mounted GitHub repository | Any tool | Mount only repositories you trust. An agent with `read` loads skills from the repository's `.claude/skills` directory as agent instructions, with no review step. See [Load skills from a GitHub repository](https://platform.claude.com/docs/en/managed-agents/skills#load-skills-from-a-github-repository) | | Any untrusted input | Writing to a [memory store](https://platform.claude.com/docs/en/managed-agents/memory#attach-a-memory-store-to-a-session) | Attach the store as `read_only` unless the agent must write. The default is `read_write`, and later sessions read saved text as trusted memory | @@ -817,11 +803,11 @@ When an agent must read untrusted input and also act, this guide recommends one The split uses three agents: -| Agent | Reads | Holds | Passes on | -| -------------------------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -| Lead (the agent that the session runs) | Your message, and what the other agents send back | No built-in tools. Its `subagents.predefined_agents` list names the fetcher and the writer | A task to each agent | -| Fetcher | Web pages and search results | `web_fetch` and `web_search` only, each with `allowed_domains` | Short results, in a format you ask for in its system prompt | -| Writer | The task from the lead | The tools that write files, run commands, or change records, on `auto` or `always_ask`. No web tools | Its result | +| Agent | Reads | Holds | Passes on | +| -------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | +| Lead (the agent that the session runs) | Your message, and what the other agents send back | No built-in tools. The `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of its `subagents` (csharp, go: `Subagents`) names the fetcher and the writer | A task to each agent | +| Fetcher | Web pages and search results | `web_fetch` and `web_search` only, each with `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) | Short results, in a format you ask for in its system prompt | +| Writer | The task from the lead | The tools that write files, run commands, or change records, on `auto` or `always_ask`. No web tools | Its result | The fetcher's results are built from untrusted pages, and the lead can pass their text on to the writer. Keep `auto` or `always_ask` on the writer's tools. The fetcher can still send some of what it reads to the sites on its `web_fetch` list, and to the search provider in its queries. @@ -831,14 +817,14 @@ Agents in one multiagent session [share the sandbox](https://platform.claude.com Set a budget when you create each session, and decide in advance how you stop an agent. -| Control | What it does | -| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Session budget | A cap on spend at public list prices. At the cap, the session and each [thread](https://platform.claude.com/docs/en/managed-agents/session-threads) pause. Requests in progress can finish and their tool calls still run, so spend can pass the cap. See [When a session reaches its budget](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget) | -| Deployment budget | The same cap, applied to each session a deployment starts | -| [`user.interrupt` event](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#interrupt-the-agent) | Stops the model response immediately. A running tool call can finish first. The session goes `idle`, unless a workflow run keeps it `running`, and resumes on your next message. An interrupt ends no workflow run | -| Archive or delete a session | Archiving keeps the history and blocks new events. Deleting removes the record, events, and sandbox | -| Pause or archive a deployment | Pausing stops new scheduled runs but still allows manual runs. Archiving ends the schedule permanently. Sessions already running keep running | -| Archive or delete a vault or credential | Removes the secret from running sessions without a restart. Allow for a delay. The sessions keep running, so interrupt them too. A token the agent already fetched with the secret stays in the sandbox | +| Control | What it does | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Session budget | A cap on spend at public list prices. At the cap, the session and each [thread](https://platform.claude.com/docs/en/managed-agents/session-threads) pause. Requests in progress can complete and their tool calls still run, so spend can pass the cap. See [When a session reaches its budget](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget) | +| Deployment budget | The same cap, applied to each session a deployment starts | +| [`user.interrupt` event](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#interrupt-the-agent) | Stops the model response immediately. A running tool call can complete first. The session goes `idle`, unless a workflow run keeps it `running`, and resumes on your next message. An interrupt ends no workflow run | +| Archive or delete a session | Archiving keeps the history and blocks new events. Deleting removes the record, events, and sandbox | +| Pause or archive a deployment | Pausing stops new scheduled runs but still allows manual runs. Archiving ends the schedule permanently. Sessions already running keep running | +| Archive or delete a vault or credential | Removes the secret from running sessions without a restart. Allow for a delay. The sessions keep running, so interrupt them too. A token the agent already fetched with the secret stays in the sandbox | To stop a running agent, follow these steps: @@ -851,7 +837,7 @@ To stop a running agent, follow these steps: An interrupt does not undo what the agent already did or sent. Archiving an agent does not stop its running sessions. -A budget's `max_list_cost.amount` is a whole number of US cents written as a string, so `"125"` means $1.25. See [Set a budget at session creation](https://platform.claude.com/docs/en/managed-agents/budgets#set-a-budget-at-session-creation). +A budget's `max_list_cost.amount` (java, php: `maxListCost.amount`; csharp, go: `MaxListCost.Amount`) is a whole number of US cents written as a string, so `"125"` means $1.25. See [Set a budget at session creation](https://platform.claude.com/docs/en/managed-agents/budgets#set-a-budget-at-session-creation). You cannot add a budget to a session created without one. To change or remove a cap, see [Resume a session at its budget](https://platform.claude.com/docs/en/managed-agents/budgets#resume-a-session-at-its-budget). After you remove a session's cap, you cannot set a new one. diff --git a/content/en/managed-agents/self-hosted-sandboxes-custom-tools.md b/content/en/managed-agents/self-hosted-sandboxes-custom-tools.md index 7f2bbf8a58..84ee044125 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-custom-tools.md +++ b/content/en/managed-agents/self-hosted-sandboxes-custom-tools.md @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -[Custom tools](https://platform.claude.com/docs/en/managed-agents/tools#custom-tools) are tools your own code executes: the agent emits an `agent.custom_tool_use` event and waits for a matching `user.custom_tool_result`. Your worker can be that code. Because it runs inside your sandbox, the tool reaches the internal services, credentials, and network egress you configured for the sandbox, and nothing more. +[Custom tools](https://platform.claude.com/docs/en/managed-agents/tools#custom-tools) are tools your own code runs: the agent emits an `agent.custom_tool_use` event and waits for a matching `user.custom_tool_result`. Your worker can be that code. Because it runs inside your sandbox, the tool reaches the internal services, credentials, and network egress you configured for the sandbox, and nothing more. The environment key authorizes posting custom tool results, so your Claude API key stays off the worker host. @@ -315,10 +315,7 @@ The examples connect without authentication. To send credentials, configure the ); var mcpTools = await mcpClient.ListToolsAsync(); - List tools = - [ - new BetaManagedAgentsAgentToolset20260401Params { Type = "agent_toolset_20260401" }, - ]; + List tools = [new BetaManagedAgentsAgentToolset20260401Params()]; foreach (var tool in mcpTools) { var description = tool.Description; @@ -332,7 +329,6 @@ The examples connect without authentication. To send credentials, configure the tools.Add( new BetaManagedAgentsCustomToolParams { - Type = "custom", Name = tool.Name, Description = description, InputSchema = new( @@ -480,7 +476,6 @@ The examples connect without authentication. To send credentials, configure the } return BetaManagedAgentsCustomToolParams.builder() - .type(BetaManagedAgentsCustomToolParams.Type.CUSTOM) .name(tool.name()) .description(description) .inputSchema(JsonValue.from(tool.inputSchema()) @@ -505,9 +500,7 @@ The examples connect without authentication. To send credentials, configure the var params = AgentCreateParams.builder() .name("Internal tools agent") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()); + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()); for (var tool : mcpClient.listTools().tools()) { params.addTool(toCustomTool(tool)); } @@ -788,13 +781,13 @@ The MCP helpers keep the server's names and descriptions, and most schemas pass Two cases need extra work: * **Two servers expose the same tool name:** Define the wrapper yourself under a prefixed name and have it call the server's original tool name. -* **A generator such as pydantic factors schemas into `$defs`:** Inline those schemas before you declare the tool. +* **A generator such as Pydantic factors schemas into `$defs`:** Inline those schemas before you declare the tool. ### Tool failures surface as error tool results When the MCP server reports a tool error, the worker posts an error tool result the model can react to. MCP content with no tool result equivalent, such as audio blocks and resource links, also surfaces as an error. -Set a timeout on the MCP client for a faster and clearer failure, as the Python worker example does with `read_timeout_seconds`. See [A wrapped MCP tool call hangs](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-operations#a-wrapped-mcp-tool-call-hangs) for what happens without one. +Set a timeout on the MCP client for a faster and clearer failure, as the Python worker example does with `read_timeout_seconds`. See [A wrapped MCP tool call hangs](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-operations#a-wrapped-mcp-tool-call-hangs) for what occurs without one. ### Wrap only servers you operate or trust @@ -802,4 +795,4 @@ A wrapped tool's name, description, and results enter the model's context like a ### Permission policies do not apply -[Permission policies](https://platform.claude.com/docs/en/managed-agents/permission-policies#custom-tools) govern the built-in and MCP toolsets. The worker executes every wrapped tool call the model makes, so put any approval step in your own tool code. +[Permission policies](https://platform.claude.com/docs/en/managed-agents/permission-policies#custom-tools) govern the built-in and MCP toolsets. The worker runs every wrapped tool call the model makes, so put any approval step in your own tool code. diff --git a/content/en/managed-agents/self-hosted-sandboxes-memory.md b/content/en/managed-agents/self-hosted-sandboxes-memory.md index b5a99129ae..51d3bf6c64 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-memory.md +++ b/content/en/managed-agents/self-hosted-sandboxes-memory.md @@ -39,7 +39,7 @@ In the [sandbox-per-session pattern](https://platform.claude.com/docs/en/managed ### Isolate sessions that share a store -Two sessions cannot mount the same store on one host at the same time, because both need the same path. If your sessions attach the same store, run one session per filesystem. Giving each session [its own sandbox](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-workers#run-one-sandbox-per-session) satisfies this rule. +Two sessions cannot mount the same store on one host at the same time, because both need the same path. If your sessions attach the same store, run one session for each filesystem. Giving each session [its own sandbox](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-workers#run-one-sandbox-per-session) satisfies this rule. ## How the worker handles memory @@ -50,7 +50,7 @@ When the worker claims a work item whose session has memory stores attached, it: 3. **Reconciles changes after tool calls,** at most once per sync interval (15 seconds by default). Memories that changed in the store are written to disk, and files the agent changed are uploaded to the store. 4. **Runs a final sync when the session ends.** It flushes any uploads still pending for up to 30 seconds, then removes the directories it created. -The memory store on Anthropic's side remains the source of truth. [Memory versions](https://platform.claude.com/docs/en/managed-agents/memory#audit-memory-changes), redaction, and viewing or editing memories in the Console work as they do for cloud sessions. The agent's memory reads and writes appear in the [event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) as ordinary tool events. +The memory store on Anthropic's side remains the source of truth. [Memory versions](https://platform.claude.com/docs/en/managed-agents/memory#audit-memory-changes), redaction, and viewing or editing memories in the Claude Console work as they do for cloud sessions. The agent's memory reads and writes appear in the [event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming) as ordinary tool events. Because each worker syncs on an interval, a change written in one session becomes visible to another running session only after both have synced. That is typically well under a minute at the default interval. Sessions on cloud sandboxes see each other's changes almost immediately. diff --git a/content/en/managed-agents/self-hosted-sandboxes-operations.md b/content/en/managed-agents/self-hosted-sandboxes-operations.md index 988cb26ecc..0fd8c2875b 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-operations.md +++ b/content/en/managed-agents/self-hosted-sandboxes-operations.md @@ -154,7 +154,7 @@ The monitoring calls on this page run from your monitoring or operations tooling Use `POST /v1/environments/{environment_id}/work/{work_id}/stop` (python, typescript, ruby: `client.beta.environments.work.stop()`; go, csharp: `client.Beta.Environments.Work.Stop()`; java: `client.beta().environments().work().stop()`; php: `$client->beta->environments->work->stop()`; cli: `ant beta:environments:work stop`) to ask the worker handling a specific session to shut it down. -By default the work item moves to `stopping`. The worker notices on its next lease heartbeat, cancels the session's in-flight tool call, and confirms the shutdown. The work item then becomes `stopped`. +By default the work item moves to `stopping`. The worker detects this on its next lease heartbeat, cancels the session's in-flight tool call, and confirms the shutdown. The work item then becomes `stopped`. Pass `force: true` (python: `force=True`; cli: `--force`) to mark the work item `stopped` immediately instead of waiting for the worker's confirmation. @@ -299,7 +299,7 @@ Because these calls run from your operations tooling rather than the worker host ## Stop workers gracefully -A worker that is cancelled while a session runs stops its in-flight work before it exits. If the session has [memory stores](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory) attached, the worker skips the final sync but still uploads changed files and removes the store directories. +A worker that is canceled while a session runs stops its in-flight work before it exits. If the session has [memory stores](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-memory) attached, the worker skips the final sync but still uploads changed files and removes the store directories. A killed process runs no teardown. To stop a worker cleanly: @@ -346,8 +346,8 @@ If the session sits paused with a `requires_action` stop reason, no worker or cl Without a timeout on the MCP client, a hung call to a [wrapped MCP server](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-custom-tools#wrap-an-mcp-server-as-custom-tools) becomes an error tool result only when a backstop fires: -| SDK | Backstop | Fires after | -| ---------- | -------------------------------------------------------------- | ---------------------------- | -| Python | The worker's own tool call limit | About two and a half minutes | -| TypeScript | The MCP SDK's default request timeout | About a minute | -| Go | The worker cancels a tool call that outlives its default limit | 120 seconds | +| SDK | Backstop | Fires after | +| ---------- | -------------------------------------------------------------- | ----------------- | +| Python | The worker's own tool call limit | About 2.5 minutes | +| TypeScript | The MCP SDK's default request timeout | About a minute | +| Go | The worker cancels a tool call that outlives its default limit | 120 seconds | diff --git a/content/en/managed-agents/self-hosted-sandboxes-reference.md b/content/en/managed-agents/self-hosted-sandboxes-reference.md index 75cd836759..9af6b71c97 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-reference.md +++ b/content/en/managed-agents/self-hosted-sandboxes-reference.md @@ -133,7 +133,7 @@ The Python, TypeScript, and Go SDKs provide three helpers at different levels of | Option | Description | | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `drain` (go: `Drain`) | Whether to stop polling once the queue is empty rather than waiting for new work. | -| `block_ms` (typescript: `blockMs`; go: `BlockMs`) | How long each poll waits for work to arrive before returning, in milliseconds. Must be between 1 and 999; the helper re-polls automatically. Pass `null` (python: `None`; go: `param.Null[int64]()`) for a non-blocking check. Defaults to a 999 ms long-poll. | +| `block_ms` (typescript: `blockMs`; go: `BlockMs`) | How long each poll waits for work to arrive before returning, in milliseconds. Must be between 1 and 999; the helper re-polls automatically. Pass `null` (python: `None`; go: `param.Null[int64]()`) for a non-blocking check. Defaults to a 999ms long-poll. | | `reclaim_older_than_ms` (typescript: `reclaimOlderThanMs`; go: `ReclaimOlderThanMs`) | Re-claims work items that were claimed but never acknowledged within this many milliseconds. | | `auto_stop` (typescript: `autoStop`; go: `AutoStop`) | Whether to post a stop signal for each work item once your loop body finishes with it. Set it to `false` (python: `False`; go: `param.NewOpt(false)`) when whatever runs the work item posts the stop itself. `handle_item()` (typescript: `handleItem()`; go: `HandleItem()`) does, and so does a sandbox you launch that owns the stop call. | diff --git a/content/en/managed-agents/self-hosted-sandboxes-security.md b/content/en/managed-agents/self-hosted-sandboxes-security.md index c6b157cd56..6c0ae36755 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-security.md +++ b/content/en/managed-agents/self-hosted-sandboxes-security.md @@ -19,9 +19,9 @@ Anthropic secures the control plane across all environments: session and work qu * **Service key storage and rotation.** The environment service key (`ANTHROPIC_ENVIRONMENT_KEY`) authorizes polling your environment's work queue and submitting results back to sessions. Store it in a secrets manager, not in environment files or sandbox images. Rotate it immediately if you suspect exposure. * **Isolating untrusted workloads.** The environment service key is scoped to one environment's work queue. If you run untrusted code inside your sandbox, consider provisioning a separate workspace and environment for each trust boundary. This limits each key to a single user's sessions instead of a shared pool. * **Per-session credentials.** Each work item your worker claims can carry a per-session `secret` (csharp, go: `Secret`), which the worker uses in place of the environment service key. Access to [memory stores](https://platform.claude.com/docs/en/managed-agents/memory) requires the `secret` (csharp, go: `Secret`): the memory store endpoints reject the environment key (see [Forward the work item's secret](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-workers#forward-the-work-items-secret)). Pass the `secret` (csharp, go: `Secret`) only into the sandbox that serves that session, keep it out of images and shared volumes, and never log it. -* **Tool-execution blast radius.** Tools run inside your sandbox with whatever permissions your process has. Apply least privilege to the process user and mount only the directories your tools require. +* **Tool permissions.** Tools run inside your sandbox with whatever permissions your process has. Apply least privilege to the process user and mount only the directories your tools require. * **Log retention and session content.** Conversation content and tool outputs pass through your worker and stay in your environment. You are responsible for retaining, redacting, or deleting that data in compliance with your own policies. Anthropic has no visibility into what your worker does with session content once delivered. -* **Memory store contents.** [Memory stores](https://platform.claude.com/docs/en/managed-agents/memory) remain hosted by Anthropic, including their version history. When a session attaches one, the worker keeps a working copy under `/mnt/memory/` in your sandbox for the session's duration and syncs changes back. The worker deletes that copy when the session ends, but a worker that exits without running its teardown leaves it behind. Cleaning up leftover copies, the permissions on that path, and isolation between sessions that share a filesystem are your responsibility. +* **Memory store contents.** [Memory stores](https://platform.claude.com/docs/en/managed-agents/memory) remain hosted by Anthropic, including their version history. When a session attaches one, the worker keeps a working copy under `/mnt/memory/` in your sandbox for the session's duration and syncs changes back. The worker deletes that copy when the session ends, but a worker that exits without running its teardown leaves it behind. Cleanup of leftover copies, the permissions on that path, and isolation between sessions that share a filesystem are your responsibility. * **Read-only memory stores.** A store attached with `read_only` access is protected from upload, not from local modification. The worker's `write` and `edit` tools refuse to write under its directory, nothing there syncs back, and the memory store endpoints reject writes to it made with the session's `secret` (csharp, go: `Secret`). Other processes in the sandbox can still change the local copy: commands the agent runs through the `bash` tool, and [custom tools](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-custom-tools) or MCP servers you serve from the sandbox, which run with the worker's permissions. Later tool calls in that session read the changed copy until that memory next changes in the store. If the agent must not be able to alter even its local view of such a store, disable the `bash` tool for that agent and give it no custom tool that writes to the sandbox's filesystem. ## What Anthropic cannot do for you diff --git a/content/en/managed-agents/self-hosted-sandboxes-workers.md b/content/en/managed-agents/self-hosted-sandboxes-workers.md index 2942bd642a..79ba2de8b0 100644 --- a/content/en/managed-agents/self-hosted-sandboxes-workers.md +++ b/content/en/managed-agents/self-hosted-sandboxes-workers.md @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -The [quickstart](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#quickstart) runs one `ant` CLI worker that polls continuously and runs every session in one process. This page covers the other ways to run a worker and how to choose between them. +The [quickstart](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#quickstart) runs one `ant` CLI worker that polls continuously and runs every session in one process. This page covers the other ways to run a worker and how to choose among them. ## Choose a deployment pattern @@ -161,7 +161,7 @@ Start a worker that polls the queue continuously. It authenticates with the [env - Along with the environment ID and key from the [quickstart](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#run-your-first-session), export the webhook signing key on your handler host. The handler uses it to verify incoming payloads. + Along with the environment ID and key from [Run your first session](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#run-your-first-session), export the webhook signing key on your handler host. The handler uses it to verify incoming payloads. ```bash export ANTHROPIC_WEBHOOK_SIGNING_KEY="whsec_..." @@ -169,7 +169,7 @@ Start a worker that polls the queue continuously. It authenticates with the [env - Invoke the worker when `session.status_run_started` fires. The handler drains the queue and hands each claimed work item to `handle_item()` (typescript: `handleItem()`; go: `HandleItem()`), which downloads skills, executes tool calls, posts results back, and returns. + Start the worker when `session.status_run_started` fires. The handler drains the queue and hands each claimed work item to `handle_item()` (typescript: `handleItem()`; go: `HandleItem()`), which downloads skills, runs tool calls, posts results back, and returns. @@ -429,7 +429,7 @@ This handler runs every claimed item in one process on one host. If your session ## Run one sandbox per session -A poller on the host claims work and calls your script once per work item. The script launches a sandbox for that one session. +A poller on the host claims work and calls your script once for each work item. The script launches a sandbox for that one session. @@ -437,7 +437,7 @@ A poller on the host claims work and calls your script once per work item. The s ```dockerfile FROM your-base-image - ARG ANT_VERSION=1.44.0 + ARG ANT_VERSION=2.0.0 ARG TARGETARCH RUN ARCH=$([ "$TARGETARCH" = "arm64" ] && echo arm64 || echo amd64) && \ curl -fsSL "https://github.com/anthropics/anthropic-cli/releases/download/v${ANT_VERSION}/ant_${ANT_VERSION}_linux_${ARCH}.tar.gz" \ @@ -493,7 +493,7 @@ Pass the secret only into the sandbox that serves that session, and never log it ### Launch sandboxes from the SDK poller -To claim work from your own code instead of `ant beta:worker poll --on-work`, use `work.poller()` (go: `environments.NewWorkPoller()`). It polls the queue and gives you each claimed session, and you launch the sandbox: +To claim work from your own code instead of `ant beta:worker poll --on-work`, use `work.poller()` (typescript: `new WorkPoller()`; go: `environments.NewWorkPoller()`). It polls the queue and gives you each claimed session, and you launch the sandbox: @@ -801,7 +801,7 @@ Anthropic doesn't mount files or GitHub repositories into self-hosted sandboxes. 1. Pass file references, such as an S3 path or commit SHA, in the session's `metadata` field. 2. In your spawn script or `--on-work` handler, retrieve the session (`GET /v1/sessions/{session_id}`) and read `metadata`. The claimed work item carries the session ID but not the metadata. -3. Stage the files into the working directory before tool execution begins. +3. Stage the files into the working directory before any tool runs. ```bash cURL diff --git a/content/en/managed-agents/self-hosted-sandboxes.md b/content/en/managed-agents/self-hosted-sandboxes.md index 9d492367d0..e2734550fe 100644 --- a/content/en/managed-agents/self-hosted-sandboxes.md +++ b/content/en/managed-agents/self-hosted-sandboxes.md @@ -20,7 +20,7 @@ A `self_hosted` environment acts as a work queue. You run an **environment worke 2. Your worker claims the work item and downloads the agent's [skills](https://platform.claude.com/docs/en/managed-agents/skills) and the session's [memory stores](https://platform.claude.com/docs/en/managed-agents/memory). 3. Claude runs on Anthropic's side and requests tool calls. Your worker runs each call locally and posts the result back. -Tool inputs and outputs still flow to Anthropic's control plane, so the model can see results and determine what to do next. Anthropic stores skills and memory stores. Your sandbox holds a copy for the session. See [Security model](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-security) for the full data-flow boundary. +Tool inputs and outputs still flow to Anthropic's control plane, so the model can receive results and determine what to do next. Anthropic stores skills and memory stores. Your sandbox holds a copy for the session. See [Security model](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes-security) for the full data-flow boundary. Self-hosted sandboxes support every Claude model available in Managed Agents. The model is configured on the agent, not the environment. @@ -184,7 +184,7 @@ This quickstart runs one always-on worker with the `ant` CLI, sends it a session For Linux environments, download the release binary directly. ```bash - VERSION=1.44.0 + VERSION=2.0.0 OS=$(uname -s | tr '[:upper:]' '[:lower:]') case $(uname -m) in x86_64) ARCH=amd64 ;; @@ -406,12 +406,10 @@ This quickstart runs one always-on worker with the `ant` CLI, sends it a session [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "Write the output of \"uname -a\" to hello.txt in your working directory.", }, ], @@ -457,7 +455,6 @@ This quickstart runs one always-on worker with the `ant` CLI, sends it a session session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Write the output of \"uname -a\" to hello.txt in your working directory.") .build()) .build()); @@ -508,7 +505,7 @@ This quickstart runs one always-on worker with the `ant` CLI, sends it a session cat /workspace/hello.txt ``` - The file describes your own host's kernel, so the agent's tool calls ran there. To follow the agent's work as it happens, see [Session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming). + The file describes your own host's kernel, so the agent's tool calls ran there. To follow the agent's work in real time, see [Session event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming). @@ -524,7 +521,7 @@ Environment env_... is a self-hosted environment. `resources` are not supported ## Self-hosted sandboxes and MCP tunnels -Self-hosting controls *where the agent's code executes*. [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) control *how Anthropic reaches MCP servers in your network*. The two are independent: +Self-hosting controls *where the agent's code runs*. [MCP tunnels](https://platform.claude.com/docs/en/agents-and-tools/mcp-tunnels/overview) control *how Anthropic reaches MCP servers in your network*. The two are independent: * A session in Anthropic's cloud sandboxes can reach private MCP servers through a tunnel. For example, a private MCP server might sit in front of a database or an internal API behind your firewall. * A self-hosted session can use either tunneled or public MCP servers. diff --git a/content/en/managed-agents/session-observability.md b/content/en/managed-agents/session-observability.md index 73e3e23ea2..e7d85cf1d6 100644 --- a/content/en/managed-agents/session-observability.md +++ b/content/en/managed-agents/session-observability.md @@ -18,7 +18,7 @@ The session viewer is only accessible to Developers and Admins. To open it, go t The session viewer shows: -* **Timeline minimap:** A zoomable overview of the session's activity over time, with one lane per thread in [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) sessions. Select a lane to view that thread, or select a mark to jump to its event. +* **Timeline minimap:** A zoomable overview of the session's activity over time, with one lane for each thread in [multiagent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration) sessions. Select a lane to view that thread, or select a mark to jump to its event. * **Transcript:** The conversation grouped by model request, including thinking, tool calls with their inputs and results, and message text as it streams. You can filter the events and copy or download them as JSON. * **Inspector:** A resizable side panel with details about the session, in five tabs. @@ -97,7 +97,7 @@ To enforce a spend limit, set a session budget rather than polling usage and sto ## Debugging tips * **Check session events:** The session reports errors through [`session.error`](https://platform.claude.com/docs/en/managed-agents/reference#event-types) events. -* **Review tool results:** Tool execution failures often explain unexpected agent behavior. The Inspector's **Tools** tab shows each tool's failures. +* **Review tool results:** Tool failures often explain unexpected agent behavior. The Inspector's **Tools** tab shows each tool's failures. * **Use system prompts:** Add logging instructions to the system prompt so the agent summarizes what it did and what it found. * **Troubleshoot previews:** If a stream that opts in to event deltas doesn't behave as you expect, see [Troubleshoot previews](https://platform.claude.com/docs/en/managed-agents/event-deltas#troubleshoot-previews). @@ -105,7 +105,7 @@ To enforce a spend limit, set a session budget rather than polling usage and sto - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/session-operations.md b/content/en/managed-agents/session-operations.md index b1be7a07ea..4baf1ab65f 100644 --- a/content/en/managed-agents/session-operations.md +++ b/content/en/managed-agents/session-operations.md @@ -21,11 +21,11 @@ Sessions progress through these statuses. See [Start a session](https://platform | `idle` | Agent is waiting for input, including user messages or tool confirmations. Sessions created without `initial_events` (java, php: `initialEvents`; csharp, go: `InitialEvents`) start in `idle`. A session can be `idle` while a [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs#while-a-run-is-open) is still open, so `idle` alone doesn't mean that the work is done. See [Know when the work is done](https://platform.claude.com/docs/en/managed-agents/workflow-runs#know-when-the-work-is-done). | | `running` | Agent is actively executing. | | `rescheduling` | Transient error occurred, retrying automatically. | -| `terminated` | Session has ended, either because of an unrecoverable error or because it was archived. A session that finishes its work goes `idle`, not `terminated`. | +| `terminated` | Session has ended, either because of an unrecoverable error or because it was archived. A session that completes its work goes `idle`, not `terminated`. | ## Updating the agent configuration -You can update a session's `agent.tools` (csharp, go: `Agent.Tools`) and `agent.mcp_servers` (java, php: `agent.mcpServers`; csharp: `Agent.McpServers`; go: `Agent.MCPServers`), including permission policies and per-tool web settings such as [domain filters](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#change-the-lists-mid-session), mid-session without creating a new agent version. Updates are session-local and do not propagate back to the underlying agent. Updated `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) and `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) apply to the rest of the session. +You can update a session's `agent.tools` (csharp, go: `Agent.Tools`) and `agent.mcp_servers` (java, php: `agent.mcpServers`; csharp: `Agent.McpServers`; go: `Agent.MCPServers`), including permission policies and per-tool web settings such as [domain filters](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#change-the-lists-mid-session), mid-session without creating a new agent version. Updates are session-local and do not apply to the underlying agent. Updated `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) and `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) apply to the rest of the session. Only the agent's `tools` (csharp, go: `Tools`) and `mcp_servers` (java, php: `mcpServers`; csharp: `McpServers`; go: `MCPServers`) can change after a session is created. To run a session with `model` (csharp, go: `Model`), `system` (csharp, go: `System`; ruby: `system_`), or `skills` (csharp, go: `Skills`) values other than the agent's, use [agent configuration overrides](https://platform.claude.com/docs/en/managed-agents/sessions#override-agent-configuration-for-a-session) when you create the session. The agent's model configuration, including its [`inference_geo`](https://platform.claude.com/docs/en/manage-claude/data-residency) pin, also can't change mid-session: set the pin when you save the agent, or set or clear it for a single session with a `model` (csharp, go: `Model`) override when you create it. The agent's configured `system` (csharp, go: `System`; ruby: `system_`) field is fixed for the session's lifetime. On models that support it, you can still append system-level guidance mid-session by sending a [`system.message` event](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#send-system-messages). @@ -101,21 +101,13 @@ The session must be `idle` to update the agent. To update the agent while the se { Tools = [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, - }, - new BetaManagedAgentsMcpToolsetParams - { - Type = BetaManagedAgentsMcpToolsetParamsType.McpToolset, - McpServerName = "linear", - }, + new BetaManagedAgentsAgentToolset20260401Params(), + new BetaManagedAgentsMcpToolsetParams { McpServerName = "linear" }, ], McpServers = [ new() { - Type = BetaManagedAgentsUrlMcpServerParamsType.Url, Name = "linear", Url = "https://mcp.linear.app/sse", }, @@ -159,15 +151,11 @@ The session must be `idle` to update the agent. To update the agent while the se session.id(), SessionUpdateParams.builder() .agent(BetaManagedAgentsSessionAgentUpdate.builder() - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .addTool(BetaManagedAgentsMcpToolsetParams.builder() - .type(BetaManagedAgentsMcpToolsetParams.Type.MCP_TOOLSET) .mcpServerName("linear") .build()) .addMcpServer(BetaManagedAgentsUrlMcpServerParams.builder() - .type(BetaManagedAgentsUrlMcpServerParams.Type.URL) .name("linear") .url("https://mcp.linear.app/sse") .build()) @@ -181,13 +169,12 @@ The session must be `idle` to update the agent. To update the agent while the se $session->id, agent: BetaManagedAgentsSessionAgentUpdate::with( tools: [ - BetaManagedAgentsAgentToolset20260401Params::with(type: 'agent_toolset_20260401'), - BetaManagedAgentsMCPToolsetParams::with(mcpServerName: 'linear', type: 'mcp_toolset'), + BetaManagedAgentsAgentToolset20260401Params::with(), + BetaManagedAgentsMCPToolsetParams::with(mcpServerName: 'linear'), ], mcpServers: [ BetaManagedAgentsURLMCPServerParams::with( name: 'linear', - type: 'url', url: 'https://mcp.linear.app/sse', ), ], diff --git a/content/en/managed-agents/session-threads.md b/content/en/managed-agents/session-threads.md index 195d4eca80..dfa799ffa6 100644 --- a/content/en/managed-agents/session-threads.md +++ b/content/en/managed-agents/session-threads.md @@ -16,7 +16,7 @@ In a [multiagent session](https://platform.claude.com/docs/en/managed-agents/mul The **session-level event stream** (`/v1/sessions/{session_id}/events/stream`) is considered the **primary thread**, containing a condensed view of all activity across all threads. You don't see the full activity from [subagents](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#delegate-to-subagents), but you do see the start and end of their work, and blocking events such as tool permission requests. -**Session threads** are where you drill into a specific agent's activity. +**Session threads** are where you examine a specific agent's activity. The session `status` (csharp, go: `Status`) is an aggregation of all agent activity; if at least one thread is `running`, then the overall session status is `running` as well. A [workflow run](https://platform.claude.com/docs/en/managed-agents/workflow-runs) that's running can keep the session `running` too, even while none of its threads is working. When no thread is working and a thread waits on your client, the session is `idle`; see [Know when the work is done](https://platform.claude.com/docs/en/managed-agents/workflow-runs#know-when-the-work-is-done). @@ -142,14 +142,7 @@ Send `user.interrupt` with `session_thread_id` (java: `sessionThreadId`; php: `s ```csharp C# await client.Beta.Sessions.Events.Send(session.ID, new() { - Events = - [ - new BetaManagedAgentsUserInterruptEventParams - { - Type = BetaManagedAgentsUserInterruptEventParamsType.UserInterrupt, - SessionThreadID = thread.ID, - }, - ], + Events = [new BetaManagedAgentsUserInterruptEventParams { SessionThreadID = thread.ID }], }); ``` @@ -171,7 +164,6 @@ Send `user.interrupt` with `session_thread_id` (java: `sessionThreadId`; php: `s session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserInterruptEventParams.builder() - .type(BetaManagedAgentsUserInterruptEventParams.Type.USER_INTERRUPT) .sessionThreadId(thread.id()) .build()) .build()); @@ -311,14 +303,7 @@ Archive only succeeds if the thread is `idle`. A thread parked on `requires_acti ```csharp C# await client.Beta.Sessions.Events.Send(session.ID, new() { - Events = - [ - new BetaManagedAgentsUserInterruptEventParams - { - Type = BetaManagedAgentsUserInterruptEventParamsType.UserInterrupt, - SessionThreadID = thread.ID, - }, - ], + Events = [new BetaManagedAgentsUserInterruptEventParams { SessionThreadID = thread.ID }], }); archived = await client.Beta.Sessions.Threads.Archive(thread.ID, new() { SessionID = session.ID }); Console.WriteLine($"{archived.Status} {archived.ArchivedAt}"); @@ -350,7 +335,6 @@ Archive only succeeds if the thread is `idle`. A thread parked on `requires_acti session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserInterruptEventParams.builder() - .type(BetaManagedAgentsUserInterruptEventParams.Type.USER_INTERRUPT) .sessionThreadId(thread.id()) .build()) .build()); @@ -728,7 +712,6 @@ The following example goes inside the event loop of the [tool confirmation handl [ new BetaManagedAgentsUserToolConfirmationEventParams { - Type = BetaManagedAgentsUserToolConfirmationEventParamsType.UserToolConfirmation, ToolUseID = eventId, Result = BetaManagedAgentsUserToolConfirmationEventParamsResult.Allow, }, @@ -758,7 +741,6 @@ The following example goes inside the event loop of the [tool confirmation handl session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserToolConfirmationEventParams.builder() - .type(BetaManagedAgentsUserToolConfirmationEventParams.Type.USER_TOOL_CONFIRMATION) .toolUseId(eventId) .result(BetaManagedAgentsUserToolConfirmationEventParams.Result.ALLOW) .build()) diff --git a/content/en/managed-agents/sessions.md b/content/en/managed-agents/sessions.md index c5ea425867..4d8ea291c8 100644 --- a/content/en/managed-agents/sessions.md +++ b/content/en/managed-agents/sessions.md @@ -1,7 +1,7 @@ --- title: Start a session url: https://platform.claude.com/docs/en/managed-agents/sessions -description: Create a session to run your agent and begin executing tasks. +description: Create a session to run your agent and start running tasks. featureMetadata: topic: title: Managed Agents @@ -135,7 +135,6 @@ To pin a session to a specific agent version, pass an object. This lets you cont { Agent = new BetaManagedAgentsAgentParams { - Type = BetaManagedAgentsAgentParamsType.Agent, ID = agent.ID, Version = 1, }, @@ -162,7 +161,6 @@ To pin a session to a specific agent version, pass an object. This lets you cont ```java Java var pinnedSession = client.beta().sessions().create(SessionCreateParams.builder() .agent(BetaManagedAgentsAgentParams.builder() - .type(BetaManagedAgentsAgentParams.Type.AGENT) .id(agent.id()) .version(1) .build()) @@ -278,12 +276,10 @@ The following example creates a session with a single `user.message` in `initial [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "List the files in the working directory.", }, ], @@ -352,7 +348,6 @@ The following example creates a session with a single `user.message` in `initial .agent(agent.id()) .environmentId(environment.id()) .addInitialEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("List the files in the working directory.") .build()) .build()); @@ -520,7 +515,6 @@ The following example starts a session that overrides the model and clears the s { Agent = new BetaManagedAgentsAgentWithOverridesParams { - Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides, ID = agent.ID, Model = new BetaManagedAgentsModelConfigParams { @@ -561,7 +555,6 @@ The following example starts a session that overrides the model and clears the s ```java Java var overrideSession = client.beta().sessions().create(SessionCreateParams.builder() .agent(BetaManagedAgentsAgentWithOverridesParams.builder() - .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES) .id(agent.id()) .model(BetaManagedAgentsModelConfigParams.builder() .id(BetaManagedAgentsModel.CLAUDE_SONNET_5_5) @@ -578,7 +571,6 @@ The following example starts a session that overrides the model and clears the s ```php PHP $overrides = BetaManagedAgentsAgentWithOverridesParams::with( id: $agent->id, - type: 'agent_with_overrides', model: ['id' => 'claude-sonnet-5-5'], ); // Clear the system prompt for this session. Array access is load-bearing here: @@ -680,7 +672,6 @@ The following example starts a session from an agent whose model has no geo pin, { Agent = new BetaManagedAgentsAgentWithOverridesParams { - Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides, ID = agent.ID, // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin. Model = new BetaManagedAgentsModelConfigParams @@ -718,7 +709,6 @@ The following example starts a session from an agent whose model has no geo pin, ```java Java var session = client.beta().sessions().create(SessionCreateParams.builder() .agent(BetaManagedAgentsAgentWithOverridesParams.builder() - .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES) .id(agent.id()) // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin. .model(BetaManagedAgentsModelConfigParams.builder() @@ -735,7 +725,6 @@ The following example starts a session from an agent whose model has no geo pin, $session = $client->beta->sessions->create( agent: BetaManagedAgentsAgentWithOverridesParams::with( id: $agent->id, - type: 'agent_with_overrides', // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin. model: BetaManagedAgentsModelConfigParams::with( id: 'claude-opus-5-5', @@ -767,9 +756,9 @@ The following example starts a session from an agent whose model has no geo pin, ### Set a session budget -To cap what a session can spend, pass the optional `budget` (csharp, go: `Budget`) object when you create it. A budget is a hard ceiling on the session's list cost: the platform prices everything the session consumes at public list rates, and the session stops issuing new model requests once that running total reaches `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`). The budget's `type` (csharp, go: `Type`) is always `limit`. Give `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`) an `amount` (csharp, go: `Amount`) and a `currency` (csharp, go: `Currency`). `amount` (csharp, go: `Amount`) is a whole number of US cents written as a string, such as `"125"` for $1.25. The API takes a string rather than a number so no floating-point rounding is ever applied. `USD` is the only currency currently supported. When the session reaches the cap, it pauses and goes idle with the stop reason `budget_reached`. The cap is enforced between model requests, so the request that crosses it finishes first and the session's final list cost can land [a fraction past the cap](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget). A budget can only be attached at creation: you can [change or remove](https://platform.claude.com/docs/en/managed-agents/session-operations#updating-the-session-budget) it later, but you can't add one to a session created without it. +To cap what a session can spend, pass the optional `budget` (csharp, go: `Budget`) object when you create it. A budget is a hard ceiling on the session's list cost: the platform prices everything the session consumes at public list rates, and the session stops issuing new model requests once that running total reaches `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`). The budget's `type` (csharp, go: `Type`) is always `limit`. Give `max_list_cost` (java, php: `maxListCost`; csharp, go: `MaxListCost`) an `amount` (csharp, go: `Amount`) and a `currency` (csharp, go: `Currency`). `amount` (csharp, go: `Amount`) is a whole number of US cents written as a string, such as `"125"` for $1.25 USD. The API takes a string rather than a number so no floating-point rounding is ever applied. `USD` is the only currency currently supported. When the session reaches the cap, it pauses and goes idle with the stop reason `budget_reached`. The cap is enforced between model requests, so the request that crosses it completes first and the session's final list cost can land [a fraction past the cap](https://platform.claude.com/docs/en/managed-agents/budgets#when-a-session-reaches-its-budget). A budget can only be attached at creation: you can [change or remove](https://platform.claude.com/docs/en/managed-agents/session-operations#updating-the-session-budget) it later, but you can't add one to a session created without it. -The following example creates a session with a $1.25 budget: +The following example creates a session with a $1.25 USD budget: ```bash cURL @@ -827,7 +816,6 @@ The following example creates a session with a $1.25 budget: EnvironmentID = environment.ID, Budget = new() { - Type = BetaManagedAgentsBudgetLimitType.Limit, MaxListCost = new() { Amount = "125", Currency = BetaCurrency.Usd }, }, }); @@ -859,7 +847,6 @@ The following example creates a session with a $1.25 budget: .agent(agent.id()) .environmentId(environment.id()) .budget(BetaManagedAgentsBudgetLimit.builder() - .type(BetaManagedAgentsBudgetLimit.Type.LIMIT) .maxListCost(BetaMonetaryAmount.builder() .amount("125") .currency(BetaCurrency.USD) @@ -1050,12 +1037,10 @@ Creating a session without `initial_events` (java, php: `initialEvents`; csharp, [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "List the files in the working directory.", }, ], @@ -1087,7 +1072,6 @@ Creating a session without `initial_events` (java, php: `initialEvents`; csharp, session.id(), EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("List the files in the working directory.") .build()) .build()); @@ -1130,7 +1114,7 @@ See [Session statuses](https://platform.claude.com/docs/en/managed-agents/sessio - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/skills.md b/content/en/managed-agents/skills.md index e19e056297..82e457c45e 100644 --- a/content/en/managed-agents/skills.md +++ b/content/en/managed-agents/skills.md @@ -12,7 +12,7 @@ featureMetadata: Skills are reusable, filesystem-based resources that give your agent domain-specific expertise: workflows, context, and best practices that turn a general-purpose agent into a specialist. Each skill you add incurs a modest cost on the session's context window, adding instructions and metadata that help the model use the skill. Learn more in the [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) overview. -Skills reach your agent in two ways: attach them through the agent's `skills` (csharp, go: `Skills`) array, or [load them from a GitHub repository](https://platform.claude.com/docs/en/managed-agents/skills#load-skills-from-a-github-repository) mounted on the session. Attached skills come in two types. All skills work the same way: your agent invokes them automatically when they are relevant to the task. +Skills reach your agent in two ways: attach them through the agent's `skills` (csharp, go: `Skills`) array, or [load them from a GitHub repository](https://platform.claude.com/docs/en/managed-agents/skills#load-skills-from-a-github-repository) mounted on the session. Attached skills come in two types. All skills work the same way: your agent uses them automatically when they are relevant to the task. * **Pre-built Anthropic skills:** Common document tasks such as PowerPoint, Excel, Word, and PDF handling (`pptx`, `xlsx`, `docx`, `pdf`). * **Custom skills:** Skills you author and upload to your workspace. @@ -198,7 +198,7 @@ These examples omit the optional `display_name` (java, php: `displayName`; cshar ``` -To list, retrieve, delete, and version custom skills, see [Managing custom skills](https://platform.claude.com/docs/en/build-with-claude/skills-guide#managing-custom-skills). For the full request and response schemas, see the [Create Skill API reference](https://platform.claude.com/docs/en/api/skills/create). Skill bundles upload directly to the Skills API rather than through the [Files API](https://platform.claude.com/docs/en/build-with-claude/files). +To list, retrieve, delete, and version custom skills, see [Managing custom skills](https://platform.claude.com/docs/en/build-with-claude/skills-guide#managing-custom-skills). For the full request and response schemas, see the [Create Skill](https://platform.claude.com/docs/en/api/skills/create) API reference. Skill bundles upload directly to the Skills API rather than through the [Files API](https://platform.claude.com/docs/en/build-with-claude/files). ## Attach skills to an agent @@ -304,8 +304,8 @@ Each entry in the `skills` (csharp, go: `Skills`) array uses the following field System = "You are a financial analysis agent.", Skills = [ - new BetaManagedAgentsAnthropicSkillParams { Type = BetaManagedAgentsAnthropicSkillParamsType.Anthropic, SkillID = "xlsx" }, - new BetaManagedAgentsCustomSkillParams { Type = BetaManagedAgentsCustomSkillParamsType.Custom, SkillID = "skill_01AbCdEfGhIjKlMnOpQrStUv", Version = "latest" }, + new BetaManagedAgentsAnthropicSkillParams { SkillID = "xlsx" }, + new BetaManagedAgentsCustomSkillParams { SkillID = "skill_01AbCdEfGhIjKlMnOpQrStUv", Version = "latest" }, ], }); ``` @@ -345,13 +345,11 @@ Each entry in the `skills` (csharp, go: `Skills`) array uses the following field .system("You are a financial analysis agent.") .addSkill( BetaManagedAgentsAnthropicSkillParams.builder() - .type(BetaManagedAgentsAnthropicSkillParams.Type.ANTHROPIC) .skillId("xlsx") .build() ) .addSkill( BetaManagedAgentsCustomSkillParams.builder() - .type(BetaManagedAgentsCustomSkillParams.Type.CUSTOM) .skillId("skill_01AbCdEfGhIjKlMnOpQrStUv") .version("latest") .build() @@ -387,7 +385,7 @@ Each entry in the `skills` (csharp, go: `Skills`) array uses the following field ## Load skills from a GitHub repository -Skills can also live in your codebase. When a session mounts a repository through the [`github_repository` resource](https://platform.claude.com/docs/en/managed-agents/github), the repository's root `.claude/skills` directory is scanned at session start, and each skill found there becomes available to the agent. No upload and no entry in the agent's `skills` (csharp, go: `Skills`) array are required. The agent sees each discovered skill's name, description, and path in the sandbox, and reads the skill's `SKILL.md` when a task matches, including any scripts and resources the skill ships. Discovery relies on the agent's `read` tool from the [agent toolset](https://platform.claude.com/docs/en/managed-agents/tools), which is enabled by default; an agent with `read` disabled doesn't load repository skills. +Skills can also live in your code base. When a session mounts a repository through the [`github_repository` resource](https://platform.claude.com/docs/en/managed-agents/github), the repository's root `.claude/skills` directory is scanned at session start, and each skill found there becomes available to the agent. No upload and no entry in the agent's `skills` (csharp, go: `Skills`) array are required. The agent sees each discovered skill's name, description, and path in the sandbox, and reads the skill's `SKILL.md` when a task matches, including any scripts and resources the skill ships. Discovery relies on the agent's `read` tool from the [agent toolset](https://platform.claude.com/docs/en/managed-agents/tools), which is enabled by default; an agent with `read` disabled doesn't load repository skills. Repository skills are agent instructions, so a mounted repository is part of your agent's trust boundary. Anyone who can commit to the repository (a merged external pull request, a compromised dependency, a contributor) can add or change a skill, the platform loads it at session start without a review step, and session tools such as `bash` and `web_fetch` give those instructions real reach. Mount only repositories you trust, and review `.claude/skills` before mounting a repository that accepts outside contributions. @@ -502,7 +500,6 @@ To load skills from a repository, create a session that mounts it. This is the s [ new BetaManagedAgentsGitHubRepositoryResourceParams { - Type = "github_repository", Url = "https://github.com/org/repo", MountPath = "/workspace/repo", AuthorizationToken = "ghp_your_github_token", @@ -536,7 +533,6 @@ To load skills from a repository, create a session that mounts it. This is the s .agent(agent.id()) .environmentId(environment.id()) .addResource(BetaManagedAgentsGitHubRepositoryResourceParams.builder() - .type(BetaManagedAgentsGitHubRepositoryResourceParams.Type.GITHUB_REPOSITORY) .url("https://github.com/org/repo") .mountPath("/workspace/repo") .authorizationToken("ghp_your_github_token") diff --git a/content/en/managed-agents/tools-web-restrictions.md b/content/en/managed-agents/tools-web-restrictions.md index c6fd85f642..9dcd94a4b7 100644 --- a/content/en/managed-agents/tools-web-restrictions.md +++ b/content/en/managed-agents/tools-web-restrictions.md @@ -177,7 +177,6 @@ The following example creates an agent that limits `web_search` to two sites and [ new BetaManagedAgentsAgentToolset20260401Params { - Type = BetaManagedAgentsAgentToolset20260401ParamsType.AgentToolset20260401, Configs = [ new BetaManagedAgentsWebSearchToolConfigParams @@ -272,7 +271,6 @@ The following example creates an agent that limits `web_search` to two sites and .name("Research Agent") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .addConfig(BetaManagedAgentsWebSearchToolConfigParams.builder() .allowedDomains(List.of("docs.example.com", "arxiv.org")) .userLocation(BetaManagedAgentsUserLocation.builder() @@ -311,7 +309,6 @@ The following example creates an agent that limits `web_search` to two sites and model: 'claude-opus-5-5', tools: [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', configs: [ BetaManagedAgentsWebSearchToolConfigParams::with( allowedDomains: ['docs.example.com', 'arxiv.org'], @@ -383,17 +380,17 @@ In addition to `enabled` (csharp, go: `Enabled`) and `permission_policy` (java, | `max_content_tokens` (java, php: `maxContentTokens`; csharp, go: `MaxContentTokens`) | `web_fetch` | Caps the amount of fetched page content included in the context. Must be a positive integer. See [content limits](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#content-limits). | | `user_location` (java, php: `userLocation`; csharp, go: `UserLocation`) | `web_search` | Localizes search results. An object with the same fields as the Messages API [`user_location`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool#localization) parameter. | -For how the SDKs type these entries, see [Config entry types in the SDKs](https://platform.claude.com/docs/en/managed-agents/tools#config-entry-types-in-the-sdks). +For the types the SDK uses for these entries, see [Config entry types in the SDKs](https://platform.claude.com/docs/en/managed-agents/tools#config-entry-types-in-the-sdks). -## When a domain is not permitted +## When a domain is not allowed -`web_search` omits results that its domain list does not permit. A `web_fetch` call for a URL that its domain list does not permit returns an error result to the agent. The `agent.tool_result` event has `is_error: true`, and its content names the error code `url_not_allowed`. +`web_search` omits results that its domain list does not allow. A `web_fetch` call for a URL that its domain list does not allow returns an error result to the agent. The `agent.tool_result` event has `is_error: true`, and its content names the error code `url_not_allowed`. ## Domain list rules These rules apply to `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) and `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) alike. A request that breaks one is rejected, as [Validation errors](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#validation-errors) describes. -* **One list per entry:** Set either `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) or `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) on an entry, not both. +* **One list for each entry:** Set either `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) or `blocked_domains` (java, php: `blockedDomains`; csharp, go: `BlockedDomains`) on an entry, not both. * **List size:** Each list holds 1 to 64 domains, each 1 to 255 characters. * **No empty lists:** To apply no restriction, omit the field or send `null`. * **No duplicates:** A domain can appear only once in a list. `www.example.com` and `example.com` count as different domains. @@ -408,7 +405,7 @@ Hostnames are compared without regard to case. ### Domain format -Each domain is a registrable domain name, or a subdomain of one, written as a plain hostname. It can contain ASCII letters, digits, hyphens, underscores, and dots. A single trailing `/` is ignored. +Each domain is a registrable domain name, or a subdomain of one, written as a plain hostname. It can contain ASCII letters, digits, hyphens, underscores, and dots. A single trailing `/` is ignored. A `web_search` domain can also carry a path, as [Path suffixes on web search domains](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions#path-suffixes-on-web-search-domains) describes. | Not accepted | Example | Use instead | | ------------------------------------------------------------------------------ | ------------------------ | ------------------------------------- | @@ -421,7 +418,7 @@ Each domain is a registrable domain name, or a subdomain of one, written as a pl | A single-label name | `intranet` | A full domain such as `example.co.uk` | | Non-ASCII characters, as in an internationalized domain name | | The `xn--` (Punycode) form | -A domain is also rejected if it contains credentials or whitespace, or if one of its labels begins or ends with a hyphen. `localhost` and hosts ending in `.localhost`, `.local`, `.internal`, `.localdomain`, or `.invalid` are rejected too. +A domain is also rejected if it contains credentials or whitespace, or if one of its labels starts or ends with a hyphen. `localhost` and hosts ending in `.localhost`, `.local`, `.internal`, `.localdomain`, or `.invalid` are rejected too. ### Path suffixes on web search domains @@ -443,7 +440,7 @@ Format and limit violations are rejected with a 400 `invalid_request_error`: On the same requests, the API also rejects three settings that depend on the search and fetch providers: -* A domain in `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) that Anthropic's crawler is not permitted to access. +* A domain in `allowed_domains` (java, php: `allowedDomains`; csharp, go: `AllowedDomains`) that Anthropic's crawler is not allowed to access. * A `user_location.country` that the search provider does not support. The message ends in `user_location.country: not a country the search provider supports`. * A `user_location.timezone` that is not a valid IANA name. @@ -482,7 +479,7 @@ A listed agent can therefore narrow what a tool reaches but never widen it: A `{"type": "self"}` entry in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `subagents` (csharp, go: `Subagents`) has no web settings of its own and follows the current settings of the session's agent. -If the combined `allowed_domains` lists have no domain in common, the tool stays available to that agent but every call fails. Each call returns a `url_not_allowed` error stating that no domain is permitted. The tool description tells the model the same. To avoid this, keep each listed agent's `allowed_domains` inside the `allowed_domains` of the session's agent. +If the combined `allowed_domains` lists have no domain in common, the tool stays available to that agent, but every call fails. Each call returns a `url_not_allowed` error stating that no domain is permitted. The tool description tells the model the same. To avoid this, keep each listed agent's `allowed_domains` inside the `allowed_domains` of the session's agent. The grader in [outcome-driven sessions](https://platform.claude.com/docs/en/managed-agents/define-outcomes) runs without `web_search` and `web_fetch`, regardless of these settings. @@ -509,7 +506,7 @@ These settings use the same `allowed_domains` (java, php: `allowedDomains`; csha - Control when agent and MCP tools execute. + Control when agent and MCP tools run. diff --git a/content/en/managed-agents/tools.md b/content/en/managed-agents/tools.md index cbfeddc4df..40669c0109 100644 --- a/content/en/managed-agents/tools.md +++ b/content/en/managed-agents/tools.md @@ -12,22 +12,22 @@ featureMetadata: Claude Managed Agents provides a set of built-in tools that Claude can use autonomously within a [session](https://platform.claude.com/docs/en/managed-agents/sessions). You control which tools are available by specifying them in the agent configuration. -Claude Managed Agents also supports custom, user-defined tools. Your application executes these tools separately and returns the results to Claude, which uses them to continue the task. To give the agent tools from an MCP server, use the [MCP connector](https://platform.claude.com/docs/en/managed-agents/mcp-connector) instead. +Claude Managed Agents also supports custom, user-defined tools. Your application runs these tools separately and returns the results to Claude, which uses them to continue the task. To give the agent tools from an MCP server, use the [MCP connector](https://platform.claude.com/docs/en/managed-agents/mcp-connector) instead. ## Available tools The agent toolset includes the following tools. All are enabled by default when you include the toolset in the agent configuration. -| Tool | Name | Description | -| ---------- | ------------ | ---------------------------------------------- | -| Bash | `bash` | Execute bash commands in a shell session | -| Read | `read` | Read a file from the sandbox filesystem | -| Write | `write` | Write a file to the sandbox filesystem | -| Edit | `edit` | Perform string replacement in a file | -| Glob | `glob` | Fast file pattern matching using glob patterns | -| Grep | `grep` | Text search using regex patterns | -| Web fetch | `web_fetch` | Fetch content from a URL | -| Web search | `web_search` | Search the web for information | +| Tool | Name | Description | +| ---------- | ------------ | ------------------------------------------------------ | +| Bash | `bash` | Run bash commands in a shell session | +| Read | `read` | Read a file from the sandbox filesystem | +| Write | `write` | Write a file to the sandbox filesystem | +| Edit | `edit` | Perform string replacement in a file | +| Glob | `glob` | Perform fast file pattern matching using glob patterns | +| Grep | `grep` | Search text using regex patterns | +| Web fetch | `web_fetch` | Fetch content from a URL | +| Web search | `web_search` | Search the web for information | When a tool output exceeds 100,000 characters (about 25,000 tokens), it is automatically written to a file in the [sandbox](https://platform.claude.com/docs/en/managed-agents/environments). The model receives a truncated preview with the file path and can read the full content from there. @@ -119,7 +119,6 @@ The following example enables the toolset and disables `web_fetch`: [ new BetaManagedAgentsAgentToolset20260401Params { - Type = "agent_toolset_20260401", Configs = [ new BetaManagedAgentsWebFetchToolConfigParams { Enabled = false }, @@ -159,7 +158,6 @@ The following example enables the toolset and disables `web_fetch`: .name("Coding Assistant") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) .addConfig(BetaManagedAgentsWebFetchToolConfigParams.builder() .enabled(false) .build()) @@ -176,7 +174,6 @@ The following example enables the toolset and disables `web_fetch`: model: 'claude-opus-5-5', tools: [ BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', configs: [ BetaManagedAgentsWebFetchToolConfigParams::with(enabled: false), ], @@ -237,7 +234,7 @@ The `web_search` and `web_fetch` entries also accept domain lists, a cap on fetc ### Config entry types in the SDKs -The Python, TypeScript, Go, Java, C#, Ruby, and PHP SDKs type each `configs` (csharp, go: `Configs`) entry per tool. The type is a union with one member per built-in tool, discriminated by `type` (csharp, go: `Type`). +The SDK types each `configs` (csharp, go: `Configs`) entry by tool. The type is a union with one member for each built-in tool, discriminated by `type` (csharp, go: `Type`). In Go, Java, C#, and PHP, you construct entries from typed values rather than plain dictionaries or hashes. In those SDKs, the element type of `configs` (csharp, go: `Configs`) is the union itself, so build each entry from its per-tool member type. @@ -363,13 +360,9 @@ The following example creates an agent with the built-in toolset and one custom Model = BetaManagedAgentsModel.ClaudeOpus5_5, Tools = [ - new BetaManagedAgentsAgentToolset20260401Params - { - Type = "agent_toolset_20260401", - }, + new BetaManagedAgentsAgentToolset20260401Params(), new BetaManagedAgentsCustomToolParams { - Type = "custom", Name = "get_weather", Description = "Get current weather for a location", InputSchema = new() @@ -427,11 +420,8 @@ The following example creates an agent with the built-in toolset and one custom var agent = client.beta().agents().create(AgentCreateParams.builder() .name("Weather Agent") .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5) - .addTool(BetaManagedAgentsAgentToolset20260401Params.builder() - .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401) - .build()) + .addTool(BetaManagedAgentsAgentToolset20260401Params.builder().build()) .addTool(BetaManagedAgentsCustomToolParams.builder() - .type(BetaManagedAgentsCustomToolParams.Type.CUSTOM) .name("get_weather") .description("Get current weather for a location") .inputSchema(BetaManagedAgentsCustomToolInputSchema.builder() @@ -455,11 +445,8 @@ The following example creates an agent with the built-in toolset and one custom name: 'Weather Agent', model: 'claude-opus-5-5', tools: [ - BetaManagedAgentsAgentToolset20260401Params::with( - type: 'agent_toolset_20260401', - ), + BetaManagedAgentsAgentToolset20260401Params::with(), BetaManagedAgentsCustomToolParams::with( - type: 'custom', name: 'get_weather', description: 'Get current weather for a location', inputSchema: BetaManagedAgentsCustomToolInputSchema::with( @@ -525,10 +512,10 @@ For sessions that run in a self-hosted sandbox, the environment worker can [serv - Control when agent and MCP tools execute. + Control when agent and MCP tools run. - Send events, stream responses, and interrupt or redirect your session mid-execution. + Send events, stream responses, and interrupt or redirect your session while it runs. diff --git a/content/en/managed-agents/vaults.md b/content/en/managed-agents/vaults.md index 6b49411e13..044f0d6c7a 100644 --- a/content/en/managed-agents/vaults.md +++ b/content/en/managed-agents/vaults.md @@ -29,7 +29,7 @@ A vault is the collection of `credentials` associated with an end user. Give it -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "display_name": "Alice", "metadata": {"external_user_id": "usr_abc123"} }' @@ -159,7 +159,7 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data @- <<'EOF' + -d @- <<'EOF' { "display_name": "Alice's Slack", "auth": { @@ -250,7 +250,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy DisplayName = "Alice's Slack", Auth = new BetaManagedAgentsMcpOAuthCreateParams { - Type = BetaManagedAgentsMcpOAuthCreateParamsType.McpOAuth, McpServerUrl = "https://mcp.slack.com/mcp", AccessToken = "xoxp-...", ExpiresAt = DateTimeOffset.Parse("2099-12-31T23:59:59Z"), @@ -262,7 +261,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy RefreshToken = "xoxe-1-...", TokenEndpointAuth = new BetaManagedAgentsTokenEndpointAuthPostParam { - Type = BetaManagedAgentsTokenEndpointAuthPostParamType.ClientSecretPost, ClientSecret = "abc123...", }, }, @@ -304,7 +302,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy CredentialCreateParams.builder() .displayName("Alice's Slack") .auth(BetaManagedAgentsMcpOAuthCreateParams.builder() - .type(BetaManagedAgentsMcpOAuthCreateParams.Type.MCP_OAUTH) .mcpServerUrl("https://mcp.slack.com/mcp") .accessToken("xoxp-...") .expiresAt(OffsetDateTime.parse("2099-12-31T23:59:59Z")) @@ -324,7 +321,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy vaultID: $vault->id, displayName: "Alice's Slack", auth: ManagedAgentsMCPOAuthCreateParams::with( - type: 'mcp_oauth', mcpServerURL: 'https://mcp.slack.com/mcp', accessToken: 'xoxp-...', expiresAt: new \DateTimeImmutable('2099-12-31T23:59:59Z'), @@ -334,7 +330,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy scope: 'channels:read chat:write', refreshToken: 'xoxe-1-...', tokenEndpointAuth: ManagedAgentsTokenEndpointAuthPostParam::with( - type: 'client_secret_post', clientSecret: 'abc123...', ), ), @@ -379,7 +374,7 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data @- <<'EOF' + -d @- <<'EOF' { "display_name": "Linear API key", "auth": { @@ -430,7 +425,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy DisplayName = "Linear API key", Auth = new BetaManagedAgentsStaticBearerCreateParams { - Type = BetaManagedAgentsStaticBearerCreateParamsType.StaticBearer, McpServerUrl = "https://mcp.linear.app/mcp", Token = "lin_api_your_linear_key", }, @@ -459,7 +453,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy CredentialCreateParams.builder() .displayName("Linear API key") .auth(BetaManagedAgentsStaticBearerCreateParams.builder() - .type(BetaManagedAgentsStaticBearerCreateParams.Type.STATIC_BEARER) .mcpServerUrl("https://mcp.linear.app/mcp") .token("lin_api_your_linear_key") .build()) @@ -471,7 +464,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy vaultID: $vault->id, displayName: 'Linear API key', auth: ManagedAgentsStaticBearerCreateParams::with( - type: 'static_bearer', mcpServerURL: 'https://mcp.linear.app/mcp', token: 'lin_api_your_linear_key', ), @@ -512,7 +504,7 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data @- <<'EOF' + -d @- <<'EOF' { "auth": { "type": "environment_variable", @@ -591,12 +583,10 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy DisplayName = "Notion API key for sandbox", Auth = new BetaManagedAgentsEnvironmentVariableCreateParams { - Type = BetaManagedAgentsEnvironmentVariableCreateParamsType.EnvironmentVariable, SecretName = "NOTION_API_KEY", SecretValue = "ntn_your-secret-here", Networking = new BetaManagedAgentsLimitedCredentialNetworkingParams { - Type = BetaManagedAgentsLimitedCredentialNetworkingParamsType.Limited, AllowedHosts = ["api.notion.com"], }, InjectionLocation = new() { Header = true }, @@ -643,7 +633,6 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy CredentialCreateParams.builder() .displayName("Notion API key for sandbox") .auth(BetaManagedAgentsEnvironmentVariableCreateParams.builder() - .type(BetaManagedAgentsEnvironmentVariableCreateParams.Type.ENVIRONMENT_VARIABLE) .secretName("NOTION_API_KEY") .secretValue("ntn_your-secret-here") .limitedNetworking(List.of("api.notion.com")) @@ -663,11 +652,9 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy vaultID: $vault->id, displayName: 'Notion API key for sandbox', auth: ManagedAgentsEnvironmentVariableCreateParams::with( - type: ManagedAgentsEnvironmentVariableCreateParams\Type::ENVIRONMENT_VARIABLE, secretName: 'NOTION_API_KEY', secretValue: 'ntn_your-secret-here', networking: ManagedAgentsLimitedCredentialNetworkingParams::with( - type: ManagedAgentsLimitedCredentialNetworkingParams\Type::LIMITED, allowedHosts: ['api.notion.com'], ), injectionLocation: ManagedAgentsInjectionLocationParams::with(header: true), @@ -718,15 +705,15 @@ To get the same behavior with a self-hosted sandbox, you can run your own proxy A placeholder in a disabled location is neither substituted nor stripped. The request is sent to the third party with the literal opaque placeholder string in that location. If a request arrives at the third party containing the literal placeholder string, either that location is disabled for the credential or the destination host is not covered by the `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) in the credential's `networking` (csharp, go: `Networking`). - Credentials created in the Console enable header injection only. If your client sends the secret in the request body, such as a form-encoded token request, the placeholder passes through literally and the service rejects it with its own authentication error. Enable body injection in the Console form when you create the credential, or update the credential with `{"injection_location": {"body": true}}`. + Credentials created in the Claude Console enable header injection only. If your client sends the secret in the request body, such as a form-encoded token request, the placeholder passes through literally and the service rejects it with its own authentication error. Enable body injection in the Console form when you create the credential, or update the credential with `{"injection_location": {"body": true}}`. - The substitution happens at egress, not inside the sandbox. Anything that processes the credential locally sees the opaque placeholder, not the real value: clients that validate the credential format at startup may reject it, and clients that compute a request signature from the secret (for example, AWS SigV4) produce an invalid signature. Environment variable credentials work for clients that send the secret value verbatim in an outbound request, in a location the credential's `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) enables. + The substitution happens at egress, not inside the sandbox. Anything that processes the credential locally sees the opaque placeholder, not the real value: clients that validate the credential format at startup might reject it, and clients that compute a request signature from the secret (for example, AWS SigV4) produce an invalid signature. Environment variable credentials work for clients that send the secret value verbatim in an outbound request, in a location the credential's `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) enables. Substitution is outbound only. If a client uses the stored secret to fetch a session token (for example, an OAuth client-credentials grant), the returned token arrives in the sandbox unredacted. For exchange-based flows, perform the exchange yourself and store the resulting token in the vault instead. - Scope the API key to only the permissions the agent needs. The agent can do anything the key allows, so a key with broader permissions than necessary increases the blast radius if the agent behaves unexpectedly. + Scope the API key to only the permissions the agent needs. The agent can do anything the key allows, so a key with broader permissions than necessary increases the potential damage if the agent behaves unexpectedly. @@ -750,7 +737,7 @@ Pass `vault_ids` (java: `vaultIds`; php: `vaultIDs`; csharp: `VaultIds`; go: `Va -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ - --data '{ + -d '{ "agent": "'"$AGENT_ID"'", "environment_id": "'"$ENVIRONMENT_ID"'", "vault_ids": ["'"$VAULT_ID"'"], @@ -844,7 +831,7 @@ Runtime behavior: ## Rotate a credential -Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayName`), and (on environment variable credentials) `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) can be updated. `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) updates merge per field, as described in the Environment variable tab of [Add a credential](https://platform.claude.com/docs/en/managed-agents/vaults#add-a-credential). For a running session, an `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) update propagates the same way as a secret rotation: the session's credentials are re-resolved without a restart, as described in [Credential lifecycle](https://platform.claude.com/docs/en/managed-agents/vaults#credential-lifecycle), and the updated locations apply to the session's subsequent outbound requests. Structural fields (`mcp_server_url` (java: `mcpServerUrl`; php: `mcpServerURL`; csharp: `McpServerUrl`; go: `MCPServerURL`), `secret_name` (java, php: `secretName`; csharp, go: `SecretName`), `token_endpoint` (java, php: `tokenEndpoint`; csharp, go: `TokenEndpoint`), `client_id` (java: `clientId`; php: `clientID`; csharp, go: `ClientID`)) are locked after creation. To change them, archive the credential and create a new one. +Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayName`), and (on environment variable credentials) `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) can be updated. `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) updates merge field by field, as described in the **Environment variable** tab of [Add a credential](https://platform.claude.com/docs/en/managed-agents/vaults#add-a-credential). For a running session, an `injection_location` (java, php: `injectionLocation`; csharp, go: `InjectionLocation`) update takes effect the same way as a secret rotation: the session's credentials are re-resolved without a restart, as described in [Credential lifecycle](https://platform.claude.com/docs/en/managed-agents/vaults#credential-lifecycle), and the updated locations apply to the session's subsequent outbound requests. Structural fields (`mcp_server_url` (java: `mcpServerUrl`; php: `mcpServerURL`; csharp: `McpServerUrl`; go: `MCPServerURL`), `secret_name` (java, php: `secretName`; csharp, go: `SecretName`), `token_endpoint` (java, php: `tokenEndpoint`; csharp, go: `TokenEndpoint`), `client_id` (java: `clientId`; php: `clientID`; csharp, go: `ClientID`)) are locked after creation. To change them, archive the credential and create a new one. ```bash cURL @@ -912,7 +899,6 @@ Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayNam VaultID = vault.ID, Auth = new BetaManagedAgentsMcpOAuthUpdateParams { - Type = BetaManagedAgentsMcpOAuthUpdateParamsType.McpOAuth, AccessToken = "xoxp-new-...", ExpiresAt = DateTimeOffset.Parse("2099-12-31T23:59:59Z"), Refresh = new() { RefreshToken = "xoxe-1-new-..." }, @@ -944,7 +930,6 @@ Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayNam CredentialUpdateParams.builder() .vaultId(vault.id()) .auth(BetaManagedAgentsMcpOAuthUpdateParams.builder() - .type(BetaManagedAgentsMcpOAuthUpdateParams.Type.MCP_OAUTH) .accessToken("xoxp-new-...") .expiresAt(OffsetDateTime.parse("2099-12-31T23:59:59Z")) .refresh(BetaManagedAgentsMcpOAuthRefreshUpdateParams.builder() @@ -959,7 +944,6 @@ Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayNam $credential->id, vaultID: $vault->id, auth: ManagedAgentsMCPOAuthUpdateParams::with( - type: 'mcp_oauth', accessToken: 'xoxp-new-...', expiresAt: new \DateTimeImmutable('2099-12-31T23:59:59Z'), refresh: ManagedAgentsMCPOAuthRefreshUpdateParams::with(refreshToken: 'xoxe-1-new-...'), @@ -983,7 +967,7 @@ Secret values, `display_name` (java, php: `displayName`; csharp, go: `DisplayNam ## Credential lifecycle -Credentials are re-resolved periodically, both during a session and during the vault lifecycle. This ensures that credential rotation, archival, or deletion propagates to running sessions without a restart. +Credentials are re-resolved periodically, both during a session and during the vault lifecycle. This ensures that credential rotation, archival, or deletion takes effect in running sessions without a restart. To be notified if a credential is archived, deleted, or fails to refresh, you can subscribe to the vault and credential [webhooks](https://platform.claude.com/docs/en/managed-agents/webhooks) associated with those lifecycle changes. diff --git a/content/en/managed-agents/webhooks.md b/content/en/managed-agents/webhooks.md index 75d406846c..2bea3f039f 100644 --- a/content/en/managed-agents/webhooks.md +++ b/content/en/managed-agents/webhooks.md @@ -1,7 +1,7 @@ --- title: Subscribe to webhooks url: https://platform.claude.com/docs/en/managed-agents/webhooks -description: Get notified when major events happen without polling. +description: Get notified when major events occur without polling. featureMetadata: topic: title: Managed Agents @@ -10,7 +10,7 @@ featureMetadata: betaHeader: managed-agents-2026-04-01 --- -Sessions are long-running interactions. While most real-time interactions happen through the [SSE event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming), webhooks notify you of major state changes. +Sessions are long-running interactions. Although most real-time interactions occur through the [SSE event stream](https://platform.claude.com/docs/en/managed-agents/events-and-streaming), webhooks notify you of major state changes. Webhook events return the event `type` and `id`, not the full object. When you receive a webhook event, you need to fetch the object directly with a `GET` call. This avoids delivering stale data on retries and keeps every delivery small. @@ -22,7 +22,7 @@ Webhook events return the event `type` and `id`, not the full object. When you r | Event | Trigger | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `session.status_run_started` | Agent execution started. This triggers at every session status transition to `running`. | + | `session.status_run_started` | The agent started running. This triggers at every session status transition to `running`. | | `session.status_idled` | Agent awaiting input, for example, a tool permission approval or a new user message. | | `session.budget_reached` | The session reached its [budget](https://platform.claude.com/docs/en/managed-agents/budgets) and paused. Fires at most once for each budget value you set; changing the budget arms it again. | | `session.status_rescheduled` | A transient error occurred and the session is retrying automatically. | @@ -70,11 +70,11 @@ Webhook events return the event `type` and `id`, not the full object. When you r - | Event | Trigger | - | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `deployment_run.started` | A scheduled run started. Only scheduled runs emit `deployment_run` events; [manual runs](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#trigger-a-manual-run) do not. | - | `deployment_run.succeeded` | A scheduled run created its session. The event carries the same `data.id` (the run ID) as the run's `deployment_run.started` event. To follow the session's work, subscribe to its session events (the Session events tab), or fetch the [deployment run](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#deployment-runs) for its `session_id` (java: `sessionId`; php: `sessionID`; csharp, go: `SessionID`). | - | `deployment_run.failed` | A scheduled run did not create a session. The event carries the same `data.id` as the run's `deployment_run.started` event. Fetch the [deployment run](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#deployment-runs) for the error details. | + | Event | Trigger | + | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `deployment_run.started` | A scheduled run started. Only scheduled runs emit `deployment_run` events; [manual runs](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#trigger-a-manual-run) do not. | + | `deployment_run.succeeded` | A scheduled run created its session. The event carries the same `data.id` (the run ID) as the run's `deployment_run.started` event. To follow the session's work, subscribe to its session events (the **Session events** tab), or fetch the [deployment run](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#deployment-runs) for its `session_id` (java: `sessionId`; php: `sessionID`; csharp, go: `SessionID`). | + | `deployment_run.failed` | A scheduled run did not create a session. The event carries the same `data.id` as the run's `deployment_run.started` event. Fetch the [deployment run](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments#deployment-runs) for the error details. | @@ -340,9 +340,9 @@ Set `ANTHROPIC_WEBHOOK_SIGNING_KEY` to the `whsec_`-prefixed secret shown at end ## Handle an event -Parse the body, switch on `data.type`, and fetch the resource by ID. Return any `2xx` to acknowledge. Any other response counts against the endpoint: a `3xx` disables it immediately (redirects are never followed), while other failures are retried; see [Delivery behavior](https://platform.claude.com/docs/en/managed-agents/webhooks#delivery-behavior) for the retry and auto-disable rules. +Parse the body, switch on `data.type`, and fetch the resource by ID. Return any `2xx` to acknowledge. Any other response counts against the endpoint: a `3xx` disables it immediately (redirects are never followed), whereas other failures are retried; see [Delivery behavior](https://platform.claude.com/docs/en/managed-agents/webhooks#delivery-behavior) for the retry and auto-disable rules. -Every event payload has the same structure, including the event type, identifier, and the timestamp of when the event occurred. +Every event payload has the same structure, including the event type, the identifier, and the timestamp of when the event occurred. ```json { @@ -419,7 +419,7 @@ Every event payload has the same structure, including the event type, identifier ``` -The top-level `event.id` is unique per event, not per delivery. If you receive the same `event.id` twice, it's a retry and you can discard it. +The top-level `event.id` is unique for each event, not for each delivery. If you receive the same `event.id` twice, it's a retry and you can discard it. ## Delivery behavior @@ -437,6 +437,6 @@ The top-level `event.id` is unique per event, not per delivery. If you receive t * The endpoint returns a `3xx` response. Redirects are never followed; this disables the endpoint immediately, on the first attempt, with the reason `auto-disabled: endpoint URL returned a redirect (3xx)`. If your endpoint moves, update the URL in Console and re-enable the endpoint. * The endpoint's URL resolves to a non-public IP address when Anthropic connects. This disables the endpoint immediately, with the reason `auto-disabled: endpoint URL resolved to an invalid address`. - * Deliveries to the endpoint fail continuously for a sustained period, with the reason `auto-disabled after sustained delivery failures`. The trigger is how long the endpoint has been failing without interruption, not a delivery count. A single `2xx` resets the window, so one flaky event can't disable the endpoint. + * Deliveries to the endpoint fail continuously for a sustained period, with the reason `auto-disabled after sustained delivery failures`. The trigger is how long the endpoint has been failing without interruption, not a delivery count. A single `2xx` resets the window, so one event that fails intermittently can't disable the endpoint. All three are reversible: re-enable the endpoint in Console after you resolve the issue. Events emitted while the endpoint was disabled aren't replayed. diff --git a/content/en/managed-agents/workflow-runs.md b/content/en/managed-agents/workflow-runs.md index cde9a56e55..3ccdb1aab6 100644 --- a/content/en/managed-agents/workflow-runs.md +++ b/content/en/managed-agents/workflow-runs.md @@ -25,8 +25,8 @@ The agent that the session runs writes each workflow for the work that you descr The diagram shows one example. Each workflow that the agent writes has its own phases and agents. A run has these layers: * **Workflow run:** The server runs the workflow in the background, as one workflow run. A session can have several runs open at the same time. -* **Phases:** A workflow can divide its work into phases. A phase is a named stage of the run, such as "Read the contracts". You follow a run's progress by its phase events. -* **Agent threads:** In a phase, the program runs agents. Each agent works in its own [session thread](https://platform.claude.com/docs/en/managed-agents/session-threads), on a prompt that the program wrote. An agent in a run can be an inline agent, which the program defines itself, or a predefined agent, which you list in the [`predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`)](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#predefined-and-inline-agents). For what each thread shows, see [A run's threads](https://platform.claude.com/docs/en/managed-agents/workflow-runs#a-runs-threads). +* **Phases:** A workflow can divide its work into phases. A phase is a named stage of the run, such as "Read the contracts." You follow a run's progress by its phase events. +* **Agent threads:** In a phase, the program runs agents. Each agent works in its own [session thread](https://platform.claude.com/docs/en/managed-agents/session-threads), on a prompt that the program wrote. An agent in a run can be an inline agent, which the program defines itself, or a [predefined agent](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#predefined-and-inline-agents), which you list in the `predefined_agents` (java, php: `predefinedAgents`; csharp, go: `PredefinedAgents`) list of `workflows` (csharp, go: `Workflows`). For what each thread shows, see [A run's threads](https://platform.claude.com/docs/en/managed-agents/workflow-runs#a-runs-threads). The program can do the following: @@ -40,7 +40,7 @@ When the run ends, the agent that the session runs gets a turn to read what the You can guide how a run does the work, for example how it splits the work and what it does when an agent fails. See [Tell the agent when to use a run](https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration#tell-the-agent-when-to-use-a-run). -There's no approval step before a run starts: the agent starts a run in the same turn that it writes the workflow. To review a plan first, tell the agent to describe the run and wait for your go-ahead. As a run starts, `workflow_run.created` shows its name, description, and phases. If a run starts that you didn't approve, ask the agent to stop it (see [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open)). +There's no approval step before a run starts: the agent starts a run in the same turn that it writes the workflow. To review a plan first, tell the agent to describe the run and wait for your approval. As a run starts, `workflow_run.created` shows its name, description, and phases. If a run starts that you didn't approve, ask the agent to stop it (see [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open)). ## How a run moves through its states @@ -48,7 +48,7 @@ There's no approval step before a run starts: the agent starts a run in the same ![Workflow run states: running, idle, and ended, and what moves a run from one to another.](https://platform.claude.com/docs/images/workflow-run-states.svg) -A run starts as running or as idle. Reaching the budget, for example, pauses a running run, which makes it idle; raising or removing the budget then makes it run again, unless an interrupt paused it too. A running run ends when its workflow finishes, the agent stops it, it fails, its lifetime passes, or the session is archived. An idle run can end too, for example when the agent stops it or the session is archived. +A run starts as running or as idle. Reaching the budget, for example, pauses a running run, which makes it idle; raising or removing the budget then makes it run again, unless an interrupt paused it too. A running run ends when its workflow completes, the agent stops it, it fails, its lifetime passes, or the session is archived. An idle run can end too, for example when the agent stops it or the session is archived. A run is **open** from its `workflow_run.created` event until its `workflow_run.status_ended` event, whether it's running or idle. A run is idle while it's paused, for example at the session's budget. A run has a [lifetime](https://platform.claude.com/docs/en/managed-agents/workflow-runs#limits), which the agent can set when it starts the run. Time that a run spends waiting on your client counts toward that lifetime. A pause doesn't stop a run's lifetime from passing, so a run that stays paused can end with `timeout_error`. The following events report a run's start, its phases, and its end. A pause at the budget sends one too. A pause after an interrupt might send none. Every `workflow_run.*` event includes `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`), which is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) only on a `workflow_run.error` when no run was created. @@ -59,9 +59,9 @@ Run events arrive on the session's event stream, which is the primary thread's s | Event | When it arrives | What to do | | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `workflow_run.created` | The agent started a run. Includes `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`) (`wrun_…`), the run's `name` (csharp, go: `Name`) and `description` (csharp, go: `Description`), and `phases` (csharp, go: `Phases`), the phases the workflow declares, each with an `id` (csharp, go: `ID`), a `name` (csharp, go: `Name`), and a `description` (csharp, go: `Description`). A `description` (csharp, go: `Description`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) when the workflow gives none. `phases` (csharp, go: `Phases`) is always present and can be empty. The run's and phases' `name` (csharp, go: `Name`) and `description` (csharp, go: `Description`) are text the model wrote, so they can repeat words from your request. A run's `name` (csharp, go: `Name`) can also be one the server assigned. | Track the run as open. Show its `name` (csharp, go: `Name`), and progress against `phases` (csharp, go: `Phases`). | -| `workflow_run.status_running` | When the run starts to execute, which can be a while after `created`, and each time it resumes after a pause at the budget. A resume after an interrupt might not send it. A run that starts idle might get `workflow_run.status_idle` first. | Show the run as running. | +| `workflow_run.status_running` | When the run starts running, which can be a while after `created`, and each time it resumes after a pause at the budget. A resume after an interrupt might not send it. A run that starts idle might get `workflow_run.status_idle` first. | Show the run as running. | | `workflow_run.status_idle` | The run was paused, for example at the session's budget. The event doesn't say why. A pause after an interrupt might not send it. | To continue, see [Cost and budgets](https://platform.claude.com/docs/en/managed-agents/workflow-runs#cost-and-budgets) or [Interrupt a session with runs open](https://platform.claude.com/docs/en/managed-agents/workflow-runs#interrupt-a-session-with-runs-open). | -| `workflow_run.phase_started`, `workflow_run.phase_ended` | The workflow entered or left a phase, or the run's end closed a phase that was still open. The end event doesn't say whether the phase's work finished. Both include `workflow_run_phase_id` (java: `workflowRunPhaseId`; php: `workflowRunPhaseID`; csharp, go: `WorkflowRunPhaseID`). The end also has `phase_started_id` (java: `phaseStartedId`; php: `phaseStartedID`; csharp, go: `PhaseStartedID`), the `id` (csharp, go: `ID`) of the start event it closes. Neither has the phase's name: look it up by `workflow_run_phase_id` (java: `workflowRunPhaseId`; php: `workflowRunPhaseID`; csharp, go: `WorkflowRunPhaseID`) in the `phases` (csharp, go: `Phases`) of `workflow_run.created`. | Update progress. Phases run one at a time, in the order of `phases` (csharp, go: `Phases`), each at most once, but the API doesn't guarantee it. Match a phase's end to its start by `phase_started_id` (java: `phaseStartedId`; php: `phaseStartedID`; csharp, go: `PhaseStartedID`). Handle more than one open phase, a phase that isn't in `phases` (csharp, go: `Phases`), and a listed phase that never starts, even in a run that completes. Every phase that starts also ends, before the run's `workflow_run.status_ended`. | +| `workflow_run.phase_started`, `workflow_run.phase_ended` | The workflow entered or left a phase, or the run's end closed a phase that was still open. The end event doesn't say whether the phase's work completed. Both include `workflow_run_phase_id` (java: `workflowRunPhaseId`; php: `workflowRunPhaseID`; csharp, go: `WorkflowRunPhaseID`). The end also has `phase_started_id` (java: `phaseStartedId`; php: `phaseStartedID`; csharp, go: `PhaseStartedID`), the `id` (csharp, go: `ID`) of the start event it closes. Neither has the phase's name: look it up by `workflow_run_phase_id` (java: `workflowRunPhaseId`; php: `workflowRunPhaseID`; csharp, go: `WorkflowRunPhaseID`) in the `phases` (csharp, go: `Phases`) of `workflow_run.created`. | Update progress. Phases run one at a time, in the order of `phases` (csharp, go: `Phases`), each at most once, but the API doesn't guarantee it. Match a phase's end to its start by `phase_started_id` (java: `phaseStartedId`; php: `phaseStartedID`; csharp, go: `PhaseStartedID`). Handle more than one open phase, a phase that isn't in `phases` (csharp, go: `Phases`), and a listed phase that never starts, even in a run that completes. Every phase that starts also ends, before the run's `workflow_run.status_ended`. | | `workflow_run.status_ended` | The run ended. Always the last of the run's `workflow_run.*` events. Includes `result` (csharp, go: `Result`). | Read `result` (csharp, go: `Result`) (next table). The agent then gets a turn to read how the run ended. At the budget, or while the primary thread waits on your client, that turn comes later. After an interrupt, that turn might not come: send a `user.message`, or read `result` (csharp, go: `Result`) yourself. After an archive or termination, it doesn't come. | | `workflow_run.error` | The server reports an error of a run, or a start that it refused. A run that ends in `error` gets this event, with the same error, before its `workflow_run.status_ended`. Includes `error` (csharp, go: `Error`): a `type` (csharp, go: `Type`) and a `message` (csharp, go: `Message`) that is safe to log. `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) when no run was created. | Log it, and don't take it as the run's end. If `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`), no run started. Otherwise keep tracking the run until its `workflow_run.status_ended`. | @@ -342,12 +342,10 @@ This sample follows a session from your message to the agent's answer. It opens [ new BetaManagedAgentsUserMessageEventParams { - Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage, Content = [ new BetaManagedAgentsTextBlock { - Type = BetaManagedAgentsTextBlockType.Text, Text = "Which contracts in /contracts have a change-of-control clause?", }, ], @@ -398,16 +396,8 @@ This sample follows a session from your message to the agent's answer. It opens [ new BetaManagedAgentsUserCustomToolResultEventParams { - Type = BetaManagedAgentsUserCustomToolResultEventParamsType.UserCustomToolResult, CustomToolUseID = toolUse.ID, - Content = - [ - new BetaManagedAgentsTextBlock - { - Type = BetaManagedAgentsTextBlockType.Text, - Text = result, - }, - ], + Content = [new BetaManagedAgentsTextBlock { Text = result }], }, ], }); @@ -548,7 +538,6 @@ This sample follows a session from your message to the agent's answer. It opens sessionId, EventSendParams.builder() .addEvent(BetaManagedAgentsUserMessageEventParams.builder() - .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE) .addTextContent("Which contracts in /contracts have a change-of-control clause?") .build()) .build() @@ -592,7 +581,6 @@ This sample follows a session from your message to the agent's answer. It opens sessionId, EventSendParams.builder() .addEvent(BetaManagedAgentsUserCustomToolResultEventParams.builder() - .type(BetaManagedAgentsUserCustomToolResultEventParams.Type.USER_CUSTOM_TOOL_RESULT) .customToolUseId(toolUse.id()) .addTextContent(result) .build()) @@ -784,14 +772,14 @@ Send [`user.interrupt`](https://platform.claude.com/docs/en/managed-agents/event ### Rebuild run state after you reconnect -Rebuild each run's state from the session's events. The stream doesn't replay what you missed: a new connection delivers only events emitted after it opened. So list the events with a `types` (curl: `types[]`; cli: `--type`; csharp, go: `Types`) filter, one entry for each event type, as in [List past events](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#list-past-events). Pass each response's `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) as `page` (cli: `--page`; csharp, go: `Page`) until `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) or missing. `workflow_run.created`, `workflow_run.status_running`, `workflow_run.status_idle`, and `workflow_run.status_ended` give each run's state, except that a run paused after an interrupt might still show as running. `workflow_run.phase_started` and `workflow_run.phase_ended` rebuild progress. A run with no status event yet hasn't started to execute. No endpoint lists runs. +Rebuild each run's state from the session's events. The stream doesn't replay what you missed: a new connection delivers only events emitted after it opened. So list the events with a `types` (curl: `types[]`; cli: `--type`; csharp, go: `Types`) filter, one entry for each event type, as in [List past events](https://platform.claude.com/docs/en/managed-agents/events-and-streaming#list-past-events). Pass each response's `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) as `page` (cli: `--page`; csharp, go: `Page`) until `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) or missing. `workflow_run.created`, `workflow_run.status_running`, `workflow_run.status_idle`, and `workflow_run.status_ended` give each run's state, except that a run paused after an interrupt might still show as running. `workflow_run.phase_started` and `workflow_run.phase_ended` rebuild progress. A run with no status event yet hasn't started running. No endpoint lists runs. ## Cost and budgets A run's model requests count toward the [session's budget](https://platform.claude.com/docs/en/managed-agents/budgets). A run has no price of its own. The tokens its agents use are billed like the session's other tokens, at each model's rates. For all of a session's charges, see [Claude Managed Agents pricing](https://platform.claude.com/docs/en/about-claude/pricing#claude-managed-agents-pricing). * **One run's usage:** List the session's threads and add up the token counts in `usage` (csharp, go: `Usage`) of the threads with the run's `workflow_run_id` (java: `workflowRunId`; php: `workflowRunID`; csharp, go: `WorkflowRunID`). The list includes archived threads, whose status is `terminated`, so a finished run's threads are counted. Pass each response's `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) as `page` (cli: `--page`; csharp, go: `Page`) until `next_page` (ruby: `next_page_`; java, php: `nextPage`; csharp, go: `NextPage`) is `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`) or missing, and skip a thread with no `usage` (csharp, go: `Usage`). If you add up the threads' `list_cost` (java, php: `listCost`; csharp, go: `ListCost`) instead, the total leaves out session runtime, and each figure is rounded separately. -* **At the budget:** Every open run pauses, and the session reports `idle` with `budget_reached`, or `requires_action` if a tool call is also waiting. Each thread finishes the model request it already started, so a run can pass the budget by one request for each working thread. Raising or removing the budget resumes the runs it paused, unless an interrupt also paused them. If the session's usage includes a model with no list price, only removing the budget does; see [Models without a list price](https://platform.claude.com/docs/en/managed-agents/budgets#models-without-a-list-price). A paused run's lifetime keeps passing, so the run can end with `timeout_error` while it's paused. +* **At the budget:** Every open run pauses, and the session reports `idle` with `budget_reached`, or `requires_action` if a tool call is also waiting. Each thread completes the model request it already started, so a run can pass the budget by one request for each working thread. Raising or removing the budget resumes the runs it paused, unless an interrupt also paused them. If the session's usage includes a model with no list price, only removing the budget does; see [Models without a list price](https://platform.claude.com/docs/en/managed-agents/budgets#models-without-a-list-price). A paused run's lifetime keeps passing, so the run can end with `timeout_error` while it's paused. ## Limits @@ -814,7 +802,7 @@ A session can start any number of runs over its life. * **Starting runs:** Only the agent on the session's primary thread starts runs. An agent working in a run's thread can't start a run of its own, so runs don't nest. * **Ending runs:** No event you send ends a run; archiving the session can. -* **A run's threads:** You can't [stop one by its ID](https://platform.claude.com/docs/en/managed-agents/session-threads#interrupt-a-session-thread), or archive one while its run is open. +* **A run's threads:** You can't [stop a thread by its ID](https://platform.claude.com/docs/en/managed-agents/session-threads#interrupt-a-session-thread), or archive one while its run is open. * **Thread limit:** A run's threads are exempt from the session's [child-thread limit](https://platform.claude.com/docs/en/managed-agents/session-threads#primary-thread-and-session-threads). * **Visibility:** You don't see the workflow's code, but you can ask the agent for the workflow, as the tip in [A run's threads](https://platform.claude.com/docs/en/managed-agents/workflow-runs#a-runs-threads) describes. You also don't see the tool calls the agent makes to start and manage runs, or the result each thread returns to the workflow. diff --git a/content/en/models/fable-5-1/migration-guide.md b/content/en/models/fable-5-1/migration-guide.md index 9b787a267d..f4838c0d94 100644 --- a/content/en/models/fable-5-1/migration-guide.md +++ b/content/en/models/fable-5-1/migration-guide.md @@ -31,15 +31,16 @@ The baseline settings shared by `claude-fable-5-1` and `claude-mythos-5-1`: * **Context window and output:** A [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) by default, and up to 128k output tokens per request. * **Pricing:** $10 USD per million input tokens and $50 USD per million output tokens, the same as Claude Fable 5. Prompt cache reads are $0.25 USD per million tokens, a quarter of the Claude Fable 5 rate. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). * **Data retention:** Both models require 30-day data retention, aren't available under zero data retention (ZDR) arrangements unless expressly authorized by Anthropic, and are designated Covered Models, the same as Claude Fable 5 and Claude Mythos 5. On the Claude API, a request from an organization or workspace without 30-day retention returns a 400 `invalid_request_error`. Organizations with a ZDR arrangement should contact their Anthropic account team, or configure retention per workspace. See [Model-specific data retention requirements](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements) for per-platform details. +* **Priority Tier:** Neither model is supported on [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models). Claude Fable 5 is. Where the two models diverge: * **Availability:** Claude Fable 5.1 doesn't require access approval. Claude Mythos 5.1 is available only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). To request access, apply to the program that covers your use case, or contact your Anthropic account team. -* **Priority Tier:** Neither model is supported on [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models). Claude Fable 5 is. +* **Conversation check on thinking blocks:** [Editing earlier turns](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking) invalidates Claude Fable 5.1's thinking blocks. Claude Mythos 5.1 doesn't run this check. ## Migrating to Claude Fable 5.1 from Claude Fable 5 -Migration is mostly drop-in. The API surface, limits, per-token pricing, tokenizer, always-on adaptive thinking, refusal handling, and `stop_details` categories all match Claude Fable 5. What changes: forced tool choice returns a 400 error; only Claude Fable 5.1 and Claude Mythos 5.1 read Claude Fable 5.1's thinking blocks, and only in the conversation that produced them; cache reads cost less; and agent-loop behavior differs in three ways. The same changes apply to [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-mythos-5-to-claude-mythos-5-1), except the conversation check on thinking blocks, which Claude Mythos 5.1 doesn't run. +Migration is mostly drop-in. The API surface, limits, per-token pricing, tokenizer, always-on adaptive thinking, refusal handling, and `stop_details` categories all match Claude Fable 5. What changes: forced tool choice returns a 400 error; only Claude Fable 5.1 and Claude Mythos 5.1 read Claude Fable 5.1's thinking blocks, and only in the conversation that produced them; cache reads cost less; the advisor tool (beta) accepts fewer advisors; and agent-loop behavior differs in three ways. The same changes apply to [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-mythos-5-to-claude-mythos-5-1), except the conversation check on thinking blocks, which Claude Mythos 5.1 doesn't run. ### Update your model name @@ -182,9 +183,7 @@ model = "claude-mythos-5-1" # After }), ], ToolChoice = new ToolChoiceTool { Name = "record_summary" }, - Messages = [ - new() { Role = Role.User, Content = "Summarize: The meeting moved to Thursday." } - ] + Messages = [new UserMessageParam { Content = "Summarize: The meeting moved to Thursday." }] }; var message = await client.Messages.Create(parameters); @@ -443,7 +442,7 @@ model = "claude-mythos-5-1" # After ], ToolChoice = new ToolChoiceAuto(), Messages = [ - new() { Role = Role.User, Content = "Summarize: The meeting moved to Thursday. Call the record_summary tool with your result." } + new UserMessageParam { Content = "Summarize: The meeting moved to Thursday. Call the record_summary tool with your result." } ] }; @@ -545,7 +544,7 @@ model = "claude-mythos-5-1" # After client = Anthropic::Client.new message = client.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16000, tools: [ { @@ -746,15 +745,14 @@ model = "claude-mythos-5-1" # After }), ], Messages = [ - new() { Role = Role.User, Content = "My headphones from order A1234 arrived yesterday." }, - new() { Role = Role.Assistant, Content = "Thanks for confirming. How can I help with order A1234?" }, - new() { Role = Role.User, Content = "I opened the box. Can I still return them?" }, + new UserMessageParam { Content = "My headphones from order A1234 arrived yesterday." }, + new AssistantMessageParam { Content = "Thanks for confirming. How can I help with order A1234?" }, + new UserMessageParam { Content = "I opened the box. Can I still return them?" }, // The application requires a help center lookup before any policy // answer. Appending the requirement as a system message leaves the // earlier turns unchanged. - new() + new SystemMessageParam { - Role = Role.System, Content = "Tool-use requirement for the current turn: the application requires a call to the search_help_center tool in your response to the user's latest message. Begin your response with the search_help_center tool call. Do not reply with text only." } ] @@ -835,10 +833,7 @@ model = "claude-mythos-5-1" # After // The application requires a help center lookup before any policy // answer. Appending the requirement as a system message leaves the // earlier turns unchanged. - .addMessage(MessageParam.builder() - .role(MessageParam.Role.SYSTEM) - .content("Tool-use requirement for the current turn: the application requires a call to the search_help_center tool in your response to the user's latest message. Begin your response with the search_help_center tool call. Do not reply with text only.") - .build()) + .addSystemMessage("Tool-use requirement for the current turn: the application requires a call to the search_help_center tool in your response to the user's latest message. Begin your response with the search_help_center tool call. Do not reply with text only.") .build(); Message response = client.messages().create(params); @@ -886,7 +881,7 @@ model = "claude-mythos-5-1" # After client = Anthropic::Client.new message = client.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16000, system: "You are a customer support assistant for an online electronics store.", tools: [ @@ -923,7 +918,7 @@ model = "claude-mythos-5-1" # After 2. **Only Claude Fable 5.1 and Claude Mythos 5.1 read Claude Fable 5.1's thinking blocks:** Every `thinking` block records which model produced it. Claude Fable 5.1 reads its own blocks and those from Claude Mythos 5.1, Claude Opus 5, Claude Fable 5, Claude Mythos 5, and earlier Claude models. A conversation moving onto `claude-fable-5-1` from any of those keeps its earlier reasoning. The condition is one-way: apart from Claude Mythos 5.1, none of those models can read Claude Fable 5.1's blocks. - A conversation that ran on Claude Fable 5.1 can land on another model, older or newer, through a router switch, a client-side retry, or a [classifier refusal fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), including a [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback). The API removes the blocks that model can't read before it sees them, the request succeeds, and you aren't billed for the dropped input tokens. The target model re-plans without that reasoning, which can raise cost and latency on the first turn after the switch. To see what was dropped, send the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers): responses then carry an `input_transformations` array naming each dropped block with `reason: "model_binding_mismatch"`. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models). + A conversation that ran on Claude Fable 5.1 can land on another model, older or newer, through a router switch, a client-side retry, or a [classifier refusal fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), including a [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback). The API removes the blocks that model can't read before it receives them, the request succeeds, and you aren't billed for the dropped input tokens. The target model re-plans without that reasoning, which can raise cost and latency on the first turn after the switch. To see what was dropped, send the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers): responses then carry an `input_transformations` array naming each dropped block with `reason: "model_binding_mismatch"`. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models). 3. **Editing earlier turns invalidates thinking blocks:** Each `thinking` block from Claude Fable 5.1 is valid only against the `system` prompt, `tools`, and conversation history that preceded it. If Claude Code, claude.ai, [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview), or the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/overview) manages your conversation history, it already keeps that prefix intact. If your code builds the `messages` array itself, this item applies to you, and [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) is the full integration guide. Where the check is enforced, a request that sends the block back after any of those changed is rejected with a 400 error: @@ -1046,9 +1041,8 @@ model = "claude-mythos-5-1" # After }, Messages = [ - new() + new BetaUserMessageParam { - Role = Role.User, Content = "What is the greatest common divisor of 1071 and 462?", }, ], @@ -1167,7 +1161,7 @@ model = "claude-mythos-5-1" # After client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 16_000, thinking: { type: "adaptive", @@ -1202,7 +1196,7 @@ model = "claude-mythos-5-1" # After * Append-only histories: adding turns and passing earlier turns back exactly as sent and received, including appended `role: "system"` messages. * Removing thinking blocks from earlier assistant turns, oldest first. - * Changing `effort`, `max_tokens`, or any other request parameter outside `system`, `tools`, and `messages`, and adding or moving `cache_control` markers. + * Changing `effort`, `max_tokens`, or any other request parameter outside `model`, `system`, `tools`, and `messages`, and adding or moving `cache_control` markers. * Server-side compaction and context editing, including [thinking block clearing](https://platform.claude.com/docs/en/build-with-claude/context-editing#thinking-block-clearing). They don't count as edits, because the check compares the conversation as you sent it. To check an existing integration: @@ -1213,9 +1207,11 @@ model = "claude-mythos-5-1" # After Dropping thinking blocks once, at a compaction boundary for example, has little effect. An integration that invalidates prior thinking on every request restarts the prompt cache each time, which can raise cost per task (see [Keep the conversation history append-only](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#keep-the-conversation-history-append-only)). +4. **The advisor tool accepts fewer advisors:** With the [advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) (beta), the advisor must be at least as capable as the executor. With a `claude-fable-5-1` executor, a less capable advisor, such as `claude-fable-5` or `claude-opus-5-5`, returns a 400 `invalid_request_error`. Choose an advisor from the executor's row in the [compatibility table](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#model-compatibility). + ### Behavior changes -1. **Fewer parallel tool calls in long agent loops:** In long-running loops where the next independent reads are only implied by the task (custom coding agents, bash-and-editor harnesses, computer use), Claude Fable 5.1 may issue one tool call per turn. Each extra turn costs tokens, a round trip, and wall-clock time. Append a one-sentence batching instruction after each user message as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`, beta), or, without the beta, in a text block after the `tool_result` blocks, and leave the earlier copies in the history on later requests. See [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops). +1. **Fewer parallel tool calls in long agent loops:** In long-running loops where the next independent reads are only implied by the task (custom coding agents, bash-and-editor harnesses, computer use), Claude Fable 5.1 might issue one tool call in each turn. Each extra turn costs tokens, a round trip, and wall-clock time. Append a one-sentence batching instruction after each user message as a [turn-scoped system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages) (`clear_at: "next_user_message"`, beta), or, without the beta, in a text block after the `tool_result` blocks, and leave the earlier copies in the history on later requests. See [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops). 2. **Fewer progress messages between tool calls:** Claude Fable 5.1 writes fewer status updates during long tool sequences than Claude Fable 5, and its agentic coding summaries are shorter. If your interface renders those updates, set `thinking.display` to `"updates"` (beta) or `"summarized"` and prompt for them explicitly. See [Progress updates between tool calls](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) and [Ask for user-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#ask-for-user-facing-progress-updates). @@ -1345,16 +1341,15 @@ These changes aren't required, but each one lowers cost or latency or removes a OutputConfig = new() { Effort = Effort.High }, Messages = [ - new() { Role = Role.User, Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, - new() { Role = Role.Assistant, Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, + new BetaUserMessageParam { Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, + new BetaAssistantMessageParam { Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, // Effort-only system message: the new level takes effect from the next user turn. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new([]), OutputConfig = new() { Effort = BetaSystemMessageOutputConfigEffort.Low }, }, - new() { Role = Role.User, Content = "Summarize the plan in one sentence." }, + new BetaUserMessageParam { Content = "Summarize the plan in one sentence." }, ], Betas = [AnthropicBeta.MidConversationOutputConfig2026_07_01], }); @@ -1405,9 +1400,9 @@ These changes aren't required, but each one lowers cost or latency or removes a ```java Java import com.anthropic.models.beta.AnthropicBeta; import com.anthropic.models.beta.messages.BetaMessage; - import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaOutputConfig; import com.anthropic.models.beta.messages.BetaSystemMessageOutputConfig; + import com.anthropic.models.beta.messages.BetaSystemMessageParam; import com.anthropic.models.beta.messages.MessageCreateParams; import com.anthropic.models.messages.Model; @@ -1424,9 +1419,8 @@ These changes aren't required, but each one lowers cost or latency or removes a .addUserMessage("Plan a migration from SQLite to PostgreSQL in three short steps.") .addAssistantMessage("1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts.") // Effort-only system message: the new level takes effect from the next user turn. - .addMessage(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) - .contentOfBetaContentBlockParams(List.of()) + .addMessage(BetaSystemMessageParam.builder() + .contentOfBlocks(List.of()) .outputConfig(BetaSystemMessageOutputConfig.builder() .effort(BetaSystemMessageOutputConfig.Effort.LOW) .build()) @@ -1479,7 +1473,7 @@ These changes aren't required, but each one lowers cost or latency or removes a client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 4096, output_config: {effort: :high}, messages: [ @@ -1518,6 +1512,7 @@ These changes aren't required, but each one lowers cost or latency or removes a * Update the model name from `claude-fable-5` to `claude-fable-5-1` (or `claude-mythos-5` to `claude-mythos-5-1`). * Replace forced `tool_choice` (`{type: "any"}` or `{type: "tool", ...}`). It returns a 400 error. Use `{type: "auto"}` plus an explicit instruction and `strict: true` tools, or JSON outputs. Put the instruction in the `user` turn, or in a mid-conversation `role: "system"` message when your application requires the call. +* If you use the [advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) (beta), update the advisor `model` as well. An advisor less capable than Claude Fable 5.1, such as `claude-fable-5` or `claude-opus-5-5`, returns a 400 error. * Keep passing `thinking` blocks back unchanged on every turn, including empty ones. Claude Fable 5.1 reads blocks from Claude Opus 5, Claude Fable 5, Claude Mythos 5, and earlier models. Moving a conversation from Claude Fable 5.1 to any model other than Claude Mythos 5.1 drops its blocks. * If your code builds the `messages` array itself, check whether it [edits earlier turns](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking): run a session with the `thinking-binding-controls-2026-08-01` beta header and `prefix_mismatch_behavior: "drop_block"`, log `input_transformations`, and fix every `prefix_binding_mismatch`. `model_binding_mismatch` entries after a model switch are expected. * Keep conversation history append-only: freeze `system` and `tools` at session start and move mid-session changes to `role: "system"` messages and `tool_addition` / `tool_removal` blocks, send per-turn reminders as turn-scoped system messages you never remove, trim context server-side or strip thinking blocks from any turns you carry across a client-side summary, and reference cross-turn files by `file_id`. @@ -1527,6 +1522,7 @@ These changes aren't required, but each one lowers cost or latency or removes a * If you change effort between requests, move the change to a [per-message effort](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) `role: "system"` message (beta) to keep cache hits. * Handle `stop_reason: "refusal"` and read `stop_details.category`. Consider `fallbacks: "default"` (beta). * Re-evaluate `effort` with a fresh sweep, starting at `high`, and re-baseline cost and latency on your own workloads. The tokenizer is unchanged. Prompt cache reads cost a quarter of the Claude Fable 5 rate. +* If you have a [Priority Tier commitment](https://platform.claude.com/docs/en/api/service-tiers#existing-priority-tier-commitments) for your current model, it doesn't cover Claude Fable 5.1, which isn't supported on Priority Tier. ## Migrating to Claude Fable 5.1 from Claude Opus 5 @@ -1544,11 +1540,11 @@ model = "claude-mythos-5-1" # After ### What changed -1. **Thinking can no longer be disabled:** Claude Opus 5 accepts `thinking: {type: "disabled"}` at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or lower. On `claude-fable-5-1` and `claude-mythos-5-1`, [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on, and `thinking: {type: "disabled"}` returns a 400 error at any effort level. Remove the field, control token spend with lower effort levels, and revisit `max_tokens` for workloads that ran with thinking disabled. +1. **Thinking can no longer be disabled:** Claude Opus 5 accepts `thinking: {type: "disabled"}` at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or lower. On `claude-fable-5-1` and `claude-mythos-5-1`, [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on, and `thinking: {type: "disabled"}` returns a 400 error at any effort level. Remove the field, control token spend with lower effort levels, and revisit `max_tokens` for workloads that ran with thinking disabled. Responses from those workloads can now start with `thinking` blocks, so select content blocks by `type` instead of by position. 2. **Forced tool choice is not supported:** Claude Opus 5 accepts `tool_choice` `any` and `tool`. `claude-fable-5-1` returns a 400 error. See [Breaking changes](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-breaking-changes). -3. **Preserved thinking across models:** Claude Fable 5.1 reads Claude Opus 5's thinking blocks: conversations moving from `claude-opus-5` to `claude-fable-5-1` keep their reasoning. Claude Opus 5 can't read Claude Fable 5.1's blocks. Claude Fable 5.1's blocks also [stop being valid when earlier turns change](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking): if your code edits earlier messages, rebuilds `system` or `tools`, or compacts on the client between requests, Claude Opus 5 didn't object, but `claude-fable-5-1` rejects or drops every later thinking block. Run the three-step check in that section before switching traffic. See [Breaking changes](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-breaking-changes). +3. **Preserved thinking across models:** Claude Fable 5.1 reads Claude Opus 5's thinking blocks: conversations moving from `claude-opus-5` to `claude-fable-5-1` keep their reasoning. Claude Opus 5 can't read Claude Fable 5.1's blocks. Claude Fable 5.1's blocks also [stop being valid when earlier turns change](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking): if your code edits earlier messages, rebuilds `system` or `tools`, or compacts on the client between requests, Claude Opus 5 returns no error, but `claude-fable-5-1` rejects or drops every later thinking block. Run the three-step check in that section before switching traffic. See [Breaking changes](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-breaking-changes). 4. **Text between tool calls is returned in thinking blocks:** On Claude Opus 5, text the model writes between tool calls comes back as `text` blocks. On `claude-fable-5-1`, as on Claude Fable 5, that narration comes back as progress-update `thinking` blocks, one before each tool call. Under the default `thinking.display` of `"omitted"`, they carry no readable text. If your interface renders that narration, set `display: "updates"` (beta) to receive progress updates as text while reasoning stays hidden, or `"summarized"` to receive both. Then render the non-empty `thinking` blocks between `tool_use` blocks. See [Progress updates between tool calls](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). @@ -1563,14 +1559,15 @@ model = "claude-mythos-5-1" # After * If your organization has a zero data retention (ZDR) arrangement, confirm eligibility first: these models aren't available under ZDR unless expressly authorized by Anthropic. See [Model-specific data retention requirements](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements). * Update the model name from `claude-opus-5` to `claude-fable-5-1` (or `claude-mythos-5-1`). * Remove any `thinking: {type: "disabled"}` configuration: it returns a 400 error on `claude-fable-5-1`. Control token spend with lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) levels, and revisit `max_tokens`. +* If you removed `thinking: {type: "disabled"}`, update response parsing that reads content by position, such as `content[0].text`: a response can now start with `thinking` blocks, so select content blocks by `type` instead. * Replace forced `tool_choice` (`any` or `tool`) with `auto` plus an explicit instruction (`user` turn or mid-conversation system message) and `strict: true` tools, or with JSON outputs. * If your interface renders text between tool calls, set `display: "updates"` (beta) or `"summarized"` and render the non-empty `thinking` blocks. -* Apply the preserved-thinking, history-editing, behavior, effort, and fallback items from the [Claude Fable 5 checklist](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migration-checklist-fable-5-1-from-fable-5). +* Apply the advisor, preserved-thinking, history-editing, behavior, effort, and fallback items from the [Claude Fable 5 checklist](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migration-checklist-fable-5-1-from-fable-5). * Re-baseline cost on your own workloads. The tokenizer is unchanged. Per-token pricing differs. ## Migrating to Claude Fable 5.1 from Claude Opus 4.8 or earlier -Work through the checklist below. On Claude Opus 4.7 or earlier, start with the matching [Claude Opus 5.5 migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide) section. +Work through the following checklist. On Claude Opus 4.7 or earlier, start with the matching [Claude Opus 5.5 migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide) section. ### Update your model name @@ -1590,16 +1587,16 @@ model = "claude-mythos-5-1" # After * Update response parsing that reads content by position, such as `content[0].text`: a response can now start with `thinking` blocks, so select content blocks by `type` instead. * Replace forced `tool_choice` (`any` or `tool`) with `auto` plus an explicit instruction (`user` turn or mid-conversation system message) and `strict: true` tools, or with JSON outputs. * Pass `thinking` blocks back unchanged and treat their text as display-only. Claude Fable 5.1 reads Claude Opus 4.8's thinking blocks: a conversation that moves onto `claude-fable-5-1` keeps its earlier reasoning. Claude Opus 4.8 can't read Claude Fable 5.1's blocks. -* If your code builds the `messages` array itself, check whether it [edits earlier turns](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking). Integrations written for Claude Opus 4.8 and earlier often truncate old turns, strip or rebuild earlier messages, or refresh the `system` prompt each request, and Claude Opus 4.8 never objected. On `claude-fable-5-1` each of those invalidates later thinking blocks. +* If your code builds the `messages` array itself, check whether it [edits earlier turns](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking). Integrations written for Claude Opus 4.8 and earlier often truncate old turns, strip or rebuild earlier messages, or refresh the `system` prompt each request, and Claude Opus 4.8 returns no error for any of them. On `claude-fable-5-1` each of those invalidates later thinking blocks. * Handle `stop_reason: "refusal"`, read `stop_details.category`, and consider `fallbacks: "default"` (beta). -* Apply the preserved-thinking, history-editing, behavior, per-message effort, and progress-update items from the [Claude Fable 5 checklist](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migration-checklist-fable-5-1-from-fable-5). +* Apply the advisor, Priority Tier, preserved-thinking, history-editing, behavior, per-message effort, and progress-update items from the [Claude Fable 5 checklist](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migration-checklist-fable-5-1-from-fable-5). * Re-evaluate `effort` (start at `high`), review prompts near the 512-token [caching minimum](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations) (1,024 tokens on Claude Opus 4.8), and re-baseline cost and latency. Per-token pricing differs, and thinking tokens are billed as output tokens, so workloads that ran without thinking on Claude Opus 4.8 can produce more output tokens per request. ## Migrating to Claude Mythos 5.1 from Claude Mythos 5 [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/mythos-5-1/overview) is the counterpart to Claude Fable 5.1 for organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). Confirm that your organization has access to Claude Mythos 5.1 before you switch model IDs. -The API-level delta matches [Migrating to Claude Fable 5.1 from Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-fable-5-to-claude-fable-5-1): forced tool choice returns a 400 error, and only Claude Mythos 5.1 and Claude Fable 5.1 read Claude Mythos 5.1's thinking blocks (Claude Mythos 5.1 reads Claude Mythos 5's blocks, not the reverse). Unlike Claude Fable 5.1, Claude Mythos 5.1 doesn't run the conversation check, so editing earlier turns doesn't [invalidate thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking), though it still restarts the prompt cache. +The API-level delta matches [Migrating to Claude Fable 5.1 from Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-fable-5-to-claude-fable-5-1): forced tool choice returns a 400 error, the advisor tool accepts fewer advisors, and only Claude Mythos 5.1 and Claude Fable 5.1 read Claude Mythos 5.1's thinking blocks (Claude Mythos 5.1 reads Claude Mythos 5's blocks, not the reverse). Unlike Claude Fable 5.1, Claude Mythos 5.1 doesn't run the conversation check, so editing earlier turns doesn't [invalidate thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking), though it still restarts the prompt cache. ### Update your model name @@ -1615,5 +1612,5 @@ model = "claude-mythos-5-1" # After * Handle `stop_reason: "refusal"` and read `stop_details.category` before response content. See [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback). * Keep passing `thinking` blocks back unchanged on every turn, including empty ones. * If your code builds the `messages` array itself, keep conversation history append-only to keep the prompt cache warm. Claude Mythos 5.1 doesn't run the [conversation check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation), so edits don't invalidate its thinking blocks. -* Apply the behavior and recommended changes from the [Claude Fable 5 section](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-fable-5-to-claude-fable-5-1), except the history-editing items, which don't apply to Claude Mythos 5.1. +* Apply the advisor, behavior, and recommended changes from the [Claude Fable 5 section](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-fable-5-to-claude-fable-5-1), except the history-editing items, which don't apply to Claude Mythos 5.1. * Re-evaluate `effort` with a fresh sweep and re-baseline cost and latency. Prompt cache reads cost a quarter of the Claude Mythos 5 rate. diff --git a/content/en/models/fable-5-1/overview.md b/content/en/models/fable-5-1/overview.md index 52689e79ca..a852dc0194 100644 --- a/content/en/models/fable-5-1/overview.md +++ b/content/en/models/fable-5-1/overview.md @@ -1,7 +1,7 @@ --- title: Claude Fable 5.1 url: https://platform.claude.com/docs/en/models/fable-5-1/overview -description: "Claude Fable 5.1 at a glance: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and resources for building with it." +description: "An overview of Claude Fable 5.1: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and resources for building with it." --- **Latest.** Released September 1, 2026. @@ -16,9 +16,9 @@ Context window: 1M tokens · Max output: 128K tokens · Input pricing: $10 / MTo ## Overview -Claude Fable 5.1 extends Claude Fable 5 at the same input and output prices, with cache reads at a quarter of the cost, and brings stronger long-running agentic coding, multistep research, and document, spreadsheet, and slide work. For most workloads, start with Claude Opus 5.5 (see [Choosing a model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model)). Use Claude Fable 5.1 for demanding reasoning and long-horizon agentic work, or when your evals on Claude Opus 5.5 at higher effort still fall short. Claude Mythos 5.1 offers the same capabilities only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). +Claude Fable 5.1 extends Claude Fable 5 at the same input and output prices, with cache reads at a quarter of the cost, and brings stronger long-running agentic coding, multistep research, and document, spreadsheet, and slide work. For most workloads, start with Claude Opus 5.5 (see [Choosing a model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model)). Use Claude Fable 5.1 for demanding reasoning and long-horizon agentic work, or when your evals on Claude Opus 5.5 at higher effort still don't meet your requirements. Claude Mythos 5.1 offers the same capabilities only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). -If you already call Claude Fable 5, three changes are breaking: [forced tool use returns an error](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#forced-tool-use-is-not-supported), [only Claude Fable 5.1 and Claude Mythos 5.1 can read Claude Fable 5.1's thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#thinking-blocks-are-tied-to-the-model-that-produced-them), and [editing earlier turns invalidates thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#editing-earlier-turns-invalidates-thinking-blocks). Five are additive: [per-message effort](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) (beta), [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta) (beta), [readable progress updates between tool calls](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#progress-updates-between-tool-calls-beta) (`display: "updates"`, beta), a [lower cache read price](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing), and [content provenance](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#content-provenance). +If you already call Claude Fable 5, four changes are breaking: [forced tool use returns an error](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#forced-tool-use-is-not-supported), [only Claude Fable 5.1 and Claude Mythos 5.1 can read Claude Fable 5.1's thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#thinking-blocks-are-tied-to-the-model-that-produced-them), [editing earlier turns invalidates thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#editing-earlier-turns-invalidates-thinking-blocks), and [some advisor tool pairings are not supported](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#advisor-tool-pairings). Five are additive: [per-message effort](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) (beta), [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta) (beta), [readable progress updates between tool calls](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#progress-updates-between-tool-calls-beta) (`display: "updates"`, beta), a [lower cache read price](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing), and [content provenance](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#content-provenance). [What's new in Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1) diff --git a/content/en/models/fable-5-1/whats-new-fable-5-1.md b/content/en/models/fable-5-1/whats-new-fable-5-1.md index 5b62eadab4..254da23e8b 100644 --- a/content/en/models/fable-5-1/whats-new-fable-5-1.md +++ b/content/en/models/fable-5-1/whats-new-fable-5-1.md @@ -4,9 +4,9 @@ url: https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1 description: Overview of new features, breaking changes, and capability improvements in Claude Fable 5.1 and Claude Mythos 5.1. --- -Claude Fable 5.1 extends Claude Fable 5 at the same input and output prices, with cache reads at a quarter of the cost, and brings stronger long-running agentic coding, multistep research, and document, spreadsheet, and slide work. For most workloads, start with Claude Opus 5.5 (see [Choosing a model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model)). Use Claude Fable 5.1 for demanding reasoning and long-horizon agentic work, or when your evals on Claude Opus 5.5 at higher effort still fall short. Claude Mythos 5.1 offers the same capabilities only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). +Claude Fable 5.1 extends Claude Fable 5 at the same input and output prices, with cache reads at a quarter of the cost, and brings stronger long-running agentic coding, multistep research, and document, spreadsheet, and slide work. For most workloads, start with Claude Opus 5.5 (see [Choosing a model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model)). Use Claude Fable 5.1 for demanding reasoning and long-horizon agentic work, or when your evals on Claude Opus 5.5 at higher effort still don't meet your requirements. Claude Mythos 5.1 offers the same capabilities only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). -If you already call Claude Fable 5, three changes are breaking: [forced tool use returns an error](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#forced-tool-use-is-not-supported), [only Claude Fable 5.1 and Claude Mythos 5.1 can read Claude Fable 5.1's thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#thinking-blocks-are-tied-to-the-model-that-produced-them), and [editing earlier turns invalidates thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#editing-earlier-turns-invalidates-thinking-blocks). Five are additive: [per-message effort](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) (beta), [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta) (beta), [readable progress updates between tool calls](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#progress-updates-between-tool-calls-beta) (`display: "updates"`, beta), a [lower cache read price](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing), and [content provenance](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#content-provenance). +If you already call Claude Fable 5, four changes are breaking: [forced tool use returns an error](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#forced-tool-use-is-not-supported), [only Claude Fable 5.1 and Claude Mythos 5.1 can read Claude Fable 5.1's thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#thinking-blocks-are-tied-to-the-model-that-produced-them), [editing earlier turns invalidates thinking blocks](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#editing-earlier-turns-invalidates-thinking-blocks), and [some advisor tool pairings are not supported](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#advisor-tool-pairings). Five are additive: [per-message effort](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) (beta), [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta) (beta), [readable progress updates between tool calls](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#progress-updates-between-tool-calls-beta) (`display: "updates"`, beta), a [lower cache read price](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing), and [content provenance](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#content-provenance). ## Models @@ -20,7 +20,7 @@ Claude Fable 5.1 and Claude Mythos 5.1 share specs and pricing: * **Context window and output:** a [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) (default and maximum) at standard per-token pricing across the whole window, and 128k max output tokens. * **Thinking:** [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on. Use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control thinking depth. * **Pricing:** the same as Claude Fable 5, except for a [lower cache read price](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing). -* **Tokenizer:** the same as Claude Fable 5 (introduced with Claude Opus 4.7). Compared with models older than Claude Opus 4.7, the same text produces roughly 30% more tokens. See [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting). +* **Tokenizer:** the same as Claude Fable 5 (introduced with Claude Opus 4.7). Compared with models older than Claude Opus 4.7, the same text produces roughly 30 percent more tokens. See [Token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting). For all current models, see the [models overview](https://platform.claude.com/docs/en/models/overview). @@ -42,7 +42,7 @@ Thinking is always on for these models, and a forced tool call would skip it. Th Every thinking block records which model produced it. Claude Fable 5.1 reads earlier models' thinking blocks, but only Claude Fable 5.1 and Claude Mythos 5.1 read Claude Fable 5.1's. A conversation that moves onto Claude Fable 5.1 (from Claude Opus 5, Claude Fable 5, or any earlier Claude model) keeps its reasoning. A conversation that moves from Claude Fable 5.1 to any other model loses it for the turns that run there. -When a request carries a block the target model can't read (a router or fallback that switches models mid-conversation, for example), the API drops the block before the model sees it. Dropped blocks don't count toward `input_tokens` and aren't billed. With the `thinking-binding-controls-2026-08-01` beta header, the drop is reported in a top-level `input_transformations` array. Without it, the drop is silent. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models). +When a request carries a block the target model can't read (a router or fallback that switches models mid-conversation, for example), the API drops the block before the model receives it. Dropped blocks don't count toward `input_tokens` and aren't billed. With the `thinking-binding-controls-2026-08-01` beta header, the drop is reported in a top-level `input_transformations` array. Without it, the drop is silent. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models). ### Editing earlier turns invalidates thinking blocks @@ -50,10 +50,10 @@ Modifying anything before a Claude Fable 5.1 thinking block (the `system` prompt These patterns invalidate every later thinking block: -* Editing, reordering, or removing an earlier turn while keeping later ones. -* Injecting per-request text into an earlier turn (a reminder or status line) that you remove on the next request. -* Rebuilding the top-level `system` prompt or `tools` array between requests in the same conversation. -* An image or document URL that serves different bytes on a later request (the check covers the bytes, not the URL, so a rotating signed URL for the same file is fine). +* Editing, reordering, or removing an earlier turn while keeping later ones +* Injecting per-request text into an earlier turn (a reminder or status line) that you remove on the next request +* Rebuilding the top-level `system` prompt or `tools` array between requests in the same conversation +* Using an image or document URL that serves different bytes on a later request (the check covers the bytes, not the URL, so a rotating signed URL for the same file is fine) These keep later blocks valid: removing a leading run of thinking blocks (oldest first), letting server-side compaction or context editing trim the history, moving `cache_control` markers, and changing `effort` between requests. Removing a thinking block from anywhere other than the start of the run invalidates every thinking block after it. @@ -61,6 +61,10 @@ Where the check is enforced, a request that replays an invalidated block is reje To keep thinking valid across a long session, treat the conversation as append-only. Add instructions with a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) ([turn-scoped](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta) if it should apply to one turn only) and change tools with [mid-conversation tool changes](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#mid-conversation-tool-changes) rather than editing `system` or `tools`. Trim context with server-side [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) or [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction), which don't count as edits. These patterns also keep the [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) warm. To find out whether your integration edits history, run a session with `prefix_mismatch_behavior: "drop_block"` and log `input_transformations`: the [migration guide](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking) has the three-step check. See [Keeping the prefix unchanged](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#prefix-check) for the full rules. +### Some advisor tool pairings are not supported + +With the [advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool) (beta), the advisor must be at least as capable as the executor. Claude Mythos 5, Claude Fable 5, Claude Opus 5.5, and Claude Opus 5 advisors work with a Claude Fable 5 or Claude Mythos 5 executor. With a Claude Fable 5.1 or Claude Mythos 5.1 executor, they return a 400 `invalid_request_error`. See the advisor tool's [Model compatibility](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#model-compatibility). + ## New features ### Change effort mid-conversation (beta) @@ -182,16 +186,15 @@ On Claude Fable 5.1 you can change the [effort](https://platform.claude.com/docs OutputConfig = new() { Effort = Effort.High }, Messages = [ - new() { Role = Role.User, Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, - new() { Role = Role.Assistant, Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, + new BetaUserMessageParam { Content = "Plan a migration from SQLite to PostgreSQL in three short steps." }, + new BetaAssistantMessageParam { Content = "1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts." }, // Effort-only system message: the new level takes effect from the next user turn. - new() + new BetaSystemMessageParam { - Role = Role.System, Content = new([]), OutputConfig = new() { Effort = BetaSystemMessageOutputConfigEffort.Low }, }, - new() { Role = Role.User, Content = "Summarize the plan in one sentence." }, + new BetaUserMessageParam { Content = "Summarize the plan in one sentence." }, ], Betas = [AnthropicBeta.MidConversationOutputConfig2026_07_01], }); @@ -242,9 +245,9 @@ On Claude Fable 5.1 you can change the [effort](https://platform.claude.com/docs ```java Java import com.anthropic.models.beta.AnthropicBeta; import com.anthropic.models.beta.messages.BetaMessage; - import com.anthropic.models.beta.messages.BetaMessageParam; import com.anthropic.models.beta.messages.BetaOutputConfig; import com.anthropic.models.beta.messages.BetaSystemMessageOutputConfig; + import com.anthropic.models.beta.messages.BetaSystemMessageParam; import com.anthropic.models.beta.messages.MessageCreateParams; import com.anthropic.models.messages.Model; @@ -261,9 +264,8 @@ On Claude Fable 5.1 you can change the [effort](https://platform.claude.com/docs .addUserMessage("Plan a migration from SQLite to PostgreSQL in three short steps.") .addAssistantMessage("1. Export the SQLite data. 2. Create the PostgreSQL schema. 3. Import the data and verify row counts.") // Effort-only system message: the new level takes effect from the next user turn. - .addMessage(BetaMessageParam.builder() - .role(BetaMessageParam.Role.SYSTEM) - .contentOfBetaContentBlockParams(List.of()) + .addMessage(BetaSystemMessageParam.builder() + .contentOfBlocks(List.of()) .outputConfig(BetaSystemMessageOutputConfig.builder() .effort(BetaSystemMessageOutputConfig.Effort.LOW) .build()) @@ -316,7 +318,7 @@ On Claude Fable 5.1 you can change the [effort](https://platform.claude.com/docs client = Anthropic::Client.new response = client.beta.messages.create( - model: "claude-fable-5-1", + model: Anthropic::Model::CLAUDE_FABLE_5_1, max_tokens: 4096, output_config: {effort: :high}, messages: [ @@ -339,7 +341,7 @@ See [Per-message effort](https://platform.claude.com/docs/en/build-with-claude/e ### Turn-scoped system messages (beta) -A [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) can be scoped to one turn. Set `clear_at: "next_user_message"` on a `role: "system"` message and its text carries system-prompt authority for the current turn, then stops rendering once a later `user` message exists. The message stays in `messages` and you keep sending it back verbatim, so nothing earlier in the conversation changes. The [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) keeps matching, later [thinking blocks stay valid](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation), and a cleared message costs no input tokens. Use it for per-turn reminders in a tool loop ("check your inbox before running more code", "the user can't see that tool output") instead of injecting text into the history and deleting it on the next request. Turn-scoped system messages are in beta: include the `mid-conversation-system-clear-at-2026-08-21` beta header. See [Turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages). +A [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) can be scoped to one turn. Set `clear_at: "next_user_message"` on a `role: "system"` message and its text carries system-prompt authority for the current turn, then stops rendering once a later `user` message exists. The message stays in `messages` and you keep sending it back verbatim, so nothing earlier in the conversation changes. The [prompt cache](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) keeps matching, later [thinking blocks stay valid](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation), and a cleared message costs no input tokens. Use it for per-turn reminders in a tool loop ("check your inbox before running more code," "the user can't see that tool output") instead of injecting text into the history and deleting it on the next request. Turn-scoped system messages are in beta: include the `mid-conversation-system-clear-at-2026-08-21` beta header. See [Turn-scoped system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages#turn-scoped-system-messages). ```json { @@ -365,7 +367,7 @@ The watermark doesn't change the meaning, quality, or readability of the output. Claude Fable 5.1 differs from Claude Fable 5 in several ways that show up without any code change. Each has a prompting fix in [Prompting Claude Fable 5.1](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1): -* **Parallel tool calling is more variable.** Claude Fable 5.1 may issue one tool call per turn where Claude Fable 5 batched several. This shows up in long agent loops where the next independent reads are only implied: custom coding agents, bash-and-editor harnesses, computer use. The extra turns cost tokens, round trips, and wall-clock time but don't reduce answer quality. Requests naming several things to fetch still run in parallel. Add the one-line batching instruction from [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops). +* **Parallel tool calling is more variable.** Claude Fable 5.1 might issue one tool call in each turn where Claude Fable 5 batched several. This shows up in long agent loops where the next independent reads are only implied: custom coding agents, bash-and-editor harnesses, computer use. The extra turns cost tokens, round trips, and wall-clock time but don't reduce answer quality. Requests naming several things to fetch still run in parallel. Add the one-line batching instruction from [Batch independent tool calls in agent loops](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#batch-independent-tool-calls-in-agent-loops). * **Fewer progress updates during long tool runs.** The model writes less user-facing text between tool calls, especially at higher effort. Set `thinking.display` to `"updates"` (beta) to receive the [progress updates](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) it does write, and remove any prompt line that tells it to hold findings for the final response. If your UI depends on narration, ask explicitly for an opening line, periodic updates, and a closing recap. See [Ask for user-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#ask-for-user-facing-progress-updates). * **Answers from memory more often at `low` effort.** At the lowest effort level the model calls a search or retrieval tool less often. Raise effort for turns that need fresh information, including [mid-conversation](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta), or add the verification nudge from [Search triggering at low effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#search-triggering-at-low-effort). * **Denser prose in places.** In some cases its prose is denser than Claude Fable 5's, with longer sentences and fewer paragraph breaks. See [Writing density](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1#writing-density). @@ -381,7 +383,7 @@ These Messages API behaviors carry over from Claude Fable 5 unchanged: * `thinking.display` defaults to `"omitted"`. `"summarized"` is available, and the raw chain of thought is never returned. * Reasoning between tool calls appears in thinking blocks rather than text, and [interleaved thinking](https://platform.claude.com/docs/en/build-with-claude/thinking#interleaved-thinking) is automatic with no beta header. * Prefilling the assistant response returns a 400 error. -* Non-default `temperature`, `top_p`, or `top_k` values return a 400 error. +* Setting `temperature`, `top_p`, or `top_k` returns a 400 error. * The minimum cacheable prompt length is 512 tokens. * [Mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) and tool changes are supported. @@ -389,14 +391,14 @@ These Messages API behaviors carry over from Claude Fable 5 unchanged: Claude Fable 5.1 improves on Claude Fable 5, and the gap is widest at higher [effort](https://platform.claude.com/docs/en/build-with-claude/effort) levels. The gains concentrate in six areas: -* **Agentic coding over long sessions**, including multi-file features, large refactors and migrations, debugging, and code review across sessions that run for hours. +* **Agentic coding over long sessions**, including multifile features, large refactors and migrations, debugging, and code review across sessions that run for hours. * **Knowledge work with documents, spreadsheets, and slides**, taking an analysis from a first question to a finished document, live-formula spreadsheet, or slide deck built from a blank page. * **Research and search**, with higher accuracy on multistep web research and deep-research tasks that follow up on what they find. * **Vision**, reading dense charts, filings, and tables nested in PDFs, including with crop-and-zoom tools on charts. * **Long-context work**, reasoning over and connecting details across the full [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows). * **Computer use**, operating a browser and desktop applications more reliably and recovering from failed steps. -Multilingual performance is on par with Claude Fable 5. +Multilingual performance is comparable to Claude Fable 5. ## Refusals, fallback, and billing @@ -416,7 +418,7 @@ Claude Fable 5.1 and Claude Mythos 5.1 are priced the same as Claude Fable 5, ex Cache reads (hits and refreshes) cost 0.025 times the base input price on these models, compared with 0.05 on Claude Opus 5.5 and Claude Sonnet 5.5, and 0.1 on other Claude models. Long agentic sessions that re-read a cached prefix pay a quarter of the Claude Fable 5 rate. Cache writes and the [512-token minimum cacheable prompt length](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations) are unchanged. -[Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) is $5 USD per million input tokens and $25 USD per million output tokens. See [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for data residency and tool pricing. +[Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) is $5 USD per million input tokens and $25 USD per million output tokens. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing) for data residency and tool pricing. ## Availability @@ -475,10 +477,11 @@ To migrate from Claude Fable 5, update your model ID: Then review these items: 1. Remove any `tool_choice` of type `any` or `tool`. Move schema enforcement to [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use) with `tool_choice: {"type": "auto"}` or to [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs). -2. Pass thinking blocks back unchanged and keep the history append-only. If your code builds the `messages` array itself, run the [history-editing check](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking): move per-turn reminders you currently inject and delete to [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta), move `system` and `tools` changes to mid-conversation system messages, trim context server-side or strip thinking blocks from turns you carry across a client-side summary, then pick a production [`prefix_mismatch_behavior`](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls) and monitor `input_transformations`. -3. Re-tune effort from the default (`high`), and consider [changing it mid-conversation](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) instead of holding one level for the whole session. -4. In agent loops, watch for one tool call per turn where Claude Fable 5 batched several, and add the per-turn note from [Prompting Claude Fable 5.1](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1). -5. Re-run your evals. Refusal handling, fallback, fallback credit, and the tokenizer carry over unchanged. Cache reads cost less (see [Pricing](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing)), and default behavior differs in the ways listed under [Changed from Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#changed-from-claude-fable-5). +2. If you use the advisor tool (beta), choose an advisor at least as capable as Claude Fable 5.1. See [Some advisor tool pairings are not supported](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#advisor-tool-pairings). +3. Pass thinking blocks back unchanged and keep the history append-only. If your code builds the `messages` array itself, run the [history-editing check](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-preserved-thinking): move per-turn reminders you currently inject and delete to [turn-scoped system messages](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#turn-scoped-system-messages-beta), move `system` and `tools` changes to mid-conversation system messages, trim context server-side or strip thinking blocks from turns you carry across a client-side summary, then pick a production [`prefix_mismatch_behavior`](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-thinking-controls) and monitor `input_transformations`. +4. Re-tune effort from the default (`high`), and consider [changing it mid-conversation](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#change-effort-mid-conversation-beta) instead of holding one level for the whole session. +5. In agent loops, watch for one tool call per turn where Claude Fable 5 batched several, and add the per-turn note from [Prompting Claude Fable 5.1](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1). +6. Re-run your evals. Refusal handling, fallback, fallback credit, and the tokenizer carry over unchanged. Cache reads cost less (see [cache read prices](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#pricing)), and default behavior differs in the ways listed under [Changed from Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1#changed-from-claude-fable-5). See the [migration guide](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide) for step-by-step instructions, including from Claude Opus 5 and earlier models. diff --git a/content/en/models/fable-5/overview.md b/content/en/models/fable-5/overview.md index 95ff16b4e7..df02fc4988 100644 --- a/content/en/models/fable-5/overview.md +++ b/content/en/models/fable-5/overview.md @@ -14,7 +14,7 @@ Context window: 1M tokens · Max output: 128K tokens · Input pricing: $10 / MTo [Announcement](https://www.anthropic.com/news/claude-fable-5-mythos-5) -## Fable vs. Mythos +## Fable versus Mythos [Claude Mythos 5](https://platform.claude.com/docs/en/models/mythos-5/overview) is offered separately for defensive cybersecurity workflows and is available only to organizations verified through Anthropic's verification programs, such as the [Cyber Verification Program](https://support.claude.com/en/articles/14604842). It shares Claude Fable 5's specifications and pricing. diff --git a/content/en/models/haiku-5-5/migration-guide.md b/content/en/models/haiku-5-5/migration-guide.md index 678afcc0cd..779dced829 100644 --- a/content/en/models/haiku-5-5/migration-guide.md +++ b/content/en/models/haiku-5-5/migration-guide.md @@ -66,11 +66,11 @@ Replace the Claude Haiku 4.5 model ID with the Claude Haiku 5.5 ID for your plat ## Recount tokens -Claude Haiku 5.5 uses the same newer tokenizer as Claude 4.7 and later models. As with all models that use this tokenizer, the same input text produces approximately 30% more tokens on Claude Haiku 5.5 than on Claude Haiku 4.5. The exact increase depends on the content. Requests, responses, and streaming events keep the same shape. What changes is anything you measure or budget in tokens: +Claude Haiku 5.5 uses the same newer tokenizer as Claude 4.7 and later models. As with all models that use this tokenizer, the same input text produces approximately 30 percent more tokens on Claude Haiku 5.5 than on Claude Haiku 4.5. The exact increase depends on the content. Requests, responses, and streaming events keep the same shape. What changes is anything you measure or budget in tokens: * `usage` fields and [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) results are higher for the same text. * A given number of tokens holds less text. -* A `max_tokens` limit tuned for Claude Haiku 4.5 may cut off equivalent output. +* A `max_tokens` limit tuned for Claude Haiku 4.5 might cut off equivalent output. * Cost estimates made from Claude Haiku 4.5's token counts need recomputing with Claude Haiku 5.5's counts and [prices](https://platform.claude.com/docs/en/about-claude/pricing), including its higher prices for long prompts. See [Long context pricing](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing). Large images can also cost more tokens. Claude Haiku 5.5 uses the high-resolution image tier, which downscales images above 2,576 pixels on the long edge or 4,784 visual tokens. Claude Haiku 4.5 and earlier Haiku models use the standard tier, which downscales images above 1,568 pixels on the long edge or 1,568 visual tokens. An image of 2,000 by 1,500 pixels costs about 2.5 times as many visual tokens on Claude Haiku 5.5 as on Claude Haiku 4.5. See [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size). @@ -104,13 +104,13 @@ After, the same request to Claude Haiku 5.5 uses adaptive thinking. The `thinkin } ``` -Adaptive thinking is on by default, so a response can begin with one or more `thinking` blocks even when the request doesn't set `thinking`. Leave `thinking` unset or set it to `{"type": "adaptive"}`, and use [effort](https://platform.claude.com/docs/en/build-with-claude/effort) as the lever: where Claude Haiku 4.5 ran without thinking, or with a small budget to save tokens, choose a lower effort level. At a lower level the model thinks less, and it can skip thinking entirely on simpler requests. For prompting guidance, see [Use effort to control thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5#use-effort-to-control-thinking). Select content blocks by their `type` field rather than by position, and pass `thinking` blocks back unmodified with tool results. +Adaptive thinking is on by default, so a response can start with one or more `thinking` blocks even when the request doesn't set `thinking`. Leave `thinking` unset or set it to `{"type": "adaptive"}`, and use [effort](https://platform.claude.com/docs/en/build-with-claude/effort) as the control: where Claude Haiku 4.5 ran without thinking, or with a small budget to save tokens, choose a lower effort level. At a lower level the model thinks less, and it can skip thinking entirely on simpler requests. For prompting guidance, see [Use effort to control thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5#use-effort-to-control-thinking). Select content blocks by their `type` field rather than by position, and pass `thinking` blocks back unmodified with tool results. Thinking tokens count toward `max_tokens`, so a request with a small `max_tokens` can stop with `stop_reason: "max_tokens"` after a `thinking` block and before any text. If you set a small `max_tokens` for Claude Haiku 4.5, raise it to leave room for thinking, or choose a lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level. -Thinking blocks from earlier assistant turns stay in context and count as input tokens, where Claude Haiku 4.5 kept only the latest turn's. Multi-turn conversations therefore carry more input tokens than the tokenizer change alone explains. To remove older blocks, use [thinking block clearing](https://platform.claude.com/docs/en/build-with-claude/context-editing#thinking-block-clearing). See [Thinking block preservation by model](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model). +Thinking blocks from earlier assistant turns stay in context and count as input tokens, where Claude Haiku 4.5 keeps only the latest turn's. Multi-turn conversations therefore carry more input tokens than the tokenizer change alone explains. To remove older blocks, use [thinking block clearing](https://platform.claude.com/docs/en/build-with-claude/context-editing#thinking-block-clearing). See [Thinking block preservation by model](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-block-preservation-by-model). -By default, Claude Haiku 5.5 returns each `thinking` block with an empty `thinking` field and only a `signature`, where Claude Haiku 4.5 returned summarized thinking. To receive summarized thinking, set `thinking: {"type": "adaptive", "display": "summarized"}`. +By default, Claude Haiku 5.5 returns each `thinking` block with an empty `thinking` field and only a `signature`, where Claude Haiku 4.5 returns summarized thinking. To receive summarized thinking, set `thinking: {"type": "adaptive", "display": "summarized"}`. Claude Haiku 5.5 accepts a forced `tool_choice` (`any` or a named tool), but the response starts with the tool call and has no `thinking` block. To let the model think before it calls a tool, use `tool_choice: {"type": "auto"}` and say in the prompt when to use the tool. @@ -118,7 +118,7 @@ Claude Haiku 5.5 reads thinking blocks from Claude Sonnet 5, Claude Opus 4.8, Cl ## Remove sampling parameters -Claude Haiku 4.5 accepts `temperature`, `top_p`, and `top_k`. On Claude Haiku 5.5, omit all three and use prompting to guide the model's behavior instead. If a request includes `temperature`, it must be `1`. If it includes `top_p`, it must be `0.99`, its default. Any other `temperature` or `top_p` value returns a 400 error, including a `top_p` of `1`. So does any `top_k` value, and so does a request that includes both `temperature` and `top_p`. +On Claude Haiku 5.5, omit `temperature`, `top_p`, and `top_k` and use prompting to guide the model's behavior instead. ## Replace assistant prefill @@ -139,7 +139,7 @@ On the Claude API and Google Cloud, Claude Haiku 5.5 also supports the [browser ## Replay thinking blocks through the account that produced them -Thinking blocks from Claude Haiku 5.5 work only in the account that produced them, or in an account linked to it. When another account sends one of these blocks, the API drops the block before the model sees it, and the request succeeds without that reasoning. This affects code that stores conversations and replays them through a different account, for example a service that serves several customers from one conversation store. Replay each conversation through the account that produced it. See [Thinking blocks stay with the account that produced them](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#account-bound-thinking). +Thinking blocks from Claude Haiku 5.5 work only in the account that produced them, or in an account linked to it. When another account sends one of these blocks, the API drops the block before the model receives it, and the request succeeds without that reasoning. This affects code that stores conversations and replays them through a different account, for example a service that serves several customers from one conversation store. Replay each conversation through the account that produced it. See [Thinking blocks stay with the account that produced them](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#account-bound-thinking). ## Keep earlier turns unchanged diff --git a/content/en/models/haiku-5-5/overview.md b/content/en/models/haiku-5-5/overview.md index 0ef65c7b28..f3912fd5ea 100644 --- a/content/en/models/haiku-5-5/overview.md +++ b/content/en/models/haiku-5-5/overview.md @@ -1,7 +1,7 @@ --- title: Claude Haiku 5.5 url: https://platform.claude.com/docs/en/models/haiku-5-5/overview -description: "Claude Haiku 5.5 at a glance: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." +description: "An overview of Claude Haiku 5.5: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." --- **Latest.** Released October 7, 2026. @@ -16,7 +16,7 @@ Context window: 1M tokens · Max output: 128K tokens · Input pricing: From $0.1 ## Overview -Claude Haiku 5.5 is built for high-volume, latency-sensitive work such as classification, routing, extraction, and subagent tasks. It supports adaptive thinking with the effort parameter, a 1M token context window, and up to 128k output tokens. It uses the same newer tokenizer as Claude 4.7 and later models, so the same text counts as approximately 30% more tokens than on Claude Haiku 4.5. Its thinking blocks work only in the account that produced them, or in an account linked to it. +Claude Haiku 5.5 is built for high-volume, latency-sensitive work such as classification, routing, extraction, and subagent tasks. It supports adaptive thinking with the effort parameter, a 1M token context window, and up to 128k output tokens. It uses the same newer tokenizer as Claude 4.7 and later models, so the same text counts as approximately 30 percent more tokens than on Claude Haiku 4.5. Its thinking blocks work only in the account that produced them, or in an account linked to it. For code changes, see the [migration guide](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide). For model IDs, pricing, and limits, see the [Claude Haiku 5.5 overview](https://platform.claude.com/docs/en/models/haiku-5-5/overview). For prompting guidance, see [Prompting Claude Haiku 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5). @@ -90,7 +90,7 @@ For code changes, see the [migration guide](https://platform.claude.com/docs/en/ ## Good to know * Adaptive thinking is on by default. Control thinking depth with the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort). -* Omit `temperature`, `top_p`, and `top_k`. See [Remove sampling parameters](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#remove-sampling-parameters) for the values that return a 400 error. +* Omit `temperature`, `top_p`, and `top_k`. * On the [Message Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing#extended-output-beta), Claude Haiku 5.5 supports up to 300k output tokens with the `output-300k-2026-03-24` beta header. * The minimum cacheable prompt length is 512 tokens. See [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations). * Query limits and capabilities programmatically with the [Models API](https://platform.claude.com/docs/en/api/models/list). diff --git a/content/en/models/haiku-5-5/whats-new-haiku-5-5.md b/content/en/models/haiku-5-5/whats-new-haiku-5-5.md index 39411e2e43..972150b08b 100644 --- a/content/en/models/haiku-5-5/whats-new-haiku-5-5.md +++ b/content/en/models/haiku-5-5/whats-new-haiku-5-5.md @@ -4,7 +4,7 @@ url: https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5 description: Overview of new capabilities, breaking changes, and behavior changes in Claude Haiku 5.5, with a link to each feature's guide and to the migration guide for code changes. --- -Claude Haiku 5.5 is built for high-volume, latency-sensitive work such as classification, routing, extraction, and subagent tasks. It supports adaptive thinking with the effort parameter, a 1M token context window, and up to 128k output tokens. It uses the same newer tokenizer as Claude 4.7 and later models, so the same text counts as approximately 30% more tokens than on Claude Haiku 4.5. Its thinking blocks work only in the account that produced them, or in an account linked to it. +Claude Haiku 5.5 is built for high-volume, latency-sensitive work such as classification, routing, extraction, and subagent tasks. It supports adaptive thinking with the effort parameter, a 1M token context window, and up to 128k output tokens. It uses the same newer tokenizer as Claude 4.7 and later models, so the same text counts as approximately 30 percent more tokens than on Claude Haiku 4.5. Its thinking blocks work only in the account that produced them, or in an account linked to it. For code changes, see the [migration guide](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide). For model IDs, pricing, and limits, see the [Claude Haiku 5.5 overview](https://platform.claude.com/docs/en/models/haiku-5-5/overview). For prompting guidance, see [Prompting Claude Haiku 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5). @@ -23,7 +23,7 @@ Each row names one change, whether it is new, changed, or breaking, and what you | [Assistant message prefill returns an error](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#replace-assistant-prefill) | Breaking | End `messages` with a user turn. | | [`computer_20250124` returns an error on the Claude API, Google Cloud, and Amazon Bedrock](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#computer-use-toolset) | Breaking | Replace it with `computer_toolset_20260801` on the Claude API and Google Cloud, or with `computer_20251124` on Amazon Bedrock. | | [Changing earlier turns invalidates thinking blocks](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#keep-earlier-turns-unchanged) | Breaking | Keep conversations append-only if you send thinking blocks back. | -| [Responses can begin with thinking blocks](https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5#responses-can-begin-with-thinking-blocks) | Changed | Select content blocks by `type`, not by position. | +| [Responses can start with thinking blocks](https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5#responses-can-begin-with-thinking-blocks) | Changed | Select content blocks by `type`, not by position. | | [Thinking text is omitted by default](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#configure-thinking) | Changed | To receive summarized thinking, set `thinking.display` to `"summarized"`. | | [Same text counts as more tokens](https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5#same-text-counts-as-more-tokens) | Changed | Recount prompts and revisit `max_tokens` and cost estimates. | | [Replaying thinking blocks across accounts](https://platform.claude.com/docs/en/models/haiku-5-5/whats-new-haiku-5-5#replaying-thinking-blocks-across-accounts) | Changed | If you replay stored conversations through a different account, replay each through the account that produced it. | @@ -35,7 +35,7 @@ Each row names one change, whether it is new, changed, or breaking, and what you ### Adaptive thinking and effort -With [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), Claude Haiku 5.5 determines when and how much to think. Adaptive thinking is on by default. While you can still turn thinking off with `thinking: {"type": "disabled"}` at `high` effort or below, the better way to trade response quality against speed and cost is to use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort). +With [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), Claude Haiku 5.5 determines when and how much to think. Adaptive thinking is on by default. Although you can still turn thinking off with `thinking: {"type": "disabled"}` at `high` effort or below, the better way to trade response quality against speed and cost is to use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort). ### Larger context window and output @@ -43,9 +43,9 @@ Claude Haiku 5.5 has a 1M token [context window](https://platform.claude.com/doc ## Behavior changes -### Responses can begin with thinking blocks +### Responses can start with thinking blocks -Adaptive thinking is on by default, so a response can begin with one or more `thinking` blocks even when the request doesn't mention thinking. Code that reads the first content block as the answer needs to select blocks by their `type` field. See [Configure thinking](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#configure-thinking) in the migration guide. +Adaptive thinking is on by default, so a response can start with one or more `thinking` blocks even when the request doesn't mention thinking. Code that reads the first content block as the answer needs to select blocks by their `type` field. See [Configure thinking](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#configure-thinking) in the migration guide. ### Earlier thinking blocks stay in context @@ -53,7 +53,7 @@ Claude Haiku 5.5 keeps thinking blocks from all earlier assistant turns in conte ### Same text counts as more tokens -Claude Haiku 5.5 uses the same newer tokenizer as Claude 4.7 and later models. As with all models that use this tokenizer, the same input text produces approximately 30% more tokens on Claude Haiku 5.5 than on Claude Haiku 4.5. The exact increase depends on the content. The shape of requests and responses doesn't depend on the tokenizer, but anything you measure or budget in tokens changes. See [Recount tokens](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#recount-tokens) in the migration guide. +Claude Haiku 5.5 uses the same newer tokenizer as Claude 4.7 and later models. As with all models that use this tokenizer, the same input text produces approximately 30 percent more tokens on Claude Haiku 5.5 than on Claude Haiku 4.5. The exact increase depends on the content. The shape of requests and responses doesn't depend on the tokenizer, but anything you measure or budget in tokens changes. See [Recount tokens](https://platform.claude.com/docs/en/models/haiku-5-5/migration-guide#recount-tokens) in the migration guide. ### Replaying thinking blocks across accounts diff --git a/content/en/models/mythos-5-1/overview.md b/content/en/models/mythos-5-1/overview.md index 30438c57d4..fea26cbfee 100644 --- a/content/en/models/mythos-5-1/overview.md +++ b/content/en/models/mythos-5-1/overview.md @@ -1,7 +1,7 @@ --- title: Claude Mythos 5.1 url: https://platform.claude.com/docs/en/models/mythos-5-1/overview -description: "Claude Mythos 5.1 at a glance: the same model as Claude Fable 5.1, available only to organizations verified through Anthropic's verification programs. Model IDs, specifications, pricing, and how to request access." +description: Claude Mythos 5.1 is the same model as Claude Fable 5.1, available only to organizations verified through Anthropic's verification programs. Model IDs, specifications, pricing, and how to request access. --- **Verification required.** Released September 1, 2026. diff --git a/content/en/models/opus-5-5/migration-guide.md b/content/en/models/opus-5-5/migration-guide.md index 1d94a372d8..bbe9d198b6 100644 --- a/content/en/models/opus-5-5/migration-guide.md +++ b/content/en/models/opus-5-5/migration-guide.md @@ -22,7 +22,7 @@ description: Switch to Claude Opus 5.5 from earlier Opus models or Claude Sonnet This page lists the code changes for moving to Claude Opus 5.5 from [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-5), [Claude Opus 4.8](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-4-8), [Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-47), [Claude Opus 4.6 and earlier Opus models](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-opus-46), or [Claude Sonnet 5](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migrating-from-claude-sonnet-5). Every reader needs [What every request to Claude Opus 5.5 must satisfy](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#request-requirements) and [Handle thinking in every response](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-in-every-response). Then go to the section for your current model: its first sentence names the other sections that apply to you. The [migration checklist](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#migration-checklist) lists every change by starting model. -Claude Opus 5.5 costs less than Claude Opus 5 ($4 / $20 USD per million input / output tokens, compared with $5 / $25; see [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing)). For feature support, see [What's new in Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#feature-support). For behavioral differences and model-specific prompting patterns, see [Prompting Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5). +Claude Opus 5.5 costs less than Claude Opus 5 ($4 / $20 USD per million input / output tokens, compared with $5 / $25 USD; see [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing)). For feature support, see [What's new in Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#feature-support). For behavioral differences and model-specific prompting patterns, see [Prompting Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5). ## What every request to Claude Opus 5.5 must satisfy @@ -32,12 +32,12 @@ Whichever model you are coming from, a request to `claude-opus-5-5` must meet th * **Thinking:** Send no `thinking` field, or send `thinking: {"type": "adaptive"}`, which is equivalent: [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on. `thinking: {"type": "disabled"}` and manual thinking budgets (`thinking: {"type": "enabled", "budget_tokens": N}`) are rejected. See the [before and after for thinking](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-cant-be-disabled). * **Effort:** Control thinking depth with the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort), the only request parameter that controls it. All five levels (`low`, `medium`, `high`, `xhigh`, `max`) are supported, and the default is `medium`. See [Recommended effort levels for Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/effort#recommended-effort-levels-for-claude-opus-5-5). * **Tool choice:** Use `tool_choice` `{"type": "auto"}` (the default) or `{"type": "none"}`. Forcing a tool call with `{"type": "any"}` or `{"type": "tool", "name": "..."}` is rejected. See the [before and after for tool choice](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#forced-tool-use). -* **Sampling parameters:** Omit `temperature`, `top_p`, and `top_k`, or leave them at their defaults: any other value is rejected. Use prompting to guide the model's behavior. +* **Sampling parameters:** Omit `temperature`, `top_p`, and `top_k`. Use prompting to guide the model's behavior. * **Prefill:** Don't end `messages` with a prefilled assistant turn: it is rejected. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) or system prompt instructions instead. * **Computer use:** On the Claude API and Google Cloud, declare computer use as the `computer_toolset_20260801` toolset; the earlier `computer_20251124` tool is rejected there. See the [computer use breaking change](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#computer-use-toolset). * **Context window:** No context-window beta header is needed. The [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) is the default, and a header sent for older models has no effect. -The following request satisfies every item in the list: effort is set, and there is no `thinking` field. The SDK tabs that print text select it by block type, because `thinking` blocks come first. +The following request satisfies every item in the list: effort is set, and there is no `thinking` field. Where the example prints text, it finds the text block by its type, because `thinking` blocks come first. ```bash cURL @@ -115,8 +115,7 @@ The following request satisfies every item in the list: effort is set, and there Model = Model.ClaudeOpus5_5, MaxTokens = 4096, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Analyze the trade-offs between microservices and monolithic architectures" } ], @@ -198,7 +197,7 @@ The following request satisfies every item in the list: effort is set, and there client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 4096, messages: [ { role: "user", content: "Analyze the trade-offs between microservices and monolithic architectures" } @@ -216,11 +215,11 @@ The following request satisfies every item in the list: effort is set, and there ## Handle thinking in every response -Thinking runs on every Claude Opus 5.5 request, so every response can begin with `thinking` blocks, and `max_tokens` covers thinking plus text. If your code already runs with thinking on, items 1 to 3 are likely in place: check items 4 and 5. If it ran without thinking, on any earlier model, each item is a change. +Thinking runs on every Claude Opus 5.5 request, so every response can start with `thinking` blocks, and `max_tokens` covers thinking plus text. If your code already runs with thinking on, items 1 to 3 are likely in place: check items 4 and 5. If it ran without thinking, on any earlier model, each item is a change. 1. **`max_tokens` covers thinking plus text:** On Claude Opus 4.8 and earlier Opus models, requests without a `thinking` field run without thinking. Claude Opus 5 and Claude Sonnet 5 accept `thinking: {"type": "disabled"}`. On Claude Opus 5.5, every request runs with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so such a workload can produce more output tokens per request. See [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). To spend fewer tokens on thinking, lower the [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level. If you run at `xhigh` or `max` effort, set a large `max_tokens` so the model has room to think and act; start at 64k tokens and tune from there. If your prompts were tuned for running without thinking, see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled). -2. **Responses begin with thinking blocks:** A response can begin with one or more `thinking` blocks before the first `text` block. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first `content_block_start` event as text, breaks on these responses. Select content blocks by their `type` field instead: read `text` from the blocks whose `type` is `"text"`, and branch on the block type when handling stream events. +2. **Responses start with thinking blocks:** A response can start with one or more `thinking` blocks before the first `text` block. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first `content_block_start` event as text, breaks on these responses. Select content blocks by their `type` field instead: read `text` from the blocks whose `type` is `"text"`, and branch on the block type when handling stream events. 3. **Return thinking blocks unmodified in tool-use loops:** If you run a tool-use loop, pass the `thinking` blocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whose `thinking` field is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). @@ -271,7 +270,7 @@ Thinking runs on every Claude Opus 5.5 request, so every response can begin with ``` - If your product streams reasoning to users, the default appears as a long pause before output begins; set `display: "summarized"` to restore visible progress during thinking. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). + If your product streams reasoning to users, the default appears as a long pause before output starts; set `display: "summarized"` to restore visible progress during thinking. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). 5. **Text between tool calls arrives in thinking blocks:** The short notes the model writes between tool calls come back as `thinking` blocks, which are empty at the default display. See [Text between tool calls is returned in thinking blocks](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#text-between-tool-calls). @@ -321,7 +320,7 @@ Work down the groups and stop after the one that names your current model: every * Re-test any client-side token-count estimations. * If your application sends images, re-budget for [high-resolution image support](https://platform.claude.com/docs/en/build-with-claude/vision#high-resolution-image-support-on-claude-opus-4-7) (up to approximately 3x more image tokens per full-resolution image). Downsample before sending if you do not need the additional fidelity. * If you consume pointing or bounding-box coordinates from the model, remove any scale-factor conversion; coordinates are 1:1 with actual image pixels on Claude Opus 4.7 and later models. -* Review the [behavior changes](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#behavior-changes) that began in Claude Opus 4.7. +* Review the [behavior changes](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#behavior-changes) that started in Claude Opus 4.7. * If your product does legitimate security work, apply to the [Cyber Verification Program](https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet) for access to lower restrictions on cyber content. ### Claude Opus 4.5 or earlier @@ -367,7 +366,7 @@ Each change is explained in [What's new in Claude Opus 5.5](https://platform.cla #### Thinking can't be disabled -`thinking: {"type": "disabled"}` and `thinking: {"type": "enabled", "budget_tokens": N}` both return a 400 error (`"thinking.type.disabled" is not supported for this model.` or `"thinking.type.enabled" is not supported for this model.`). Remove the `thinking` field and pick an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level; where you disabled thinking to save tokens, use a lower one. Responses then begin with `thinking` blocks, so select content blocks by `type` and pass `thinking` blocks back unmodified with tool results. See [Thinking can't be disabled](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#thinking-cant-be-disabled). +`thinking: {"type": "disabled"}` and `thinking: {"type": "enabled", "budget_tokens": N}` both return a 400 error (`"thinking.type.disabled" is not supported for this model.` or `"thinking.type.enabled" is not supported for this model.`). Remove the `thinking` field and pick an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level; where you disabled thinking to save tokens, use a lower one. Responses then start with `thinking` blocks, so select content blocks by `type` and pass `thinking` blocks back unmodified with tool results. See [Thinking can't be disabled](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#thinking-cant-be-disabled). Before. Claude Opus 5 accepts this request, and Claude Opus 5.5 rejects it with a 400 error: @@ -417,7 +416,7 @@ Before. Claude Opus 5 accepts this request, and Claude Opus 5.5 rejects it with Model = Model.ClaudeOpus5, MaxTokens = 16000, Thinking = new ThinkingConfigDisabled(), - Messages = [new() { Role = Role.User, Content = "..." }], + Messages = [new UserMessageParam { Content = "..." }], }); ``` @@ -514,7 +513,7 @@ After: Model = Model.ClaudeOpus5_5, MaxTokens = 16000, OutputConfig = new() { Effort = Effort.Low }, // thinking is always on; effort is the control - Messages = [new() { Role = Role.User, Content = "..." }], + Messages = [new UserMessageParam { Content = "..." }], }); ``` @@ -652,7 +651,7 @@ Before. Claude Opus 5 accepts this request, and Claude Opus 5.5 rejects it with MaxTokens = 1024, Tools = [.. tools], ToolChoice = new ToolChoiceTool { Name = "get_weather" }, - Messages = [new() { Role = Role.User, Content = "What's the weather in Paris?" }], + Messages = [new UserMessageParam { Content = "What's the weather in Paris?" }], }); ``` @@ -804,11 +803,7 @@ After: ToolChoice = new ToolChoiceAuto(), Messages = [ - new() - { - Role = Role.User, - Content = "What's the weather in Paris? Use the get_weather tool.", - }, + new UserMessageParam { Content = "What's the weather in Paris? Use the get_weather tool." }, ], }); ``` @@ -974,7 +969,7 @@ Before. Claude Opus 5 accepts this request, and on the Claude API and Google Clo DisplayHeightPx = 768, }, ], - Messages = [new() { Role = Role.User, Content = "Open the display settings." }], + Messages = [new BetaUserMessageParam { Content = "Open the display settings." }], }); ``` @@ -1095,7 +1090,7 @@ After: MaxTokens = 4096, // no beta header; the toolset entry takes no name or display size Tools = [new ComputerToolset20260801()], - Messages = [new() { Role = Role.User, Content = "Open the display settings." }], + Messages = [new UserMessageParam { Content = "Open the display settings." }], }); ``` @@ -1157,7 +1152,7 @@ Claude Opus 5.5 can return `stop_reason: "refusal"` with a `stop_details` catego ### Recommended changes 1. **Re-run your effort sweep.** Effort is the only thinking control on Claude Opus 5.5, and its default is `medium` where Claude Opus 5's is `high`, so a request that omits `effort` now runs at `medium`. Step down where quality holds, and step up for the most demanding work. See [Effort](https://platform.claude.com/docs/en/build-with-claude/effort). -2. **Re-evaluate model-specific prompt instructions.** Instructions tuned for Claude Opus 5's behavior may no longer be needed; see [Prompting Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5). If you ran with thinking disabled, also see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled). +2. **Re-evaluate model-specific prompt instructions.** Instructions tuned for Claude Opus 5's behavior might no longer be needed; see [Prompting Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5). If you ran with thinking disabled, also see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled). 3. **Test in a development environment** before switching production traffic. ## Migrating to Claude Opus 5.5 from Claude Opus 4.8 @@ -1176,7 +1171,7 @@ This section adds what changed between Claude Opus 4.8 and Claude Opus 5. For a 2. **Lower prompt caching minimum:** The minimum cacheable prompt length on Claude Opus 5.5 is 512 tokens, down from 1,024 tokens on Claude Opus 4.8. Prompts that were too short to cache on Claude Opus 4.8 can create cache entries, with no code changes required. See [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations) for per-model minimums. -3. **Priority Tier is not supported:** [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5.5, while Claude Opus 4.8 keeps it. If your organization has a Priority Tier commitment, plan capacity separately. +3. **Priority Tier is not supported:** [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5.5, whereas Claude Opus 4.8 keeps it. If your organization has a Priority Tier commitment, plan capacity separately. ### Recommended changes @@ -1284,7 +1279,7 @@ This section adds what changed in Claude Opus 4.7, with `claude-opus-4-6` as the Model = Model.ClaudeOpus4_6, MaxTokens = 16000, Thinking = new ThinkingConfigEnabled(budgetTokens: 10000), - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }; var response = await client.Messages.Create(parameters); @@ -1422,7 +1417,7 @@ This section adds what changed in Claude Opus 4.7, with `claude-opus-4-6` as the MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), OutputConfig = new OutputConfig { Effort = Effort.High }, // or Max, Xhigh, Medium, Low - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }; var response = await client.Messages.Create(parameters); @@ -1484,7 +1479,7 @@ This section adds what changed in Claude Opus 4.7, with `claude-opus-4-6` as the client = Anthropic::Client.new message = client.messages.create( - model: "claude-opus-5-5", + model: Anthropic::Model::CLAUDE_OPUS_5_5, max_tokens: 16000, thinking: { type: "adaptive" @@ -1501,15 +1496,15 @@ This section adds what changed in Claude Opus 4.7, with `claude-opus-4-6` as the Adaptive thinking is steerable through prompting and the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort), which replaces the thinking budget as the way to control how much the model reasons. Run an effort sweep on your own evals rather than translating a `budget_tokens` value. The [effort levels table](https://platform.claude.com/docs/en/build-with-claude/effort#effort-levels) describes when to use each level, and [Recommended effort levels for Claude Opus 5.5](https://platform.claude.com/docs/en/build-with-claude/effort#recommended-effort-levels-for-claude-opus-5-5) covers this model. -2. **Sampling parameters removed:** Setting `temperature`, `top_p`, or `top_k` to any non-default value on Claude Opus 4.7 and later models, including Claude Opus 5.5, returns a 400 error. The Python SDK (v1.0 and later) does not define them, and passing them raises a `TypeError`. The safest migration path is to omit these parameters entirely from request payloads. Prompting is the recommended way to guide model behavior on Claude Opus 5.5. If you were using `temperature = 0` for determinism, note that it never guaranteed identical outputs on prior models. +2. **Sampling parameters removed:** Omit `temperature`, `top_p`, and `top_k`. Prompting is the recommended way to guide model behavior on Claude Opus 5.5. If you were using `temperature = 0` for determinism, note that it never guaranteed identical outputs on prior models. 3. **Thinking content omitted by default:** Thinking blocks still appear in the response stream on Claude Opus 4.7 and later models, but their `thinking` field is empty unless you explicitly opt in. This is a silent change from Claude Opus 4.6, where the default was to return summarized thinking text. To restore it, see item 4 of [Handle thinking in every response](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-in-every-response). -4. **Updated token counting:** Claude Opus 4.7 introduced a new tokenizer, which later Opus models, including Claude Opus 5.5, also use. It contributes to improved performance on a wide range of tasks, and it may use roughly 1x to 1.35x as many tokens when processing text compared to models before Claude Opus 4.7 (up to \~35% more, varying by content). +4. **Updated token counting:** Claude Opus 4.7 introduced a new tokenizer, which later Opus models, including Claude Opus 5.5, also use. It contributes to improved performance on a wide range of tasks, and it might use roughly 1x to 1.35x as many tokens when processing text compared to models before Claude Opus 4.7 (up to about 35 percent more, varying by content). [`/v1/messages/count_tokens`](https://platform.claude.com/docs/en/build-with-claude/token-counting) returns a different number of tokens for Claude Opus 5.5 than it did for Claude Opus 4.6. Token efficiency can vary by workload shape. - Update your `max_tokens` parameters to give additional headroom, including compaction triggers, and re-test any code path that estimates tokens client-side or assumes a fixed token-to-character ratio. Use the [Token counting endpoint](https://platform.claude.com/docs/en/build-with-claude/token-counting) to verify. Prompting interventions, [`task_budget`](https://platform.claude.com/docs/en/build-with-claude/task-budgets), and [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) can help control costs; these controls may trade off model intelligence. + Update your `max_tokens` parameters to give additional headroom, including compaction triggers, and re-test any code path that estimates tokens client-side or assumes a fixed token-to-character ratio. Use the [Token counting endpoint](https://platform.claude.com/docs/en/build-with-claude/token-counting) to verify. Prompting interventions, [`task_budget`](https://platform.claude.com/docs/en/build-with-claude/task-budgets), and [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) can help control costs; these controls might trade off model intelligence. 5. **Prefill removal (already in effect on Claude Opus 4.6):** Prefilling assistant messages returns a 400 error on Claude Opus 4.6 and later Opus models, including Claude Opus 5.5, so this is a change only if you come from Claude Opus 4.5 or earlier. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) or system prompt instructions instead. @@ -1519,7 +1514,7 @@ Claude Opus 4.7 introduced behavioral differences from Claude Opus 4.6 that are 1. **Built-in progress updates in agentic traces:** Claude Opus 4.7 provides more regular, higher-quality updates to the user throughout long agentic traces. If you've added scaffolding to force interim status messages ("After every 3 tool calls, summarize progress"), try removing it. On Claude Opus 5.5 these updates arrive in `thinking` blocks, which are empty at the default `thinking.display`. To receive them, see [Text between tool calls is returned in thinking blocks](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#text-between-tool-calls). To shape their length and contents, see [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates). -2. **Real-time cybersecurity safeguards:** Newly added in Claude Opus 4.7, requests that involve prohibited or high-risk topics may lead to refusals. For legitimate security work such as penetration testing, vulnerability research, or red-teaming, apply to the [Cyber Verification Program](https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet) to request reduced restrictions. The application route depends on how you access Claude. +2. **Real-time cybersecurity safeguards:** Newly added in Claude Opus 4.7, requests that involve prohibited or high-risk topics might lead to refusals. For legitimate security work such as penetration testing, vulnerability research, or red-teaming, apply to the [Cyber Verification Program](https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet) to request reduced restrictions. The application route depends on how you access Claude. 3. **High-resolution image support:** Claude Opus 4.7 is the first Claude model with high-resolution image support. Maximum image resolution is 2,576 pixels on the long edge, up from 1,568 pixels on prior models. This unlocks gains on vision-heavy workloads and is particularly valuable for computer use, screenshot understanding, and document analysis. @@ -1540,7 +1535,7 @@ If you are migrating from Claude Opus 4.5, Claude Opus 4.1, or an earlier model 1. **Prefill removal** is covered in the [breaking changes for migrating from Claude Opus 4.6](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#opus-46-breaking-changes). -2. **Tool parameter quoting:** Claude Opus 4.6 and later models may produce slightly different JSON string escaping in tool call arguments (for example, different handling of Unicode escapes or forward slash escaping). If you parse tool call `input` as a raw string rather than using a JSON parser, verify your parsing logic. Standard JSON parsers (such as `json.loads()` or `JSON.parse()`) handle these differences automatically. +2. **Tool parameter quoting:** Claude Opus 4.6 and later models might produce slightly different JSON string escaping in tool call arguments (for example, different handling of Unicode escapes or forward slash escaping). If you parse tool call `input` as a raw string rather than using a JSON parser, verify your parsing logic. Standard JSON parsers (such as `json.loads()` or `JSON.parse()`) handle these differences automatically. #### Recommended changes @@ -1790,7 +1785,7 @@ Work through [What every request to Claude Opus 5.5 must satisfy](https://platfo * Returns the text between tool calls as `text` blocks. * Defaults to `high` effort. -Manual extended thinking, non-default sampling parameters, and assistant prefill return a 400 error on both models, so nothing changes there. None of the required changes in the sections for Claude Opus 4.8, Claude Opus 4.7, and Claude Opus 4.6 apply to you. +Manual extended thinking, sampling parameters, and assistant prefill return a 400 error on both models, so nothing changes there. None of the required changes in the sections for Claude Opus 4.8, Claude Opus 4.7, and Claude Opus 4.6 apply to you. ### What changed diff --git a/content/en/models/opus-5-5/overview.md b/content/en/models/opus-5-5/overview.md index 3f0cf953b5..df1b3d7263 100644 --- a/content/en/models/opus-5-5/overview.md +++ b/content/en/models/opus-5-5/overview.md @@ -1,7 +1,7 @@ --- title: Claude Opus 5.5 url: https://platform.claude.com/docs/en/models/opus-5-5/overview -description: "Claude Opus 5.5 at a glance: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." +description: "An overview of Claude Opus 5.5: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." --- **Latest.** Released September 22, 2026. @@ -100,7 +100,7 @@ Claude Opus 5.5 is built for long-running agentic coding and knowledge work, pri - The control for thinking depth, latency, and cost. Choose a level per workload. + The control for thinking depth, latency, and cost. Choose a level for each workload. diff --git a/content/en/models/opus-5-5/whats-new-opus-5-5.md b/content/en/models/opus-5-5/whats-new-opus-5-5.md index 395e4c0f98..e9fab2ed97 100644 --- a/content/en/models/opus-5-5/whats-new-opus-5-5.md +++ b/content/en/models/opus-5-5/whats-new-opus-5-5.md @@ -30,7 +30,7 @@ The error messages are: "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior. ``` -The [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) is the control for thinking depth, latency, and cost: lower it where you previously disabled thinking; [Optimizing for cost and intelligence](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort) has measured results for choosing a level. Because every response can begin with one or more `thinking` blocks (returned with an empty `thinking` field at the default `display: "omitted"`), select content blocks by their `type` field rather than by position, and pass `thinking` blocks back unmodified in tool-use loops. Code that already runs on Claude Opus 5 with thinking on needs no change. See [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) and the migration guide's [before and after](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-cant-be-disabled). +The [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) is the control for thinking depth, latency, and cost: lower it where you previously disabled thinking; [Optimizing for cost and intelligence](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort) has measured results for choosing a level. Because every response can start with one or more `thinking` blocks (returned with an empty `thinking` field at the default `display: "omitted"`), select content blocks by their `type` field rather than by position, and pass `thinking` blocks back unmodified in tool-use loops. Code that already runs on Claude Opus 5 with thinking on needs no change. See [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) and the migration guide's [before and after for thinking](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-cant-be-disabled). ### Forced tool use is not supported @@ -40,13 +40,13 @@ Claude Opus 5.5 doesn't support forced tool use. `tool_choice` set to `{"type": tool_choice: type "tool" and "any" are not supported for this model. ``` -`tool_choice: {"type": "auto"}` (the default) and `{"type": "none"}` are supported, and the same validation applies to the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint. For schema-valid JSON, keep `tool_choice: {"type": "auto"}` and set `strict: true` with [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use), or move the schema to [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs). To make the model call a tool rather than reply in text, say in the prompt when the tool applies. The migration guide shows the [before and after](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#forced-tool-use). +`tool_choice: {"type": "auto"}` (the default) and `{"type": "none"}` are supported, and the same validation applies to the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint. For schema-valid JSON, keep `tool_choice: {"type": "auto"}` and set `strict: true` with [strict tool use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use), or move the schema to [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs). To make the model call a tool rather than reply in text, say in the prompt when the tool applies. The migration guide shows the [before and after for tool choice](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#forced-tool-use). ### Thinking blocks are tied to the model and the conversation Every thinking block records which model produced it, and each model reads its own blocks and only some other models'. Claude Opus 5.5 reads thinking blocks from Claude Opus 5, from earlier Opus, Sonnet, and Haiku models, and, on the Claude API and Google Cloud, from Claude Sonnet 5.5 and Claude Haiku 5.5, but not from Claude Fable or Claude Mythos models. On the Claude API, Claude Fable 5.1 and Claude Mythos 5.1 read thinking blocks from Claude Opus 5.5; no other model does. A conversation that moves from Claude Opus 5 onto Claude Opus 5.5, or from Claude Opus 5.5 up to Claude Fable 5.1 or Claude Mythos 5.1 on the Claude API, keeps its reasoning. One that moves from Claude Opus 5.5 to any model other than those two, or onto it from a Claude Fable or Claude Mythos model, runs the turns after the switch without the previous model's reasoning. When a request carries a block the target model can't read, the API drops it before the model sees it: the request succeeds, and dropped blocks aren't billed. With the `thinking-binding-controls-2026-08-01` beta header the drop is reported in a top-level `input_transformations` array. See [Switching models mid-conversation](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#switching-models). -The API also checks whether anything before a Claude Opus 5.5 thinking block (the `system` prompt, the `tools`, or an earlier message) has changed since the block was produced. As on Claude Fable 5.1, it enforces that check by default for accounts created on or after August 31, 2026, 00:00 UTC, on the Claude API and on cloud platforms. On those accounts, a request that replays a block after such a change returns a 400 error. To drop the affected blocks instead, send the `thinking-binding-controls-2026-08-01` beta header and set `thinking.block_binding.prefix_mismatch_behavior` to `"drop_block"`. On older accounts, setting that field to either value opts the request in. Keep the conversation append-only so the question never arises: change instructions or tools with [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) rather than edits. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) and the migration guide's [note on this change](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-blocks). +The API also checks whether anything before a Claude Opus 5.5 thinking block (the `system` prompt, the `tools`, or an earlier message) has changed since the block was produced. As on Claude Fable 5.1, it enforces that check by default for accounts created on or after August 31, 2026, 00:00 UTC, on the Claude API and on cloud platforms. On those accounts, a request that replays a block after such a change returns a 400 error. To drop the affected blocks instead, send the `thinking-binding-controls-2026-08-01` beta header and set `thinking.block_binding.prefix_mismatch_behavior` to `"drop_block"`. On older accounts, setting that field to either value opts the request in. Keep the conversation append-only so the question never arises: change instructions or tools with [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) rather than edits. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) and the migration guide's [note on thinking blocks](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#thinking-blocks). ### The `computer_20251124` computer use tool is not supported on the Claude API and Google Cloud @@ -81,10 +81,10 @@ Claude Opus 5.5 differs from Claude Opus 5 in several ways that show up without * **The default effort is `medium`.** A request that omits `effort` runs at `medium`; on Claude Opus 5 it ran at `high`. Set `effort` explicitly and re-run your sweep; see [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort). * **More thinking per turn at a given effort level.** At the same [effort](https://platform.claude.com/docs/en/build-with-claude/effort) setting the model tends to think more per turn than Claude Opus 5, most of all at `xhigh` and `max`. Re-run your effort sweep rather than carrying a setting over, and leave room in `max_tokens` for the thinking. See [Calibrate effort](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#calibrate-effort). * **Text between tool calls comes back in thinking blocks.** The short notes the model writes between tool calls arrive as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates) rather than `text` blocks, so at the default `display: "omitted"` an application that streams them to its users goes quiet between tool calls, with no error. The [migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide#text-between-tool-calls) has the fix for receiving them, and [User-facing progress updates](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#user-facing-progress-updates) covers how to ask for more of them. -* **More safeguard categories.** The model runs a biology safety classifier in addition to the cybersecurity one. As on Claude Opus 5, requests that push it to reproduce its internal reasoning in the response text may be declined with the `reasoning_extraction` category. See [Refusals and fallback](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#refusals-and-fallback) and [Safeguard refusals](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#safeguard-refusals). -* **Sharper reading of charts, diagrams, and screenshots.** The model reads values off dense charts and layout-dependent visuals much more precisely without tools, so prompt-side vision workarounds built for earlier models may no longer be needed; image tools still add accuracy on the densest inputs. See [Tools for complex visual inputs](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#tools-for-complex-visual-inputs). +* **More safeguard categories.** The model runs a biology safety classifier in addition to the cybersecurity one. As on Claude Opus 5, requests that push it to reproduce its internal reasoning in the response text might be declined with the `reasoning_extraction` category. See [Refusals and fallback](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#refusals-and-fallback) and [Safeguard refusals](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#safeguard-refusals). +* **Sharper reading of charts, diagrams, and screenshots.** The model reads values off dense charts and layout-dependent visuals much more precisely without tools, so prompt-side vision workarounds built for earlier models might no longer be needed; image tools still add accuracy on the densest inputs. See [Tools for complex visual inputs](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#tools-for-complex-visual-inputs). -If your Claude Opus 5 integration ran with thinking disabled, see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled) alongside the [breaking change](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#thinking-cant-be-disabled). For the capability gains in agentic coding and code review, knowledge work, communication, visual inputs, and computer use, see [Capabilities relevant to prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#capability-improvements). +If your Claude Opus 5 integration ran with thinking disabled, see [Prompts written for thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#prompts-written-for-thinking-disabled) alongside the breaking change [Thinking can't be disabled](https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5#thinking-cant-be-disabled). For the capability gains in agentic coding and code review, knowledge work, communication, visual inputs, and computer use, see [Capabilities relevant to prompting](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5-5#capability-improvements). ## Refusals and fallback @@ -92,7 +92,7 @@ Claude Opus 5.5 ships with safety classifiers, and everything in [Refusals and f ## Pricing -Claude Opus 5.5 costs $4 USD per million input tokens and $20 USD per million output tokens, below Claude Opus 5's $5 and $25, with 5-minute cache writes at $5, 1-hour cache writes at $8, and cache reads at $0.20 per million tokens (0.05x the base input price). [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) is half price: $2 and $10. See [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for data residency and tool pricing. +Claude Opus 5.5 costs $4 USD per million input tokens and $20 USD per million output tokens, below Claude Opus 5's $5 and $25 USD, with 5-minute cache writes at $5 USD, 1-hour cache writes at $8 USD, and cache reads at $0.20 USD per million tokens (0.05x the base input price). [Batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) is half price: $2 and $10 USD. See [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for data residency and tool pricing. ## Availability diff --git a/content/en/models/overview.md b/content/en/models/overview.md index fdec53e52f..f256d366b5 100644 --- a/content/en/models/overview.md +++ b/content/en/models/overview.md @@ -63,7 +63,7 @@ See [Model IDs and versioning](https://platform.claude.com/docs/en/about-claude/ Legacy models (still available): [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview), [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview), [Claude Opus 4.8](https://platform.claude.com/docs/en/models/opus-4-8/overview), [Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-4-7/overview), [Claude Opus 4.6](https://platform.claude.com/docs/en/models/opus-4-6/overview), [Claude Opus 4.5](https://platform.claude.com/docs/en/models/opus-4-5/overview), [Claude Sonnet 5](https://platform.claude.com/docs/en/models/sonnet-5/overview), [Claude Sonnet 4.6](https://platform.claude.com/docs/en/models/sonnet-4-6/overview), [Claude Haiku 4.5](https://platform.claude.com/docs/en/models/haiku-4-5/overview). -Once you've picked a model, [learn how to make your first API call](https://platform.claude.com/docs/en/get-started). To understand how model IDs, aliases, and snapshots work, see [Model IDs and versioning](https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions); for the reliable-knowledge and training-data cutoffs behind each model, see [Anthropic's Transparency Hub](https://www.anthropic.com/transparency). +Once you've picked a model, [learn how to make your first API call](https://platform.claude.com/docs/en/get-started). To understand how model IDs, aliases, and snapshots work, see [Model IDs and versioning](https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions); for the reliable-knowledge and training-data cutoffs behind each model, see Anthropic's [Transparency Hub](https://www.anthropic.com/transparency). ## Using the Models API @@ -85,11 +85,11 @@ Current Claude models excel in: * **Performance:** Top-tier results in reasoning, coding, multilingual tasks, long-context handling, honesty, and image processing. See [Prompting best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices) for general and model-specific prompting guidance. * **Engaging responses:** Claude models are ideal for applications that require rich, human-like interactions. If you prefer more concise responses, adjust your prompts to guide the model toward the desired output length. Refer to the [prompt engineering guides](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering) for details. -* **Output quality:** When migrating from a previous model generation, you may notice larger improvements in overall performance. If you're on Claude Opus 5 or earlier, see the [Claude Opus 5.5 migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide). +* **Output quality:** When migrating from a previous model generation, you might notice larger improvements in overall performance. If you're on Claude Opus 5 or earlier, see the [Claude Opus 5.5 migration guide](https://platform.claude.com/docs/en/models/opus-5-5/migration-guide). ## Get started with Claude -If you're ready to start exploring what Claude can do for you, dive in! Whether you're a developer looking to integrate Claude into your applications or a user wanting to experience the power of AI firsthand, the following resources can help. +Whether you're a developer looking to integrate Claude into your applications or a user wanting to experience the power of AI firsthand, the following resources can help. @@ -117,4 +117,4 @@ If you're ready to start exploring what Claude can do for you, dive in! Whether -Looking to chat with Claude? Visit [claude.ai](https://claude.ai). If you have questions, reach out to the [support team](https://support.claude.com/) or the [Discord community](https://www.anthropic.com/discord). +Looking to chat with Claude? Visit [claude.ai](https://claude.ai). If you have questions, contact the [support team](https://support.claude.com/) or the [Discord community](https://www.anthropic.com/discord). diff --git a/content/en/models/sonnet-5-5/migration-guide.md b/content/en/models/sonnet-5-5/migration-guide.md index 585f9e87a0..4ddbbfd0aa 100644 --- a/content/en/models/sonnet-5-5/migration-guide.md +++ b/content/en/models/sonnet-5-5/migration-guide.md @@ -22,11 +22,11 @@ This guide lists the code changes for moving to Claude Sonnet 5.5 from Claude So The skill applies the model ID swap and, as needed, breaking parameter changes, prefill replacement, and effort calibration for your target model across your code base, then produces a checklist of items to verify manually. It asks you to confirm the migration scope (entire working directory, a subdirectory, or a specific file list) before editing any files. The skill also detects Amazon Bedrock and Claude Platform on AWS clients and adjusts model ID formats and feature changes for those platforms. -Claude Sonnet 5.5 has the same prices as Claude Sonnet 5, except for prompt cache reads, which cost $0.10 USD per million tokens, half the Claude Sonnet 5 rate. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). For its context window and output limits, see the [Claude Sonnet 5.5 model page](https://platform.claude.com/docs/en/models/sonnet-5-5/overview). For features and prompting, see [What's new in Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#feature-support) and [Prompting Claude Sonnet 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5). +Claude Sonnet 5.5 has the same prices as Claude Sonnet 5, except for prompt cache reads, which cost $0.10 USD per million tokens, half the Claude Sonnet 5 rate. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). For its context window and output limits, see the [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/overview) model page. For features and prompting, see [What's new in Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#feature-support) and [Prompting Claude Sonnet 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5). ## Send a request to Claude Sonnet 5.5 -This request works on Claude Sonnet 5.5 as written. It sets an effort level, and the SDK tabs read the reply by block type. It leaves out five settings that return a 400 error: [thinking budgets](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#sonnet-46-breaking-changes), [sampling parameters](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#sonnet-46-breaking-changes), [assistant prefill](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#migrating-from-sonnet-45), [forced tool choice](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#forced-tool-use), and [`thinking: {"type": "disabled"}`](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking). +This request works on Claude Sonnet 5.5 as written. The example sets an effort level and, in the SDK, reads the reply by block type. It leaves out five settings that return a 400 error: [thinking budgets](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#sonnet-46-breaking-changes), [sampling parameters](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#sonnet-46-breaking-changes), [assistant prefill](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#migrating-from-sonnet-45), [forced tool choice](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#forced-tool-use), and [`thinking: {"type": "disabled"}`](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking). ```bash cURL @@ -106,8 +106,7 @@ This request works on Claude Sonnet 5.5 as written. It sets an effort level, and Model = Model.ClaudeSonnet5_5, MaxTokens = 4096, Messages = [ - new() { - Role = Role.User, + new UserMessageParam { Content = "Analyze the trade-offs between microservices and monolithic architectures" } ], @@ -199,7 +198,7 @@ This request works on Claude Sonnet 5.5 as written. It sets an effort level, and client = Anthropic::Client.new message = client.messages.create( - model: "claude-sonnet-5-5", + model: Anthropic::Model::CLAUDE_SONNET_5_5, max_tokens: 4096, messages: [ { role: "user", content: "Analyze the trade-offs between microservices and monolithic architectures" } @@ -231,7 +230,7 @@ On Claude Sonnet 5.5, a request with no `thinking` field runs with [adaptive thi Code that ran without thinking needs all three items. Code from Claude Sonnet 5 likely has the first two. -* **Read content blocks by `type`.** A response can begin with `thinking` blocks, so code that reads `content[0].text` breaks. +* **Read content blocks by `type`.** A response can start with `thinking` blocks, so code that reads `content[0].text` breaks. * **Pass `thinking` blocks back unchanged** in tool-use loops, including empty ones. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). * **Revisit `max_tokens`.** It covers thinking plus text, and thinking tokens are billed as output tokens. See [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). @@ -247,7 +246,7 @@ To turn thinking off on this model, send "thinking": {"type": "between_tools"} i `between_tools` works on every platform that offers Claude Sonnet 5.5, with no beta header. It's accepted at `low`, `medium`, and `high` effort. At `xhigh` or `max`, it returns a 400 error. To run at those levels, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`. `between_tools` takes no other field: `display`, `budget_tokens`, or `block_binding` sent with it returns a 400 error. With [server-side fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#server-side-fallback), a `between_tools` request that falls back to Claude Sonnet 5 runs there with `thinking: {"type": "disabled"}`. -With `between_tools`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort per turn, use adaptive thinking. For prompting guidance, see [Running without up-front thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#running-without-up-front-thinking). +With `between_tools`, effort can't change mid-conversation: a per-message `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort for each turn, use adaptive thinking. For prompting guidance, see [Running without up-front thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5#running-without-up-front-thinking). Before (Claude Sonnet 5): @@ -302,7 +301,7 @@ Before (Claude Sonnet 5): MaxTokens = 16000, Thinking = new ThinkingConfigDisabled(), OutputConfig = new() { Effort = Effort.Xhigh }, - Messages = [new() { Role = Role.User, Content = "..." }], + Messages = [new UserMessageParam { Content = "..." }], }); ``` @@ -410,7 +409,7 @@ After (Claude Sonnet 5.5): MaxTokens = 16000, Thinking = new ThinkingConfigBetweenTools(), OutputConfig = new() { Effort = Effort.High }, - Messages = [new() { Role = Role.User, Content = "..." }], + Messages = [new UserMessageParam { Content = "..." }], }); ``` @@ -467,13 +466,13 @@ After (Claude Sonnet 5.5): ## Migration checklist by starting model -Work down the groups and stop after the one that names your model. On Claude Haiku 4.5, apply every group except "Claude Sonnet 4 or earlier", ending with "Claude Haiku 4.5 only". +Work down the groups and stop after the one that names your model. On Claude Haiku 4.5, apply every group except "Claude Sonnet 4 or earlier," ending with "Claude Haiku 4.5 only." ### Every starting model * Change the model ID to `claude-sonnet-5-5`. * [Read content blocks by `type`](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-in-responses), and pass `thinking` blocks back unchanged. -* To keep running without up-front thinking, send [the lowest thinking setting](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking) at `high` effort or below. +* To keep running without up-front thinking, send the [lowest thinking setting](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking) at `high` effort or below. * Replace [forced tool use](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#forced-tool-use) with `auto` and strict tools. * Keep conversations [append-only](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-blocks). * On the Claude API and Google Cloud, move computer use to the [toolset](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#computer-use-toolset), without the `fine-grained-tool-streaming-2025-05-14` beta header. @@ -486,7 +485,7 @@ Work down the groups and stop after the one that names your model. On Claude Hai * Expect [thinking on requests with no `thinking` field](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-on-by-default), and revisit `max_tokens`. * Replace [thinking budgets](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#sonnet-46-breaking-changes) with an effort level. -* Remove non-default `temperature`, `top_p`, and `top_k` values. +* Remove `temperature`, `top_p`, and `top_k`. * If you [show thinking text](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-in-responses), set `display: "summarized"`. * [Recount tokens](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#other-changes-from-claude-sonnet-4-6), and re-budget image tokens. @@ -610,7 +609,7 @@ Before (Claude Sonnet 5): MaxTokens = 1024, Tools = [.. tools], ToolChoice = new ToolChoiceTool { Name = "get_weather" }, - Messages = [new() { Role = Role.User, Content = "What's the weather in Paris?" }], + Messages = [new UserMessageParam { Content = "What's the weather in Paris?" }], }); ``` @@ -762,9 +761,8 @@ After (Claude Sonnet 5.5): ToolChoice = new ToolChoiceAuto(), Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "What's the weather in Paris? Use the get_weather tool.", }, ], @@ -877,7 +875,7 @@ Claude Sonnet 5.5 declines in more categories than Claude Sonnet 5. A decline re * **`"cyber"`:** The request could enable cyber harm, such as malware or exploit development. * **`"bio"`:** The request could enable biological harm, such as dangerous lab methods. -* **`"frontier_llm"`:** The request could assist the development of competing AI models. +* **`"frontier_llm"`:** The request could help with the development of competing AI models. * **`"reasoning_extraction"`:** The request asks the model to reproduce its internal reasoning in the response text. * **`"general_harms"`:** The request falls under another usage-policy area. Benign work can also trigger this category. @@ -976,7 +974,7 @@ Before (Claude Sonnet 4.6): Model = Model.ClaudeSonnet4_6, MaxTokens = 16000, Thinking = new ThinkingConfigEnabled(budgetTokens: 10000), - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }; var response = await client.Messages.Create(parameters); @@ -1029,7 +1027,7 @@ Before (Claude Sonnet 4.6): client = Anthropic::Client.new message = client.messages.create( - model: "claude-sonnet-4-6", + model: Anthropic::Model::CLAUDE_SONNET_4_6, max_tokens: 16000, thinking: { type: "enabled", @@ -1114,7 +1112,7 @@ After (Claude Sonnet 5.5): MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), OutputConfig = new OutputConfig { Effort = Effort.High }, // or Max, Xhigh, Medium, Low - Messages = [new() { Role = Role.User, Content = "..." }] + Messages = [new UserMessageParam { Content = "..." }] }; var response = await client.Messages.Create(parameters); @@ -1176,7 +1174,7 @@ After (Claude Sonnet 5.5): client = Anthropic::Client.new message = client.messages.create( - model: "claude-sonnet-5-5", + model: Anthropic::Model::CLAUDE_SONNET_5_5, max_tokens: 16000, thinking: { type: "adaptive" @@ -1191,15 +1189,15 @@ After (Claude Sonnet 5.5): ``` -**Sampling parameters return an error.** Claude Sonnet 4.6 and earlier models and Claude Haiku 4.5 accept `temperature`, `top_p`, and `top_k`. On Claude Sonnet 5.5, a non-default value returns a 400 error. Remove them. +**Sampling parameters return an error.** Remove `temperature`, `top_p`, and `top_k`. **Thinking text is omitted by default.** See [Handle thinking in responses](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-in-responses). ### Other changes -* **About 30% more tokens:** Claude Sonnet 5.5 uses Claude Sonnet 5's tokenizer. Against Claude Sonnet 4.6, Claude Sonnet 4.5, and Claude Haiku 4.5, the same text produces about 30% more tokens, depending on the content. Recount with [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting), and revisit `max_tokens` and cost. +* **About 30 percent more tokens:** Claude Sonnet 5.5 uses Claude Sonnet 5's tokenizer. Against Claude Sonnet 4.6, Claude Sonnet 4.5, and Claude Haiku 4.5, the same text produces about 30 percent more tokens, depending on the content. Recount with [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting), and revisit `max_tokens` and cost. * **Effort:** `xhigh` is new, and the levels are recalibrated. See [Recommended changes](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#recommended-changes). -* **Images:** Claude Sonnet 5.5 uses the high-resolution image tier, up to 2576 pixels on the long edge and 4,784 visual tokens per image. Claude Sonnet 4.6, Claude Sonnet 4.5, and Claude Haiku 4.5 stop at 1568 pixels and 1,568 tokens. A 2000×1500 image costs about 2.5 times as many tokens on Claude Sonnet 5.5. See [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size). +* **Images:** Claude Sonnet 5.5 uses the high-resolution image tier, up to 2,576 pixels on the long edge and 4,784 visual tokens per image. Claude Sonnet 4.6, Claude Sonnet 4.5, and Claude Haiku 4.5 stop at 1,568 pixels and 1,568 tokens. A 2000×1500 image costs about 2.5 times as many tokens on Claude Sonnet 5.5. See [Resolution and token cost](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size). ### Migrating from Claude Sonnet 4.5 or earlier @@ -1225,11 +1223,11 @@ Replace each prefill according to what it was for: **Effort.** Claude Sonnet 4.5 has no effort parameter. Set an effort level explicitly, as [Recommended changes](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#recommended-changes) describes. -**Context and output.** Claude Sonnet 5.5 has a larger context window, with no beta header, and a higher output limit. See the [model page](https://platform.claude.com/docs/en/models/sonnet-5-5/overview). Remove any context-window beta header. +**Context and output.** Claude Sonnet 5.5 has a larger context window, with no beta header, and a higher output limit. See the [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/overview) model page. Remove any context-window beta header. -**Beta headers.** Remove `interleaved-thinking-2025-05-14`, since adaptive thinking interleaves automatically. Replace `fine-grained-tool-streaming-2025-05-14` with `eager_input_streaming: true` on each tool that needs it. That header returns a 400 error alongside a computer use or browser use toolset entry. See [Fine-grained tool streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming). +**Beta headers.** Remove `interleaved-thinking-2025-05-14`, because adaptive thinking interleaves automatically. Replace `fine-grained-tool-streaming-2025-05-14` with `eager_input_streaming: true` on each tool that needs it. That header returns a 400 error alongside a computer use or browser use toolset entry. See [Fine-grained tool streaming](https://platform.claude.com/docs/en/agents-and-tools/tool-use/fine-grained-tool-streaming). -**Structured outputs.** The `output_format` parameter is deprecated and will be removed in the future. To use it anyway, add the `structured-outputs-2025-11-13` beta header. Without it, the API returns a 400 error. Use `output_config.format` instead. +**Structured outputs.** The `output_format` parameter is deprecated. To use it anyway, add the `structured-outputs-2025-11-13` beta header. Without it, the API returns a 400 error. Use `output_config.format` instead. ### Migrating from Claude Sonnet 4 or earlier diff --git a/content/en/models/sonnet-5-5/overview.md b/content/en/models/sonnet-5-5/overview.md index f56832c22e..2284725db2 100644 --- a/content/en/models/sonnet-5-5/overview.md +++ b/content/en/models/sonnet-5-5/overview.md @@ -1,7 +1,7 @@ --- title: Claude Sonnet 5.5 url: https://platform.claude.com/docs/en/models/sonnet-5-5/overview -description: "Claude Sonnet 5.5 at a glance: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." +description: "An overview of Claude Sonnet 5.5: what it's for, model IDs on every platform, context window, output limits, pricing, availability, and the guides and resources for building with it." --- **Latest.** Released September 28, 2026. @@ -96,7 +96,7 @@ One more change alters the response shape without failing any request: [text bet ## Good to know * Adaptive thinking is on by default. The lowest thinking setting is `between_tools`, which turns off up-front thinking. It works at `high` effort or below. See [What's new in Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#turn-off-up-front-thinking). -* Setting `temperature`, `top_p`, or `top_k` to a non-default value returns a 400 error. +* Setting `temperature`, `top_p`, or `top_k` returns a 400 error. * The minimum cacheable prompt length is 512 tokens. See [Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-limitations). * On the [Message Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing#extended-output-beta), Claude Sonnet 5.5 supports up to 300k output tokens with the `output-300k-2026-03-24` beta header. * Query limits and capabilities programmatically with the [Models API](https://platform.claude.com/docs/en/api/models/list). @@ -109,7 +109,7 @@ One more change alters the response shape without failing any request: [text bet - The control for thinking depth, latency, and cost. Choose a level per workload. + The control for thinking depth, latency, and cost. Choose a level for each workload. diff --git a/content/en/models/sonnet-5-5/whats-new-sonnet-5-5.md b/content/en/models/sonnet-5-5/whats-new-sonnet-5-5.md index f535b25b95..3bad1d9819 100644 --- a/content/en/models/sonnet-5-5/whats-new-sonnet-5-5.md +++ b/content/en/models/sonnet-5-5/whats-new-sonnet-5-5.md @@ -32,9 +32,9 @@ To turn off up-front thinking on Claude Sonnet 5.5, send `thinking: {"type": "be On Claude Sonnet 5.5, a request that sends `thinking: {"type": "disabled"}` returns a 400 `invalid_request_error` whose message points to `between_tools`. -`between_tools` is accepted at `low`, `medium`, and `high` effort. At `xhigh` or `max` effort, a request with `between_tools` returns a 400 error. To run at `xhigh` or `max`, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`, which is equivalent. With `between_tools`, effort can't change mid-conversation: a [per-message](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort per turn, use adaptive thinking. +`between_tools` is accepted at `low`, `medium`, and `high` effort. At `xhigh` or `max` effort, a request with `between_tools` returns a 400 error. To run at `xhigh` or `max`, use adaptive thinking: omit the `thinking` field or send `thinking: {"type": "adaptive"}`, which is equivalent. With `between_tools`, effort can't change mid-conversation: a [per-message](https://platform.claude.com/docs/en/build-with-claude/effort#change-effort-mid-conversation-beta) `output_config.effort` that differs from the level in effect returns a 400 error. To vary effort for each turn, use adaptive thinking. -`between_tools` takes no other field: `display`, `budget_tokens`, or `block_binding` sent with it returns a 400 error. Manual thinking budgets (`thinking: {"type": "enabled", "budget_tokens": N}`) return a 400 error. See [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) and the migration guide's [before and after](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking). +`between_tools` takes no other field: `display`, `budget_tokens`, or `block_binding` sent with it returns a 400 error. Manual thinking budgets (`thinking: {"type": "enabled", "budget_tokens": N}`) return a 400 error. See [Thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) and [Turn off up-front thinking](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#turn-off-up-front-thinking) in the migration guide. ### Forced tool use is not supported @@ -54,7 +54,7 @@ So a conversation that moves from Claude Sonnet 5 onto Claude Sonnet 5.5, or fro The API also checks whether anything before a Claude Sonnet 5.5 thinking block has changed since the block was produced: the `system` prompt, the `tools`, or an earlier message. It enforces that check by default for accounts created on or after August 31, 2026, 00:00 UTC, on the Claude API, Amazon Bedrock, and Google Cloud. On those accounts, a request that replays a block after such a change returns a 400 error. To drop the affected blocks instead, send the `thinking-binding-controls-2026-08-01` beta header and set `thinking.block_binding.prefix_mismatch_behavior` to `"drop_block"`. On older accounts, setting that field to either value opts the request in. `block_binding` works only with `thinking: {"type": "adaptive"}`. With `between_tools`, keep the history append-only, or strip the thinking blocks from the edited turn on. -Keep the conversation append-only so the check never fails: change instructions or tools with [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) rather than edits. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) and the migration guide's [note on this change](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-blocks). +Keep the conversation append-only so the check never fails: change instructions or tools with [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) rather than edits. See [Preserved thinking](https://platform.claude.com/docs/en/build-with-claude/preserved-thinking) and the migration guide's [note on thinking blocks](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#thinking-blocks). ### The `computer_20251124` computer use tool is not supported on the Claude API and Google Cloud @@ -93,8 +93,8 @@ Thinking blocks that Claude Sonnet 5.5 produces work only in the account that pr Claude Sonnet 5.5 differs from Claude Sonnet 5 in several ways that show up without any code change. [Prompting Claude Sonnet 5.5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-sonnet-5-5) has guidance for each: * **Effort levels are recalibrated.** An [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level doesn't produce the same amount of thinking as it did on Claude Sonnet 5. Re-run your effort sweep rather than carrying a setting over. Start at `high` unless your workload is agentic or latency-sensitive. For agentic coding and multistep tool use, start at `medium` for well-specified tasks and move to `high` for harder or longer ones. For chat and other latency-sensitive work, start at `medium` or `low`. -* **Text between tool calls comes back in thinking blocks.** Between tool calls, notes longer than a sentence or two come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). Shorter remarks stay `text`. At the default `display: "omitted"`, the progress-update blocks' text is empty, so an application that streams those notes to its users goes quiet between tool calls, with no error. If you [turn off up-front thinking with `between_tools`](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#turn-off-up-front-thinking), the text comes back. The [migration guide](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#text-between-tool-calls) shows how to receive it. -* **Safeguard categories.** The model's safeguards can decline a request in five [`stop_details` categories](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). `"cyber"` means the request could enable cyber harm. `"bio"` means it could enable biological harm. `"frontier_llm"` means it could assist the development of competing AI models. `"reasoning_extraction"` means it asks the model to reproduce its internal reasoning in the response text. `"general_harms"` means it falls under another usage-policy area. See [Refusals, fallback, and billing](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#refusals-fallback-and-billing). +* **Text between tool calls comes back in thinking blocks.** Between tool calls, notes longer than a sentence or two come back as [progress-update `thinking` blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#progress-updates). Shorter remarks stay `text`. At the default `display: "omitted"`, the progress-update blocks' text is empty, so an application that streams those notes to its users goes quiet between tool calls, with no error. If you [turn off up-front thinking with `between_tools`](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#turn-off-up-front-thinking), the text comes back. To receive it, see [Text between tool calls is returned in thinking blocks](https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide#text-between-tool-calls) in the migration guide. +* **Safeguard categories.** The model's safeguards can decline a request in five [`stop_details` categories](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). `"cyber"` means the request could enable cyber harm. `"bio"` means it could enable biological harm. `"frontier_llm"` means it could help with the development of competing AI models. `"reasoning_extraction"` means it asks the model to reproduce its internal reasoning in the response text. `"general_harms"` means it falls under another usage-policy area. See [Refusals, fallback, and billing](https://platform.claude.com/docs/en/models/sonnet-5-5/whats-new-sonnet-5-5#refusals-fallback-and-billing). ## Refusals, fallback, and billing diff --git a/content/en/models/sonnet-5/overview.md b/content/en/models/sonnet-5/overview.md index 4343d9ffb2..a79444881b 100644 --- a/content/en/models/sonnet-5/overview.md +++ b/content/en/models/sonnet-5/overview.md @@ -81,7 +81,7 @@ Context window: 1M tokens · Max output: 128K tokens · Input pricing: $2 / MTok ## Good to know * On the [Message Batches API](https://platform.claude.com/docs/en/build-with-claude/batch-processing#extended-output-beta), Claude Sonnet 5 supports up to 300k output tokens with the `output-300k-2026-03-24` beta header. -* Setting `temperature`, `top_p`, or `top_k` to non-default values returns a 400 error. +* Setting `temperature`, `top_p`, or `top_k` returns a 400 error. * Query limits and capabilities programmatically with the [Models API](https://platform.claude.com/docs/en/api/models/list). ## Resources @@ -104,11 +104,11 @@ Context window: 1M tokens · Max output: 128K tokens · Input pricing: $2 / MTok - Effort defaults to `high` on the Claude API and Claude Code. Choose a level per workload. + Effort defaults to `high` on the Claude API and Claude Code. Choose a level for each workload. - 1M tokens by default. How the window is counted and managed. + Holds 1M tokens by default. How the window is counted and managed. diff --git a/content/en/release-notes/overview.md b/content/en/release-notes/overview.md index 26739011a1..1fb8eb9870 100644 --- a/content/en/release-notes/overview.md +++ b/content/en/release-notes/overview.md @@ -12,6 +12,14 @@ The Claude Platform release notes list changes to the Claude API, the client SDK For updates to Claude Code, see the [complete CHANGELOG.md](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md) in the `claude-code` repository. +### October 21, 2026 + +* We've released API version `2026-10-21`. [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21) shows how to upgrade. +* We've released new versions of the [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) and the [`ant` CLI](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart) that send API version `2026-10-21` by default: Python SDK 2.0.0, TypeScript SDK 1.0.0, C# SDK 13.0.0, Go SDK 2.0.0, Java SDK 3.0.0, PHP SDK 1.0.0, Ruby SDK 2.0.0, and `ant` CLI 2.0.0. See [Switch to 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade). +* The new SDK and CLI versions also have breaking changes that don't depend on the API version, and they are licensed under Apache 2.0 instead of the MIT License. See [SDK and CLI changes](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-changes). + +- We've added the `enforcement_status` and `enforcement_actions` fields to [user profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles), so you can see whether Anthropic has restricted or banned one of your end customers. To find the profiles that have an open restriction or ban, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with the new `enforcement_status[]` filter. See [Check whether Anthropic has restricted or banned a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles#check-whether-anthropic-has-restricted-or-banned-a-profile). + ### October 20, 2026 * [Inference hooks](https://platform.claude.com/docs/en/manage-claude/inference-hooks) are out of beta for Claude Enterprise organizations. diff --git a/content/en/resources/overview.md b/content/en/resources/overview.md index f568d13a4e..6ce99c355d 100644 --- a/content/en/resources/overview.md +++ b/content/en/resources/overview.md @@ -82,7 +82,7 @@ description: Model cards with detailed documentation for Claude models. - Detailed documentation of Claude 3 models including latest 3.5 addendum. + Detailed documentation of Claude 3 models including the latest 3.5 addendum. diff --git a/content/en/test-and-evaluate/develop-tests.md b/content/en/test-and-evaluate/develop-tests.md index 83f5b348f5..5c097f8653 100644 --- a/content/en/test-and-evaluate/develop-tests.md +++ b/content/en/test-and-evaluate/develop-tests.md @@ -35,7 +35,7 @@ Good success criteria are: **Quantitative methods:** * A/B testing: Compare performance against a baseline model or earlier version. - * User feedback: Implicit measures like task completion rates. + * User feedback: Implicit measures such as task completion rates. * Edge case analysis: Percentage of edge cases handled without errors. **Qualitative scales:** @@ -63,7 +63,7 @@ Here are some criteria that might be important for your use case. This list is n - How well does the model need to perform on the task? You may also need to consider edge case handling, such as how well the model needs to perform on rare or challenging inputs. + How well does the model need to perform on the task? You might also need to consider edge case handling, such as how well the model needs to perform on rare or challenging inputs. @@ -71,7 +71,7 @@ Here are some criteria that might be important for your use case. This list is n - How well does the model directly address the user's questions or instructions? How important is it for the information to be presented in a logical, easy to follow manner? + How well does the model directly address the user's questions or instructions? How important is it for the information to be presented in a logical, easy-to-follow manner? @@ -91,7 +91,7 @@ Here are some criteria that might be important for your use case. This list is n - What is your budget for running the model? Consider factors like the cost for each API call, the size of the model, and the frequency of usage. + What is your budget for running the model? Consider factors such as the cost for each API call, the size of the model, and the frequency of usage. @@ -126,7 +126,7 @@ Most use cases need multidimensional evaluation along several success criteria. - **What it measures:** Exact match evals measure whether the model's output matches a predefined correct answer, typically after normalizing whitespace and case. It's a simple, unambiguous metric that's perfect for tasks with clear-cut, categorical answers like sentiment analysis (positive, negative, neutral). + **What it measures:** Exact match evals measure whether the model's output matches a predefined correct answer, typically after normalizing whitespace and case. It's a simple, unambiguous metric that's perfect for tasks with clear-cut, categorical answers such as sentiment analysis (positive, negative, neutral). **Example eval test cases:** 1,000 tweets with human-labeled sentiments. @@ -238,7 +238,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); return ContentText(message); } @@ -664,7 +664,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 2048, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); foreach (var block in message.Content) { @@ -1180,7 +1180,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); return ContentText(message); } @@ -1561,7 +1561,7 @@ Most use cases need multidimensional evaluation along several success criteria. - **What it measures:** The LLM-based Likert scale is a psychometric scale that uses an LLM to judge subjective attitudes or perceptions. Here, it's used to rate the tone of responses on a scale from 1 to 5. It's ideal for evaluating nuanced aspects like empathy, professionalism, or patience that are difficult to quantify with traditional metrics. + **What it measures:** The LLM-based Likert scale is a psychometric scale that uses an LLM to judge subjective attitudes or perceptions. Here, it's used to rate the tone of responses on a scale from 1 to 5. It's ideal for evaluating nuanced aspects such as empathy, professionalism, or patience that are difficult to quantify with traditional metrics. **Example eval test cases:** 100 customer inquiries with target tone (empathetic, patient, professional). @@ -1706,7 +1706,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 2048, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); return ContentText(message); } @@ -1726,7 +1726,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = tonePrompt }], + Messages = [new UserMessageParam { Content = tonePrompt }], }); return int.Parse(ContentText(response).Trim()); } @@ -2032,7 +2032,7 @@ Most use cases need multidimensional evaluation along several success criteria. - **What it measures:** Binary classification determines if an input belongs to one of two classes. Here, it's used to classify whether a response contains PHI or not. This method can account for context and identify subtle or implicit forms of PHI that rule-based systems might miss. + **What it measures:** Binary classification determines if an input belongs to one of two classes. Here, it's used to classify whether a response contains PHI. This method can account for context and identify subtle or implicit forms of PHI that rule-based systems might miss. **Example eval test cases:** 500 simulated patient queries, some with PHI. @@ -2202,7 +2202,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); return ContentText(message); } @@ -2232,7 +2232,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = binaryPrompt }], + Messages = [new UserMessageParam { Content = binaryPrompt }], }); return ContentText(response).Trim().ToLowerInvariant() == "no"; } @@ -2806,11 +2806,10 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [.. conversation.Select(turn => new MessageParam - { - Role = turn.Role == "user" ? Role.User : Role.Assistant, - Content = turn.Content, - })], + Messages = [.. conversation.Select(turn => + turn.Role == "user" + ? new UserMessageParam { Content = turn.Content } + : new AssistantMessageParam { Content = turn.Content })], }); return ContentText(message); } @@ -2835,7 +2834,7 @@ Most use cases need multidimensional evaluation along several success criteria. { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = ordinalPrompt }], + Messages = [new UserMessageParam { Content = ordinalPrompt }], }); return int.Parse(ContentText(response).Trim()); } @@ -3233,13 +3232,13 @@ When deciding which method to use to grade evals, choose the fastest, most relia 2. **Human grading:** Most flexible and high quality, but slow and expensive. Avoid if possible. -3. **LLM-based grading:** Fast and flexible, scalable and suitable for complex judgment. Test to ensure reliability first then scale. +3. **LLM-based grading:** Fast and flexible, scalable and suitable for complex judgment. Test to ensure reliability first, then scale. ### Tips for LLM-based grading * **Have detailed, clear rubrics:** "The answer should always mention 'Acme Inc.' in the first sentence. If it does not, the answer is automatically graded as 'incorrect.'" - A given use case, or even a specific success criteria for that use case, might require several rubrics for holistic evaluation. + A given use case, or even a specific success criterion for that use case, might require several rubrics for holistic evaluation. * **Empirical or specific:** For example, instruct the LLM to output only 'correct' or 'incorrect', or to judge from a scale of 1–5. Purely qualitative evaluations are hard to assess quickly and at scale. * **Encourage reasoning:** Use a grader model with [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) on, so that it reasons before it produces an evaluation score. This increases evaluation performance, particularly for tasks requiring complex judgment. @@ -3379,7 +3378,7 @@ When deciding which method to use to grade evals, choose the fastest, most relia { Model = Model.ClaudeOpus5_5, MaxTokens = 2048, - Messages = [new() { Role = Role.User, Content = BuildGraderPrompt(output, goldenAnswer) }], + Messages = [new UserMessageParam { Content = BuildGraderPrompt(output, goldenAnswer) }], }); return ContentText(graderResponse).ToLowerInvariant().Contains("correct") ? "correct" @@ -3401,7 +3400,7 @@ When deciding which method to use to grade evals, choose the fastest, most relia { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = prompt }], + Messages = [new UserMessageParam { Content = prompt }], }); return ContentText(message); } @@ -3717,7 +3716,7 @@ When deciding which method to use to grade evals, choose the fastest, most relia **Tip:** Drop this page into the chat as guidance for Claude! - + More code examples of human-, code-, and LLM-graded evals. diff --git a/content/en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals.md b/content/en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals.md index de9891a966..1795a53ed5 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/handle-streaming-refusals.md @@ -35,7 +35,7 @@ When streaming classifiers detect content that violates Anthropic's policies, th In the event stream, `stop_details` arrives on the `message_delta` event alongside `stop_reason`. - A `refusal` response from streaming classifiers includes a `stop_details` object with a `category` and a human-readable `explanation` that you can surface to the user. See [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) for the full response shape and the available categories. + A `refusal` response from streaming classifiers includes a `stop_details` object with a `category` and a human-readable `explanation` that you can surface to the user. See [What a refusal looks like](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) for the full response shape and the available categories. On a refusal the `stop_details` object is always present, but its `category` and `explanation` fields can be `null`, for example when the refusal maps to no named category. Branch on `stop_reason` or `stop_details.type` rather than assuming `category` and `explanation` are populated, and provide your own user-facing messaging when they are `null`. @@ -130,7 +130,7 @@ Here's how to detect and handle streaming refusals in your application: { Model = Model.ClaudeOpus5_5, MaxTokens = 1024, - Messages = [new() { Role = Role.User, Content = "Hello" }] + Messages = [new UserMessageParam { Content = "Hello" }] }; try @@ -301,19 +301,19 @@ The API currently handles refusals in three different ways: ## Best practices -* **Monitor for refusals:** Include **`stop_reason`: `refusal`** checks in your error handling -* **Reset automatically:** Implement automatic context reset when refusals are detected -* **Fall back to another model:** Configure [server-side fallback or the SDK middleware](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) so refused requests are retried on another Claude model instead of surfacing a refusal to the user. Claude Haiku 5.5 has no server-side fallback, so set up its retry in your client -* **Redeem fallback credit on manual retries:** If you build the retry yourself, pass the refusal's [fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) token so the retry doesn't pay the prompt-cache cost twice. Claude Haiku 5.5 refusals carry no fallback credit -* **Provide custom messaging:** Create user-friendly messages for better UX when refusals occur -* **Track refusal patterns:** Monitor refusal frequency to identify potential issues with your prompts +* **Monitor for refusals:** Include **`stop_reason`: `refusal`** checks in your error handling. +* **Reset automatically:** Implement automatic context reset when refusals are detected. +* **Fall back to another model:** Configure [server-side fallback or the SDK middleware](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) so refused requests are retried on another Claude model instead of surfacing a refusal to the user. Claude Haiku 5.5 has no server-side fallback, so set up its retry in your client. +* **Redeem fallback credit on manual retries:** If you build the retry yourself, pass the refusal's [fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) token so the retry doesn't pay the prompt-cache cost twice. Claude Haiku 5.5 refusals carry no fallback credit. +* **Provide custom messaging:** Create user-friendly messages for better UX when refusals occur. +* **Track refusal patterns:** Monitor refusal frequency to identify potential issues with your prompts. ## Migration notes If you built refusal handling when this feature first shipped, or you're adding it to an existing integration, check the following: * **Refusals are responses, not errors.** A refusal arrives as a successful HTTP 200 response with `stop_reason`: `"refusal"`, so monitoring built only on error rates won't surface it. Track refusals as their own signal. -* **Refusals include structured detail.** On every model, a refusal also includes a `stop_details` object that identifies the policy category behind the decline. See [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) for the full response shape. +* **Refusals include structured detail.** On every model, a refusal also includes a `stop_details` object that identifies the policy category behind the decline. See [What a refusal looks like](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response) for the full response shape. * **Retry on a different model.** Re-sending a refused request to the same model usually results in another refusal. Instead of only resetting context, retry on a fallback model with [server-side fallback, the SDK middleware, or a manual retry](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback), and redeem [fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit) when you build the retry yourself. Claude Haiku 5.5 has no server-side fallback, and its refusals carry no fallback credit, so set up its retry in your client. * **Check batch results for refusals.** A refused request in a [Message Batch](https://platform.claude.com/docs/en/build-with-claude/batch-processing) is returned as a succeeded result with `stop_reason`: `"refusal"`, not as an errored result. * **Centralize handling on `stop_reason`.** The API continues to consolidate refusal handling around `stop_reason`: `"refusal"`, so branch on the stop reason rather than on model-specific behavior. diff --git a/content/en/test-and-evaluate/strengthen-guardrails/increase-consistency.md b/content/en/test-and-evaluate/strengthen-guardrails/increase-consistency.md index 9587c8a244..0c9c3e4b2a 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/increase-consistency.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/increase-consistency.md @@ -14,9 +14,9 @@ description: Make Claude's outputs more consistent by specifying exact formats, Here's how to make Claude's responses more consistent: -## Specify the desired output format +## Specify the output format you want -Precisely define your desired output format using JSON, XML, or custom templates so that Claude follows every output formatting element you require. +Precisely define the output format you want using JSON, XML, or custom templates so that Claude follows every output formatting element you require. ```text User wrap @@ -69,7 +69,7 @@ Precisely define your desired output format using JSON, XML, or custom templates on models that support it, or system prompt instructions, instead.
-Prefill the `Assistant` turn with your desired format. This trick bypasses Claude's friendly preamble and enforces your structure. +Prefill the `Assistant` turn with the format you want. This trick bypasses Claude's friendly preamble and enforces your structure. ```text User wrap @@ -162,7 +162,7 @@ Prefill the `Assistant` turn with your desired format. This trick bypasses Claud ## Constrain with examples -Provide examples of your desired output. This is more effective than abstract instructions. +Provide examples of the output you want. This is more effective than abstract instructions. ```text User wrap diff --git a/content/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks.md b/content/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks.md index 430da8cbf5..c455b16f57 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/mitigate-jailbreaks.md @@ -4,18 +4,18 @@ url: https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails description: Defend your application against jailbreaks and prompt injection with input screening, hardened system prompts, and safe handling of untrusted tool content. --- -Jailbreaking and prompt injection are attempts to make Claude ignore its guidelines or your instructions. While Claude is inherently resilient to such attacks, the additional steps on this page strengthen your guardrails, particularly against uses that violate Anthropic's [Terms of Service](https://www.anthropic.com/legal/commercial-terms) or [Usage Policy](https://www.anthropic.com/legal/aup). +Jailbreaking and prompt injection are attempts to make Claude ignore its guidelines or your instructions. Although Claude is inherently resilient to such attacks, the additional steps on this page strengthen your guardrails, particularly against uses that violate Anthropic's [Terms of Service](https://www.anthropic.com/legal/commercial-terms) or [Usage Policy](https://www.anthropic.com/legal/aup). These attacks fall into two categories with different threat models: * **Jailbreaks and direct prompt injection**, where the *user* of your application is the adversary and crafts inputs intended to bypass your guardrails. -* **Indirect prompt injection**, where the user is trusted but Claude processes *third-party content* (web pages, emails, documents, tool results) that contains adversarial instructions. +* **Indirect prompt injection**, where the user is trusted but Claude processes *third-party content* (webpages, emails, documents, tool results) that contains adversarial instructions. ## Jailbreaks and direct prompt injection In this threat model, a user is deliberately crafting inputs to manipulate your application into producing content or taking actions you don't want it to. These mitigations strengthen your application's guardrails: -* **Harmlessness screens:** Use a lightweight model like Claude Haiku 5.5 to pre-screen user input before it reaches your main conversation. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) to constrain the response to a simple classification. Claude Haiku 5.5 runs [safety classifiers](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) that can decline the screening request itself, so treat a response with `stop_reason: "refusal"` as a harmful verdict. +* **Harmlessness screens:** Use a lightweight model such as Claude Haiku 5.5 to pre-screen user input before it reaches your main conversation. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) to constrain the response to a simple classification. Claude Haiku 5.5 runs [safety classifiers](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback) that can decline the screening request itself, so treat a response with `stop_reason: "refusal"` as a harmful verdict. ```text User wrap @@ -70,7 +70,7 @@ In this threat model, a user is deliberately crafting inputs to manipulate your ## Indirect prompt injection -In this threat model, you're protecting your users from instructions embedded in content that Claude reads on their behalf: the body of an inbound email, a fetched web page, OCR output from an uploaded file, or the result of a tool call. An attacker who can influence that content may embed instructions that try to redirect Claude. +In this threat model, you're protecting your users from instructions embedded in content that Claude reads on their behalf: the body of an inbound email, a fetched webpage, OCR output from an uploaded file, or the result of a tool call. An attacker who can influence that content might embed instructions that try to redirect Claude. Structure your application so that Claude can reliably distinguish untrusted content from your instructions: @@ -111,7 +111,7 @@ Structure your application so that Claude can reliably distinguish untrusted con The email body is a JSON string inside a JSON object. Even though it contains text that looks like an instruction, the encoding makes it unambiguous that this is data, not a directive. -* **Don't put your own instructions in tool results.** Because Claude treats tool-result content as untrusted data, instructions you place there may be ignored or flagged as a potential injection. Send your instructions in a `user` turn that follows the `tool_result` block. On supported models, you can also use a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages). +* **Don't put your own instructions in tool results.** Because Claude treats tool-result content as untrusted data, instructions you place there might be ignored or flagged as a potential injection. Send your instructions in a `user` turn that follows the `tool_result` block. On supported models, you can also use a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages). * **Limit Claude's access to sensitive data and actions.** Apply the principle of least privilege so that a successful injection can do minimal damage: don't give Claude access to secrets it doesn't need, run tools in sandboxed environments, and scope permissions as narrowly as possible. @@ -204,7 +204,7 @@ Combine strategies for robust protection. Here's an enterprise-grade example wit Evaluate if this query violates SEC rules, FINRA guidelines, or client privacy. ``` - Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) to constrain the response to a boolean classification. + Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) to constrain the response to a Boolean classification. By layering these strategies, you create a robust defense against jailbreaking and prompt injections, ensuring your Claude-powered applications maintain the highest standards of safety and compliance. diff --git a/content/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations.md b/content/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations.md index 44df01989a..0acef03e42 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/reduce-hallucinations.md @@ -4,13 +4,13 @@ url: https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails description: Minimize hallucinations in Claude's outputs by allowing uncertainty, grounding responses in direct quotes, and verifying claims with citations. --- -Even the most advanced language models, like Claude, can sometimes generate text that is factually incorrect or inconsistent with the given context. This phenomenon, known as "hallucination," can undermine the reliability of your AI-driven solutions. This guide will explore techniques to minimize hallucinations and ensure Claude's outputs are accurate and trustworthy. +Even the most advanced language models, such as Claude, can sometimes generate text that is factually incorrect or inconsistent with the given context. This phenomenon, known as "hallucination," can undermine the reliability of your AI-driven solutions. This guide explores techniques to minimize hallucinations and ensure Claude's outputs are accurate and trustworthy. ## Basic hallucination minimization strategies -* **Allow Claude to say "I don't know":** Explicitly give Claude permission to admit uncertainty. This simple technique can drastically reduce false information. +* **Allow Claude to say "I don't know":** Explicitly give Claude permission to admit uncertainty. This technique can drastically reduce false information. - + ```text User wrap As our M&A advisor, analyze this report on the potential acquisition of AcmeCo by ExampleCorp. @@ -37,7 +37,7 @@ Even the most advanced language models, like Claude, can sometimes generate text ``` -* **Verify with citations**: Make Claude's response auditable by having it cite quotes and sources for each of its claims. You can also have Claude verify each claim by finding a supporting quote after it generates a response. If it can't find a quote, it must retract the claim. +* **Verify with citations:** Make Claude's response auditable by having it cite quotes and sources for each of its claims. You can also have Claude verify each claim by finding a supporting quote after it generates a response. If it can't find a quote, it must retract the claim. ```text User wrap @@ -54,14 +54,14 @@ Even the most advanced language models, like Claude, can sometimes generate text ## Advanced techniques -* **Chain-of-thought verification**: Use [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) with `display: "summarized"`, and review the summarized reasoning in the `thinking` blocks when an answer looks wrong. This can reveal faulty logic or assumptions. +* **Chain-of-thought verification:** Use [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) with `display: "summarized"`, and review the summarized reasoning in the `thinking` blocks when an answer looks wrong. This can reveal faulty logic or assumptions. -* **Best-of-N verification**: Run Claude through the same prompt multiple times and compare the outputs. Inconsistencies across outputs could indicate hallucinations. +* **Best-of-N verification:** Run Claude through the same prompt multiple times and compare the outputs. Inconsistencies across outputs could indicate hallucinations. -* **Iterative refinement**: Use Claude's outputs as inputs for follow-up prompts, asking it to verify or expand on previous statements. This can catch and correct inconsistencies. +* **Iterative refinement:** Use Claude's outputs as inputs for follow-up prompts, asking it to verify or expand on previous statements. This can catch and correct inconsistencies. -* **External knowledge restriction**: Explicitly instruct Claude to only use information from provided documents and not its general knowledge. +* **External knowledge restriction:** Explicitly instruct Claude to only use information from provided documents and not its general knowledge. - Remember, while these techniques significantly reduce hallucinations, they don't eliminate them entirely. Always validate critical information, especially for high-stakes decisions. + Remember, although these techniques significantly reduce hallucinations, they don't eliminate them entirely. Always validate critical information, especially for high-stakes decisions. diff --git a/content/en/test-and-evaluate/strengthen-guardrails/reduce-latency.md b/content/en/test-and-evaluate/strengthen-guardrails/reduce-latency.md index 460b3192f5..b0580aa58d 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/reduce-latency.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/reduce-latency.md @@ -1,7 +1,7 @@ --- title: Reducing latency url: https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails/reduce-latency -description: Reduce Claude's response latency by choosing a faster model like Claude Haiku 5.5, trimming prompt and output tokens, and streaming responses. +description: Reduce Claude's response latency by choosing a faster model such as Claude Haiku 5.5, trimming prompt and output tokens, and streaming responses. --- Latency refers to the time it takes for the model to process a prompt and generate an output. Latency can be influenced by various factors, such as the size of the model, the complexity of the prompt, and the underlying infrastructure supporting the model and point of interaction. @@ -19,7 +19,7 @@ When discussing latency, you might come across several terms and measurements: * **Baseline latency:** This is the time taken by the model to process the prompt and generate the response, without considering the input and output tokens per second. It provides a general idea of the model's speed. * **Time to first token (TTFT):** This metric measures the time it takes for the model to generate the first token of the response, from when the prompt was sent. It's particularly relevant when you're using streaming (more on that later) and want to provide a responsive experience to your users. -For a more in-depth understanding of these terms, check out the [glossary](https://platform.claude.com/docs/en/about-claude/glossary). +For a more in-depth understanding of these terms, see the [glossary](https://platform.claude.com/docs/en/about-claude/glossary). *** @@ -27,7 +27,7 @@ For a more in-depth understanding of these terms, check out the [glossary](https ### 1. Choose the right model -One of the most direct ways to reduce latency is to select the appropriate model for your use case. Anthropic offers a [range of models](https://platform.claude.com/docs/en/models/overview) with different capabilities and performance characteristics. Consider your specific requirements and choose the model that best fits your needs in terms of speed and output quality. +One of the most direct ways to reduce latency is to choose the appropriate model for your use case. Anthropic offers a [range of models](https://platform.claude.com/docs/en/models/overview) with different capabilities and performance characteristics. Consider your specific requirements and choose the model that best fits your needs in terms of speed and output quality. For speed-critical applications, **Claude Haiku 5.5** offers the fastest response times while maintaining high intelligence. [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) is its main control for speed and cost. See [Use effort to control thinking](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5#use-effort-to-control-thinking). The following example runs it at `low`, the cheapest and fastest level, and leaves room in `max_tokens` for thinking: @@ -102,9 +102,8 @@ For speed-critical applications, **Claude Haiku 5.5** offers the fastest respons MaxTokens = 1024, OutputConfig = new() { Effort = Effort.Low }, Messages = [ - new() + new UserMessageParam { - Role = Role.User, Content = "Summarize this customer feedback in 2 sentences: [feedback text]" } ] @@ -205,8 +204,8 @@ Minimize the number of tokens in both your input prompt and the expected output, Here are some tips to help you optimize your prompts and outputs: -* **Be clear but concise:** Aim to convey your intent clearly and concisely in the prompt. Avoid unnecessary details or redundant information, while keeping in mind that [Claude lacks context](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#be-clear-and-direct) on your use case and might not make the intended leaps of logic if instructions are unclear. -* **Ask for shorter responses:** Ask Claude directly to be concise. If Claude is outputting unwanted length, ask Claude to [curb its chattiness](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#be-clear-and-direct). +* **Be clear but concise:** Aim to convey your intent clearly and concisely in the prompt. Avoid unnecessary details or redundant information, while keeping in mind that [Claude lacks context](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#be-clear-and-direct) on your use case and might not make the intended inferences if instructions are unclear. +* **Ask for shorter responses:** Ask Claude directly to be concise. If Claude is outputting unwanted length, ask Claude to [reduce its verbosity](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#be-clear-and-direct). Because of how LLMs count @@ -222,7 +221,6 @@ Here are some tips to help you optimize your prompts and outputs: tokens, the response will be cut off, perhaps mid-sentence or mid-word, so this is a blunt technique that might require post-processing and is usually most appropriate for multiple choice or short answer responses where the answer comes right at the beginning. -* **Experiment with temperature:** The `temperature` [parameter](https://platform.claude.com/docs/en/api/messages/create) controls the randomness of the output. Lower values (for example, 0.2) can sometimes lead to more focused and shorter responses, while higher values (for example, 0.8) might result in more diverse but potentially longer outputs. Claude 4.7 and later models and Claude Mythos Preview accept only the default `temperature` and return a 400 error for any other value, so on those models lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) instead. Finding the right balance among prompt clarity, output quality, and token count might require some experimentation. diff --git a/content/en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak.md b/content/en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak.md index 00613b2837..4a969ad9ac 100644 --- a/content/en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak.md +++ b/content/en/test-and-evaluate/strengthen-guardrails/reduce-prompt-leak.md @@ -4,16 +4,16 @@ url: https://platform.claude.com/docs/en/test-and-evaluate/strengthen-guardrails description: Reduce the risk of prompt leaks by separating context from user queries, filtering Claude's outputs, and auditing prompts, without degrading task performance. --- -Prompt leaks can expose sensitive information that you expect to be "hidden" in your prompt. While no method is foolproof, the strategies below can significantly reduce the risk. +Prompt leaks can expose sensitive information that you expect to be "hidden" in your prompt. Although no method is foolproof, the following strategies can significantly reduce the risk. ## Before you try to reduce prompt leak -Consider using leak-resistant prompt engineering strategies only when **absolutely necessary**. Attempts to leak-proof your prompt can add complexity that may degrade performance in other parts of the task due to increasing the complexity of the LLM’s overall task. +Consider using leak-resistant prompt engineering strategies only when **absolutely necessary**. Attempts to leak-proof your prompt can make the LLM’s overall task more complex, which might degrade performance in other parts of the task. If you decide to implement leak-resistant techniques, be sure to test your prompts thoroughly to ensure that the added complexity does not negatively impact the model’s performance or the quality of its outputs. - Try monitoring techniques first, like output screening and post-processing, to try to catch instances of prompt leak. + Try monitoring techniques first, such as output screening and post-processing, to try to catch instances of prompt leak. *** @@ -53,7 +53,7 @@ If you decide to implement leak-resistant techniques, be sure to test your promp You can also use a prompted LLM to filter outputs for more nuanced leaks. -* **Avoid unnecessary proprietary details:** If Claude doesn't need it to perform the task, don't include it. Extra content distracts Claude from focusing on "no leak" instructions. -* **Regular audits:** Periodically review your prompts and Claude's outputs for potential leaks. +* **Avoid unnecessary proprietary details:** If Claude doesn't need it to perform the task, don't include it. Extra content reduces Claude's adherence to "no leak" instructions. +* **Audit regularly:** Periodically review your prompts and Claude's outputs for potential leaks. Remember, the goal is not just to prevent leaks but to maintain Claude's performance. Overly complex leak-prevention can degrade results. Balance is key. diff --git a/content/github/anthropic-sdk-python/CHANGELOG.md b/content/github/anthropic-sdk-python/CHANGELOG.md index b873ae52b3..c24a4f72e9 100644 --- a/content/github/anthropic-sdk-python/CHANGELOG.md +++ b/content/github/anthropic-sdk-python/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [2.0.0](https://github.com/anthropics/anthropic-sdk-python/compare/v1.17.0...v2.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add a workspace_id filter and the usage_tier scope type to list spend limits +* **api:** add support for new API version 2026-10-21 + + +### Documentation + +* **api:** remove outdated system role note from messages description + ## [1.17.0](https://github.com/anthropics/anthropic-sdk-python/compare/v1.16.0...v1.17.0) (2026-10-20) ### Features diff --git a/content/github/anthropic-sdk-python/CONTRIBUTING.md b/content/github/anthropic-sdk-python/CONTRIBUTING.md index 6a71b17fe0..2b02eaf4f4 100644 --- a/content/github/anthropic-sdk-python/CONTRIBUTING.md +++ b/content/github/anthropic-sdk-python/CONTRIBUTING.md @@ -148,3 +148,7 @@ You can release to package managers by using [the `Publish PyPI` GitHub action]( If you need to manually release a package, you can run the `bin/publish-pypi` script with a `PYPI_TOKEN` set on the environment. + +## License + +By contributing to this repository, you agree that your contributions are licensed under the Apache License, Version 2.0 (see [LICENSE](LICENSE)). diff --git a/content/github/anthropic-sdk-python/MIGRATION.md b/content/github/anthropic-sdk-python/MIGRATION.md index bd6d1c2c28..db7f2be984 100644 --- a/content/github/anthropic-sdk-python/MIGRATION.md +++ b/content/github/anthropic-sdk-python/MIGRATION.md @@ -1,3 +1,9 @@ +# Migration guide + +To upgrade to version 2 of the SDK, follow the [migration guide](https://platform.claude.com/docs/en/api/migration-2026-10-21#python) in the Claude API docs. + +The rest of this file covers the earlier upgrade from `0.x` to v1. + # Migrating to v1 - [Upgrading](#upgrading) @@ -351,11 +357,10 @@ itself — instead of being sent alongside it, and `omit` removes one the same w from anthropic import Anthropic, omit client = Anthropic(default_headers={"USER-AGENT": "my-app/1.0"}) -client.messages.create(..., extra_headers={"x-api-key": other_key, "X-Stainless-Timeout": omit}) +client.messages.create(..., extra_headers={"X-Stainless-Timeout": omit}) -# Before: sent `User-Agent: Anthropic/Python ...` and `USER-AGENT: my-app/1.0`, both API keys, -# and still sent `x-stainless-timeout` -# After: sends `USER-AGENT: my-app/1.0`, only `x-api-key: `, and no `x-stainless-timeout` header +# Before: sent `User-Agent: Anthropic/Python ...` and `USER-AGENT: my-app/1.0`, and still sent `x-stainless-timeout` +# After: sends `USER-AGENT: my-app/1.0` and no `x-stainless-timeout` header ``` If you relied on two casings of a name producing two header lines, send one comma-joined value instead. diff --git a/content/github/anthropic-sdk-python/README.md b/content/github/anthropic-sdk-python/README.md index 3eb6b7a330..76a47c2358 100644 --- a/content/github/anthropic-sdk-python/README.md +++ b/content/github/anthropic-sdk-python/README.md @@ -86,4 +86,4 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md). ## License -This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. +This project is licensed under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for details. Versions released before the change from the MIT License, and third-party contributions merged before it, remain under the MIT License. See [LICENSE-MIT](LICENSE-MIT). diff --git a/content/github/anthropic-sdk-python/api.md b/content/github/anthropic-sdk-python/api.md index e763932631..f20d53a503 100644 --- a/content/github/anthropic-sdk-python/api.md +++ b/content/github/anthropic-sdk-python/api.md @@ -23,6 +23,7 @@ Types: ```python from anthropic.types import ( + AssistantMessageParam, Base64ImageSourceParam, Base64PDFSource, Base64PDFSourceParam, @@ -265,6 +266,7 @@ from anthropic.types import ( JSONOutputFormatParam, MemoryTool20250818Param, Message, + MessageContentParam, MessageCountTokensToolParam, MessageCreateParamsContainerParam, MessageDeltaUsage, @@ -299,6 +301,7 @@ from anthropic.types import ( SignatureDelta, SkillParams, StopReason, + SystemMessageParam, TextBlock, TextBlockParam, TextCitation, @@ -354,6 +357,7 @@ from anthropic.types import ( URLPDFSourceParam, Usage, UserLocationParam, + UserMessageParam, WebFetchBlock, WebFetchBlockParam, WebFetchTool20250910Param, @@ -962,6 +966,7 @@ from anthropic.types.beta import ( BetaAdvisorToolResultError, BetaAdvisorToolResultErrorParam, BetaAllThinkingTurnsParam, + BetaAssistantMessageParam, BetaBase64ImageSourceParam, BetaBase64PDFSource, BetaBase64PDFSourceParam, @@ -1311,6 +1316,7 @@ from anthropic.types.beta import ( BetaMemoryTool20250818StrReplaceCommand, BetaMemoryTool20250818ViewCommand, BetaMessage, + BetaMessageContentParam, BetaMessageDeltaUsage, BetaMessageIterationUsage, BetaMessageParam, @@ -1357,6 +1363,7 @@ from anthropic.types.beta import ( BetaSkillParams, BetaStopReason, BetaSystemMessageOutputConfigParam, + BetaSystemMessageParam, BetaTextBlock, BetaTextBlockParam, BetaTextCitation, @@ -1440,6 +1447,7 @@ from anthropic.types.beta import ( BetaUsage, BetaUserLocation, BetaUserLocationParam, + BetaUserMessageParam, BetaWebFetchBlock, BetaWebFetchBlockParam, BetaWebFetchTool20250910, diff --git a/content/github/anthropic-sdk-typescript/CHANGELOG.md b/content/github/anthropic-sdk-typescript/CHANGELOG.md index 9cc87ef524..e08505e915 100644 --- a/content/github/anthropic-sdk-typescript/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.137.0...sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add a workspace_id filter and the usage_tier scope type to list spend limits +* **api:** add support for new API version 2026-10-21 + + +### Chores + +* **ci:** check the changelog of each package a pull request changes +* **internal:** specify which changelog a pull request updates + + +### Documentation + +* **api:** remove outdated system role note from messages description + ## [0.137.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/sdk-v0.136.0...sdk-v0.137.0) (2026-10-20) ### Features diff --git a/content/github/anthropic-sdk-typescript/CLAUDE.md b/content/github/anthropic-sdk-typescript/CLAUDE.md index a553e2f565..20aa6f8d2b 100644 --- a/content/github/anthropic-sdk-typescript/CLAUDE.md +++ b/content/github/anthropic-sdk-typescript/CLAUDE.md @@ -40,6 +40,7 @@ The generator writes the rest of this file. Rules about this repository's hand-w - Helpers that make requests accept `requestOptions`, and tag their requests with `helperHeader(...)` from `src/internal/stainless-helper-header.ts`. Those tag values are shared with the other SDKs. - A method for a beta API appends that API's beta value to the caller's `betas` and sends the list as `anthropic-beta`. `options.headers` is merged last, so an explicit header from the caller wins. A helper that needs a beta adds it the same way, as `parse` does with `structured-outputs-2025-12-15`. It doesn't ask the caller to add it. - A platform client keeps its own state in private fields, and carries that state into copies through its `withOptions` override. A resource the platform doesn't serve is a getter that throws an explanatory error. +- A platform client rejects a first-party credential option it doesn't authenticate with. Its constructor starts with `rejectUnsupportedCredentials` from `src/internal/utils/values.ts`, and names the ones it accepts, so a new one is rejected until the client opts in. That covers `withOptions` too, because the base `withOptions` runs the constructor again. `AnthropicAws` takes an `authToken`, which the environment helpers pass, and signs instead of sending it. `apiKey: null` never reads the platform's key variable. - Hand-written unions that shadow generated ones, such as `BetaClientRunnableToolType`, have to be updated when a tool version ships. - Matching the other SDKs also covers `x-stainless-helper` values and model-visible strings. - Say in `src/_vendor//README.md` where vendored code came from and what changed locally. @@ -47,7 +48,7 @@ The generator writes the rest of this file. Rules about this repository's hand-w ### Errors - Credentials, a workspace ID, or a project that can't be resolved from the options and the environment throw `AnthropicError`, and a failed token exchange throws `WorkloadIdentityError`. -- The client rejects `profile` together with `credentials` or `config` with a `TypeError`. +- The client rejects more than one of `apiKey`, `authToken`, `credentials`, `config`, and `profile` with a `TypeError`. - The fix that error text names can be the beta string or the replacement option. - Throw a typed error for content the SDK can't convert, so the caller can catch it (`UnsupportedMCPValueError`). Don't quietly turn it into text. - In middleware, log through `ctx.logger`. A deprecation message starts with `Anthropic:`. @@ -141,6 +142,7 @@ These rules don't depend on the language. The SDKs for this API in other languag - Commit subjects and PR titles follow Conventional Commits (`feat(scope):`, `fix(scope):`, `chore`, `docs`). A `!` or a `BREAKING CHANGE:` footer marks the release as breaking (a major version, or a minor one below 1.0). Only a maintainer adds one. - If `.github/workflows/changelog.yml` exists, every PR adds its own line to `CHANGELOG.md` or carries the `skip-changelog` label, and CI fails it otherwise. A draft needs no line, so add it when you mark the PR ready. If the file doesn't exist, release automation writes `CHANGELOG.md` and the version files from those commit subjects, and a manual edit is overwritten or conflicts with the release PR. - Either way, release automation writes the version, so don't edit it by hand. +- Where PRs add the lines and `.release-please-manifest.json` lists several packages, each package has its own `CHANGELOG.md`, and a PR's line goes in the changelog of every package it changes. A release leaves out a package whose changelog has no section for a version higher than the one the manifest lists for it, so a change merged with `skip-changelog` ships only once another change has added a line for that package. - Where release automation writes `CHANGELOG.md`, `release-please-config.json` lists the commit types. `test` and `ci` are hidden, and a subject with no type doesn't reach the changelog. - A change users will notice gets a changelog note, even when it fixes a bug, so don't give it a hidden commit type. Rejecting input that used to be accepted is one such change, and so is a different error type. - Make one logical change per PR. Unrelated fixes, formatting churn, and incidental lockfile changes go elsewhere. Split a large feature into stacked PRs. diff --git a/content/github/anthropic-sdk-typescript/CONTRIBUTING.md b/content/github/anthropic-sdk-typescript/CONTRIBUTING.md index 44945b344b..24b834dd8a 100644 --- a/content/github/anthropic-sdk-typescript/CONTRIBUTING.md +++ b/content/github/anthropic-sdk-typescript/CONTRIBUTING.md @@ -111,3 +111,7 @@ You can release to package managers by manually running [the `Create releases` G If you need to manually release a package, you can run the `bin/publish-npm` script with an `NPM_TOKEN` set on the environment. + +## License + +By contributing to this repository, you agree that your contributions are licensed under the Apache License, Version 2.0 (see [LICENSE](LICENSE)). diff --git a/content/github/anthropic-sdk-typescript/MIGRATION.md b/content/github/anthropic-sdk-typescript/MIGRATION.md index 3b2ce807ad..47f1903331 100644 --- a/content/github/anthropic-sdk-typescript/MIGRATION.md +++ b/content/github/anthropic-sdk-typescript/MIGRATION.md @@ -1,457 +1,3 @@ # Migration guide -This guide outlines the changes and steps needed to migrate your codebase to the latest version of the Anthropic TypeScript SDK. - -The main changes are that the SDK now relies on the [builtin Web fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) instead of `node-fetch` and has zero dependencies. - -## Migration CLI - -Most programs will only need minimal changes, but to assist there is a migration tool that will automatically update your code for the new version. -To use it, upgrade the `@anthropic-ai/sdk` package, then run `./node_modules/.bin/anthropic-ai-sdk migrate ./your/src/folders` to update your code. -To preview the changes without writing them to disk, run the tool with `--dry`. - -## Environment requirements - -The minimum supported runtime and tooling versions are now: - -- Node.js 20 LTS (Most recent non-EOL Node version) -- TypeScript 5.0 -- Jest 28 - -## Breaking changes - -### Web types for `withResponse`, `asResponse`, and `APIError.headers` - -Because we now use the builtin Web fetch API on all platforms, if you wrote code that used `withResponse` or `asResponse` and then accessed `node-fetch`-specific properties on the result, you will need to switch to standardized alternatives. -For example, `body` is now a [Web `ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) rather than a [node `Readable`](https://nodejs.org/api/stream.html#readable-streams). - -```ts -// Before: -const res = await client.example.retrieve('string/with/slash').asResponse(); -res.body.pipe(process.stdout); - -// After: -import { Readable } from 'node:stream'; -const res = await client.example.retrieve('string/with/slash').asResponse(); -Readable.fromWeb(res.body).pipe(process.stdout); -``` - -Additionally, the `headers` property on `APIError` objects is now an instance of the Web [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) class. It was previously defined as `Record`. - -### Named path parameters - -Methods that take multiple path parameters typically now use named instead of positional arguments for better clarity and to prevent a footgun where it was easy to accidentally pass arguments in the incorrect order. - -For example, for a method that would call an endpoint at `/v1/parents/{parent_id}/children/{child_id}`, only the _last_ path parameter is positional and the rest must be passed as named arguments. - -```ts -// Before -client.parents.children.retrieve('p_123', 'c_456'); - -// After -client.parents.children.retrieve('c_456', { parent_id: 'p_123' }); -``` - -
- -This affects the following methods - -- `client.beta.environments.work.retrieve()` -- `client.beta.environments.work.update()` -- `client.beta.environments.work.ack()` -- `client.beta.environments.work.heartbeat()` -- `client.beta.environments.work.stop()` -- `client.beta.sessions.resources.retrieve()` -- `client.beta.sessions.resources.update()` -- `client.beta.sessions.resources.delete()` -- `client.beta.sessions.threads.retrieve()` -- `client.beta.sessions.threads.archive()` -- `client.beta.sessions.threads.events.list()` -- `client.beta.sessions.threads.events.stream()` -- `client.beta.vaults.credentials.retrieve()` -- `client.beta.vaults.credentials.update()` -- `client.beta.vaults.credentials.delete()` -- `client.beta.vaults.credentials.archive()` -- `client.beta.vaults.credentials.mcpOAuthValidate()` -- `client.beta.memoryStores.memories.retrieve()` -- `client.beta.memoryStores.memories.update()` -- `client.beta.memoryStores.memories.delete()` -- `client.beta.memoryStores.memoryVersions.retrieve()` -- `client.beta.memoryStores.memoryVersions.redact()` -- `client.beta.skills.versions.retrieve()` -- `client.beta.skills.versions.delete()` -- `client.beta.skills.versions.download()` -- `client.beta.tunnels.certificates.retrieve()` -- `client.beta.tunnels.certificates.archive()` - -
- -### URI encoded path parameters - -Path params are now properly encoded by default. If you were manually encoding path parameters before giving them to the SDK, you must now stop doing that and pass the -param without any encoding applied. - -For example: - -```diff -- client.example.retrieve(encodeURIComponent('string/with/slash')) -+ client.example.retrieve('string/with/slash') // retrieves /example/string%2Fwith%2Fslash -``` - -Previously without the `encodeURIComponent()` call we would have used the path `/example/string/with/slash`; now we'll use `/example/string%2Fwith%2Fslash`. - -### Removed request options overloads - -When making requests with no required body, query or header parameters, you must now explicitly pass `null`, `undefined` or an empty object `{}` to the params argument in order to customise request options. - -```diff -client.example.list(); -client.example.list({}, { headers: { ... } }); -client.example.list(null, { headers: { ... } }); -client.example.list(undefined, { headers: { ... } }); -- client.example.list({ headers: { ... } }); -+ client.example.list({}, { headers: { ... } }); -``` - -
- -This affects the following methods - -- `client.messages.batches.list()` -- `client.models.retrieve()` -- `client.models.list()` -- `client.beta.models.retrieve()` -- `client.beta.models.list()` -- `client.beta.messages.batches.retrieve()` -- `client.beta.messages.batches.list()` -- `client.beta.messages.batches.delete()` -- `client.beta.messages.batches.cancel()` -- `client.beta.messages.batches.results()` -- `client.beta.agents.retrieve()` -- `client.beta.agents.list()` -- `client.beta.agents.archive()` -- `client.beta.agents.versions.list()` -- `client.beta.environments.retrieve()` -- `client.beta.environments.list()` -- `client.beta.environments.delete()` -- `client.beta.environments.archive()` -- `client.beta.environments.work.list()` -- `client.beta.environments.work.poll()` -- `client.beta.environments.work.stats()` -- `client.beta.sessions.retrieve()` -- `client.beta.sessions.list()` -- `client.beta.sessions.delete()` -- `client.beta.sessions.archive()` -- `client.beta.sessions.events.list()` -- `client.beta.sessions.events.stream()` -- `client.beta.sessions.resources.list()` -- `client.beta.sessions.threads.list()` -- `client.beta.deployments.retrieve()` -- `client.beta.deployments.list()` -- `client.beta.deployments.archive()` -- `client.beta.deployments.pause()` -- `client.beta.deployments.run()` -- `client.beta.deployments.unpause()` -- `client.beta.deploymentRuns.retrieve()` -- `client.beta.deploymentRuns.list()` -- `client.beta.vaults.retrieve()` -- `client.beta.vaults.list()` -- `client.beta.vaults.delete()` -- `client.beta.vaults.archive()` -- `client.beta.vaults.credentials.list()` -- `client.beta.memoryStores.retrieve()` -- `client.beta.memoryStores.list()` -- `client.beta.memoryStores.delete()` -- `client.beta.memoryStores.archive()` -- `client.beta.memoryStores.memories.list()` -- `client.beta.memoryStores.memoryVersions.list()` -- `client.beta.files.list()` -- `client.beta.files.delete()` -- `client.beta.files.download()` -- `client.beta.files.retrieveMetadata()` -- `client.beta.skills.retrieve()` -- `client.beta.skills.list()` -- `client.beta.skills.delete()` -- `client.beta.skills.versions.list()` -- `client.beta.userProfiles.retrieve()` -- `client.beta.userProfiles.list()` -- `client.beta.userProfiles.createEnrollmentURL()` -- `client.beta.dreams.retrieve()` -- `client.beta.dreams.list()` -- `client.beta.dreams.archive()` -- `client.beta.dreams.cancel()` -- `client.beta.tunnels.retrieve()` -- `client.beta.tunnels.list()` -- `client.beta.tunnels.archive()` -- `client.beta.tunnels.revealToken()` -- `client.beta.tunnels.certificates.list()` - -
- -### Removed `httpAgent` in favor of `fetchOptions` - -The `httpAgent` client option has been removed in favor of a [platform-specific `fetchOptions` property](https://github.com/anthropics/anthropic-sdk-typescript#fetch-options). -This change was made as `httpAgent` relied on `node:http` agents which are not supported by any runtime's builtin fetch implementation. - -If you were using `httpAgent` for proxy support, check out the [new proxy documentation](https://github.com/anthropics/anthropic-sdk-typescript#configuring-proxies). - -Before: - -```ts -import Anthropic from '@anthropic-ai/sdk'; -import http from 'http'; -import { HttpsProxyAgent } from 'https-proxy-agent'; - -// Configure the default for all requests: -const client = new Anthropic({ - httpAgent: new HttpsProxyAgent(process.env.PROXY_URL), -}); -``` - -After: - -```ts -import Anthropic from '@anthropic-ai/sdk'; -import * as undici from 'undici'; - -const proxyAgent = new undici.ProxyAgent(process.env.PROXY_URL); -const client = new Anthropic({ - fetchOptions: { - dispatcher: proxyAgent, - }, -}); -``` - -### Changed exports - -#### Refactor of `@anthropic-ai/sdk/core`, `error`, `pagination`, `resource`, `streaming` and `uploads` - -Much of the `@anthropic-ai/sdk/core` file was intended to be internal-only but it was publicly accessible, as such it has been refactored and split up into internal and public files, with public-facing code moved to a new `core` folder and internal code moving to the private `internal` folder. - -At the same time, we moved some public-facing files which were previously at the top level into `core` to make the file structure cleaner and more clear: - -```typescript -// Before -import '@anthropic-ai/sdk/error'; -import '@anthropic-ai/sdk/pagination'; -import '@anthropic-ai/sdk/resource'; -import '@anthropic-ai/sdk/streaming'; -import '@anthropic-ai/sdk/uploads'; - -// After -import '@anthropic-ai/sdk/core/error'; -import '@anthropic-ai/sdk/core/pagination'; -import '@anthropic-ai/sdk/core/resource'; -import '@anthropic-ai/sdk/core/streaming'; -import '@anthropic-ai/sdk/core/uploads'; -``` - -If you were relying on anything that was only exported from `@anthropic-ai/sdk/core` and is also not accessible anywhere else, please open an issue and we'll consider adding it to the public API. - -#### Resource classes - -Previously under certain circumstances it was possible to import resource classes like `Completions` directly from the root of the package. This was never valid at the type level and only worked in CommonJS files. -Now you must always either reference them as static class properties or import them directly from the files in which they are defined. - -```typescript -// Before -const { Completions } = require('@anthropic-ai/sdk'); - -// After -const { Anthropic } = require('@anthropic-ai/sdk'); -Anthropic.Completions; // or import directly from @anthropic-ai/sdk/resources/completions -``` - -#### Cleaned up `uploads` exports - -As part of the `core` refactor, `@anthropic-ai/sdk/uploads` was moved to `@anthropic-ai/sdk/core/uploads` -and the following exports were removed, as they were not intended to be a part of the public API: - -- `fileFromPath` -- `BlobPart` -- `BlobLike` -- `FileLike` -- `ResponseLike` -- `isResponseLike` -- `isBlobLike` -- `isFileLike` -- `isUploadable` -- `isMultipartBody` -- `maybeMultipartFormRequestOptions` -- `multipartFormRequestOptions` -- `createForm` - -Note that `Uploadable` & `toFile` **are** still exported: - -```typescript -import { type Uploadable, toFile } from '@anthropic-ai/sdk/core/uploads'; -``` - -#### `APIClient` - -The `APIClient` base client class has been replaced with a new `BaseAnthropic` class: - -```typescript -// Before -import { APIClient } from '@anthropic-ai/sdk/core'; - -// After -import { BaseAnthropic } from '@anthropic-ai/sdk/client'; -``` - -### File handling - -The deprecated `fileFromPath` helper has been removed in favor of native Node.js streams: - -```ts -// Before -Anthropic.fileFromPath('path/to/file'); - -// After -import fs from 'fs'; -fs.createReadStream('path/to/file'); -``` - -Note that this function previously only worked on Node.js. If you're using Bun, you can use [`Bun.file`](https://bun.sh/docs/api/file-io) instead. - -### Shims removal - -Previously you could configure the types that the SDK used like this: - -```ts -// Tell TypeScript and the package to use the global Web fetch instead of node-fetch. -import '@anthropic-ai/sdk/shims/web'; -import Anthropic from '@anthropic-ai/sdk'; -``` - -The `@anthropic-ai/sdk/shims` imports have been removed. Your global types must now be [correctly configured](#minimum-types-requirements). - -### Pagination changes - -The `for await` syntax **is not affected**. This still works as-is: - -```ts -// Automatically fetches more pages as needed. -for await (const betaMessageBatch of client.beta.messages.batches.list()) { - console.log(betaMessageBatch); -} -``` - -The interface for manually paginating through list results has been simplified: - -```ts -// Before -page.nextPageParams(); -page.nextPageInfo(); -// Required manually handling { url } | { params } type - -// After -page.nextPageRequestOptions(); -``` - -#### Removed unnecessary classes - -Page classes for individual methods are now type aliases: - -```ts -// Before -export class BetaMessageBatchesPage extends Page {} - -// After -export type BetaMessageBatchesPage = Page; -``` - -If you were importing these classes at runtime, you'll need to switch to importing the base class or only import them at the type-level. - -### `@anthropic-ai/sdk/src` directory removed - -Previously IDEs may have auto-completed imports from the `@anthropic-ai/sdk/src` directory, however this -directory was only included for an improved go-to-definition experience and should not have been used at runtime. - -If you have any `@anthropic-ai/sdk/src/*` imports, you will need to replace them with `@anthropic-ai/sdk/*`. - -```ts -// Before -import Anthropic from '@anthropic-ai/sdk/src'; - -// After -import Anthropic from '@anthropic-ai/sdk'; -``` - -## TypeScript troubleshooting - -When referencing the library after updating, you may encounter new type errors related to JS features like private properties or fetch classes like Request, Response, and Headers. -To resolve these issues, configure your tsconfig.json and install the appropriate `@types` packages for your runtime environment using the guidelines below: - -### Browsers - -`tsconfig.json` - -```jsonc -{ - "target": "ES2018", // note: we recommend ES2020 or higher - "lib": ["DOM", "DOM.Iterable", "ES2018"] -} -``` - -### Node.js - -`tsconfig.json` - -```jsonc -{ - "target": "ES2018" // note: we recommend ES2020 or higher -} -``` - -`package.json` - -```json -{ - "devDependencies": { - "@types/node": ">= 20" - } -} -``` - -### Cloudflare Workers - -`tsconfig.json` - -```jsonc -{ - "target": "ES2018", // note: we recommend ES2020 or higher - "lib": ["ES2020"], // <- needed by @cloudflare/workers-types - "types": ["@cloudflare/workers-types"] -} -``` - -`package.json` - -```json -{ - "devDependencies": { - "@cloudflare/workers-types": ">= 0.20221111.0" - } -} -``` - -### Bun - -`tsconfig.json` - -```jsonc -{ - "target": "ES2018" // note: we recommend ES2020 or higher -} -``` - -`package.json` - -```json -{ - "devDependencies": { - "@types/bun": ">= 1.2.0" - } -} -``` +To upgrade to version 1 of the SDK, follow the [migration guide](https://platform.claude.com/docs/en/api/migration-2026-10-21#typescript) in the Claude API docs. diff --git a/content/github/anthropic-sdk-typescript/README.md b/content/github/anthropic-sdk-typescript/README.md index 5b291ac510..f37e0d1160 100644 --- a/content/github/anthropic-sdk-typescript/README.md +++ b/content/github/anthropic-sdk-typescript/README.md @@ -94,4 +94,4 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md). ## License -This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. +This project is licensed under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for details. Versions released before the change from the MIT License, and third-party contributions merged before it, remain under the MIT License. See [LICENSE-MIT](LICENSE-MIT). diff --git a/content/github/anthropic-sdk-typescript/api.md b/content/github/anthropic-sdk-typescript/api.md index e9ff65e6a0..e589938700 100644 --- a/content/github/anthropic-sdk-typescript/api.md +++ b/content/github/anthropic-sdk-typescript/api.md @@ -21,6 +21,7 @@ Types: Types: +- AssistantMessageParam - Base64ImageSource - Base64PDFSource - BashCodeExecutionOutputBlock @@ -264,6 +265,7 @@ Types: - JSONOutputFormat - MemoryTool20250818 - Message +- MessageContentParam - MessageCountTokensTool - MessageCreateParamsContainer - MessageDeltaEvent @@ -295,6 +297,7 @@ Types: - SignatureDelta - SkillParams - StopReason +- SystemMessageParam - TextBlock - TextBlockParam - TextCitation @@ -350,6 +353,7 @@ Types: - URLPDFSource - Usage - UserLocation +- UserMessageParam - WebFetchBlock - WebFetchBlockParam - WebFetchTool20250910 @@ -878,6 +882,7 @@ Types: - BetaAdvisorToolResultError - BetaAdvisorToolResultErrorParam - BetaAllThinkingTurns +- BetaAssistantMessageParam - BetaBase64ImageSource - BetaBase64PDFSource - BetaBashCodeExecutionOutputBlock @@ -1164,6 +1169,7 @@ Types: - BetaMemoryTool20250818StrReplaceCommand - BetaMemoryTool20250818ViewCommand - BetaMessage +- BetaMessageContentParam - BetaMessageDeltaUsage - BetaMessageIterationUsage - BetaMessageParam @@ -1208,6 +1214,7 @@ Types: - BetaStopReason - BetaSummarizeCompaction - BetaSystemMessageOutputConfig +- BetaSystemMessageParam - BetaTextBlock - BetaTextBlockParam - BetaTextCitation @@ -1279,6 +1286,7 @@ Types: - BetaURLPDFSource - BetaUsage - BetaUserLocation +- BetaUserMessageParam - BetaWebFetchBlock - BetaWebFetchBlockParam - BetaWebFetchTool20250910 diff --git a/content/github/anthropic-sdk-typescript/helpers.md b/content/github/anthropic-sdk-typescript/helpers.md index 3f21e59ffb..794912f44d 100644 --- a/content/github/anthropic-sdk-typescript/helpers.md +++ b/content/github/anthropic-sdk-typescript/helpers.md @@ -797,6 +797,7 @@ import { const environmentKey = process.env.ANTHROPIC_ENVIRONMENT_KEY!; // The environment key authenticates the per-session calls too — scope a client to it. +// It replaces the client's own credential on the copy. const sessionClient = client.withOptions({ authToken: environmentKey }); for await (const work of client.beta.environments.work.poller({ diff --git a/content/github/anthropic-sdk-typescript/packages/aws-sdk/CHANGELOG.md b/content/github/anthropic-sdk-typescript/packages/aws-sdk/CHANGELOG.md index 8b78a9c60a..9c26e94597 100644 --- a/content/github/anthropic-sdk-typescript/packages/aws-sdk/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/packages/aws-sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/aws-sdk-v0.9.0...aws-sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add support for new API version 2026-10-21 + ## [0.9.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/aws-sdk-v0.8.0...aws-sdk-v0.9.0) (2026-10-20) ### Features diff --git a/content/github/anthropic-sdk-typescript/packages/bedrock-sdk/CHANGELOG.md b/content/github/anthropic-sdk-typescript/packages/bedrock-sdk/CHANGELOG.md index c847d4e008..03cdaf5943 100644 --- a/content/github/anthropic-sdk-typescript/packages/bedrock-sdk/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/packages/bedrock-sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/bedrock-sdk-v0.36.0...bedrock-sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add support for new API version 2026-10-21 + ## [0.36.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/bedrock-sdk-v0.35.0...bedrock-sdk-v0.36.0) (2026-10-20) ### Features diff --git a/content/github/anthropic-sdk-typescript/packages/foundry-sdk/CHANGELOG.md b/content/github/anthropic-sdk-typescript/packages/foundry-sdk/CHANGELOG.md index 407e0e5285..5b51acfc6c 100644 --- a/content/github/anthropic-sdk-typescript/packages/foundry-sdk/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/packages/foundry-sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/foundry-sdk-v0.6.0...foundry-sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add support for new API version 2026-10-21 + ## [0.6.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/foundry-sdk-v0.5.4...foundry-sdk-v0.6.0) (2026-10-14) ### Features diff --git a/content/github/anthropic-sdk-typescript/packages/google-cloud-sdk/CHANGELOG.md b/content/github/anthropic-sdk-typescript/packages/google-cloud-sdk/CHANGELOG.md index d96c160b74..2a111e08dd 100644 --- a/content/github/anthropic-sdk-typescript/packages/google-cloud-sdk/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/packages/google-cloud-sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/google-cloud-sdk-v0.2.0...google-cloud-sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add support for new API version 2026-10-21 + ## [0.2.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/google-cloud-sdk-v0.1.0...google-cloud-sdk-v0.2.0) (2026-10-20) ### Features diff --git a/content/github/anthropic-sdk-typescript/packages/vertex-sdk/CHANGELOG.md b/content/github/anthropic-sdk-typescript/packages/vertex-sdk/CHANGELOG.md index 194ebc5793..21d5d248a5 100644 --- a/content/github/anthropic-sdk-typescript/packages/vertex-sdk/CHANGELOG.md +++ b/content/github/anthropic-sdk-typescript/packages/vertex-sdk/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [1.0.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/vertex-sdk-v0.22.0...vertex-sdk-v1.0.0) (2026-10-21) + +### ⚠ BREAKING CHANGES + +* **api:** add support for new API version 2026-10-21 + +### Features + +* **api:** add support for new API version 2026-10-21 + ## [0.22.0](https://github.com/anthropics/anthropic-sdk-typescript/compare/vertex-sdk-v0.21.0...vertex-sdk-v0.22.0) (2026-10-20) ### Features diff --git a/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md b/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md index 6bfbd9a6fc..a5f1b25562 100644 --- a/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md +++ b/content/support/10310342-how-do-i-log-out-of-all-active-sessions.md @@ -38,7 +38,7 @@ To regain access to your account on any device, you'll need to authenticate agai If you used your Claude account to authenticate into Claude Code, you can manage your authorization tokens by navigating to **[Settings > Claude Code](https://claude.ai/settings/claude-code)**. To remove a token and log out of Claude Code, click the trash can icon. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1608263923/b4fa7d6f6f08f2adffb4ea63bc58/image+%287%29.png?expires=1792599300&signature=2435f1befa5c7ecdde59b97a96bcdd610ee284876ff24bf3f9559dd817b690ce&req=dSYnHst4nohdWvMW1HO4zVuHix743264AQofdwM8qVezSWmIQuKlXTcoHtmb%0AeitOOTQlARejiPFAhLk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1608263923/b4fa7d6f6f08f2adffb4ea63bc58/image+%287%29.png?expires=1792613700&signature=5cd73159f83c075910a773233f2711262e7501b0bf7c2f8dc3e0b27725f26c9f&req=dSYnHst4nohdWvMW1HO4zVuHix7712S8AQofdwM8qVepvKQMBA3rS%2Bc48%2BVT%0AX7VQ0bQe86PaZzUA9AQ%3D%0A) ## Unable to access your account? diff --git a/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md b/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md index 61c61d6b13..5a0deaa10a 100644 --- a/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md +++ b/content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md @@ -6,6 +6,6 @@ As a Primary Owner or Owner of a Team or Enterprise plan, you can manage the abi 2. Use the toggle to change the **Rate chats** setting for your organization: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2058292603/75752add0bed6a9f3ab217f01708/CleanShot%2B2026-02-12%2Bat%2B08_55_14-402x.png?expires=1792599300&signature=6f7d1b24d92a41cffd1d29370733f98ff1fbb31b90239daa362fa30ea2435368&req=diAiHst3n4dfWvMW1HO4zYGm8yUZGaHP085gFtEpvcSLD9dfEN%2BIOeKJRt%2BO%0AXtSW5UZ%2BFKB1sbUQRow%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2058292603/75752add0bed6a9f3ab217f01708/CleanShot%2B2026-02-12%2Bat%2B08_55_14-402x.png?expires=1792613700&signature=7090f91229857591eabbdc37f40f79dee35de64c1c34988348d6278bded6b02a&req=diAiHst3n4dfWvMW1HO4zYGm8yUaEavL085gFtEpvcQq7kLozGfZyV%2FnXDZu%0AhBRyjOsSrEyfb0GY804%3D%0A) More information on how Anthropic collects, uses, and stores feedback data can be found in our Privacy Center: **[How long do you store my organization’s data?](https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data)** \ No newline at end of file diff --git a/content/support/10593882-share-and-unshare-chats.md b/content/support/10593882-share-and-unshare-chats.md index beaf98fe1e..0fef88ad25 100644 --- a/content/support/10593882-share-and-unshare-chats.md +++ b/content/support/10593882-share-and-unshare-chats.md @@ -38,12 +38,12 @@ To unshare a chat: Users on free, Pro, or Max plans can review a log of shared chats by navigating to **[Settings > Privacy](https://claude.ai/settings/data-privacy-controls)**. Find the **Privacy settings** section and click “Manage” next to **Shared chats:** -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1921669913/7cc7be48cfc7a18f9f469d6cd83c/CleanShot+2026-01-08+at+10_20_43%402x.png?expires=1792599300&signature=800649dbea2b883c3d07ae34b29b0ea707836806d4eebd6f7ffa81384bda213c&req=dSklF894lIheWvMW1HO4zWn5HjEYa0xoc9cNIYuX0GEvqOPC1IqJgywn872F%0AhK0uk%2FiRQKmW4fQZVm8%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1921669913/7cc7be48cfc7a18f9f469d6cd83c/CleanShot+2026-01-08+at+10_20_43%402x.png?expires=1792613700&signature=0b2897c0d8605bad10c55c30bb726c14e4f59c92232f699632179f2a6bce66e1&req=dSklF894lIheWvMW1HO4zWn5HjEbY0Zsc9cNIYuX0GFSRbatG6mxhu0Hzs%2FO%0AgTtTLzI%2Fx3PvxAppE9c%3D%0A) This will open a **Shared chats** modal listing the title, date shared, and link to each chat, allowing you to easily review and access all your previously-shared content. From here, you also have the option to click “Unshare” next to each listed chat to revoke access to the last snapshot you shared: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1624243810/e6fe1d262597446c7fe21dff9f10/AD_4nXdW-GhByF8uKV7fCq9lTbkVB91FglSL6TSyXAOUk_MLcTV9YsEMBMkm9rgm1oXqv0k3sJh1JhlzZP6tHVkKbDJJ71pDRRtM3aVNG64MDuKDIzgmknh-XDZdNa7biTsTdwGoPr5GRg?expires=1792599300&signature=f8f945676d65f55a5f49d99dd8cf3fdeb68d25165b068301cbfb33e3bac29d08&req=dSYlEst6noleWfMW1HO4ze44eSVknRs9guvTv9woD7ZL5ylO6O88eCCzHnQC%0Ai7bPyTEokvn0HkeHleQ%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1624243810/e6fe1d262597446c7fe21dff9f10/AD_4nXdW-GhByF8uKV7fCq9lTbkVB91FglSL6TSyXAOUk_MLcTV9YsEMBMkm9rgm1oXqv0k3sJh1JhlzZP6tHVkKbDJJ71pDRRtM3aVNG64MDuKDIzgmknh-XDZdNa7biTsTdwGoPr5GRg?expires=1792613700&signature=8584b85944eb8894c2a2c744ae2402d3b7b4d65b5c516801f5a0a55082de58fa&req=dSYlEst6noleWfMW1HO4ze44eSVnlRE5guvTv9woD7YPI8Zec3qsxWOq%2FW%2Fn%0AXXQv47QHfyCnzbok%2F%2FE%3D%0A) If you don’t have any shared chat snapshots, the **Shared chats** modal will show “No shared content found”: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1624243808/b025db8e598f0c88fb16d83d48d5/AD_4nXeUwCKnmFzzrjMHhfr5By4zk5pJlkEn3wbJ8-aNfu13Yl99IjBywpqPx9G07QRzpH1EwRY7uG7Q9m9fib98Gql1cIV7XwUCTzEgBNu79Ey8tCOS5CEVmwveIcEOxJ4fonBhe3g9MA?expires=1792599300&signature=5c97c54cb95c61c4fd04555e0b33d2964283002757a1be6d34dc80d72954fe7f&req=dSYlEst6nolfUfMW1HO4zdaFnMdxiICyDeZsm0Gz1Ht4ChPRQNGsxjOHceum%0A4asD7roiqxD93xw3OPg%3D%0A) \ No newline at end of file +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1624243808/b025db8e598f0c88fb16d83d48d5/AD_4nXeUwCKnmFzzrjMHhfr5By4zk5pJlkEn3wbJ8-aNfu13Yl99IjBywpqPx9G07QRzpH1EwRY7uG7Q9m9fib98Gql1cIV7XwUCTzEgBNu79Ey8tCOS5CEVmwveIcEOxJ4fonBhe3g9MA?expires=1792613700&signature=61c9fdb1a16a00fe60b81f61f006a39f0f0df2106e102f073bc2bcce8e68196b&req=dSYlEst6nolfUfMW1HO4zdaFnMdygIq2DeZsm0Gz1HvCgPEvXj4U9u%2FDSo6w%0A1qkh2wTAQ3HtKp73XoY%3D%0A) \ No newline at end of file diff --git a/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md b/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md index 39dd0c82d0..29931f718c 100644 --- a/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md +++ b/content/support/10949351-getting-started-with-local-mcp-servers-on-claude-desktop.md @@ -48,7 +48,7 @@ for specific instructions. Custom desktop extensions uploads allow Team and Enterprise plans to leverage organization-specific workflows that aren’t available in the public directory. After creating a custom desktop extension, Owners and Primary Owners can navigate to Settings > Extensions within Claude Desktop and click “Advanced settings” to access the **Extension Developer** section: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1681607607/ba6e379d2769d190f0970a0adaed/AD_4nXd4aZkqjJFpiXMPF28Pih7HmSJ9pPsnoWAfVgiLdFRFiTkO92YtXteIjvDHaPl7T0tjfpRTBOlyrMbQ_aciCNDgfIuEvV3szmKvt72x5O51DMSClXOYWk1JIRIzylwkj3joXqZcLw?expires=1792599300&signature=7d44102348f110ab1909ebc4411c356bdaa59de7e35e9a0a33033ed90f81fd35&req=dSYvF89%2BmodfXvMW1HO4zWbPxUJ6PjQxHn9K2IaIG2K1XVCOEnahwM8Wg%2B1D%0AIaYWwDwxcwMguyYdSu0%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1681607607/ba6e379d2769d190f0970a0adaed/AD_4nXd4aZkqjJFpiXMPF28Pih7HmSJ9pPsnoWAfVgiLdFRFiTkO92YtXteIjvDHaPl7T0tjfpRTBOlyrMbQ_aciCNDgfIuEvV3szmKvt72x5O51DMSClXOYWk1JIRIzylwkj3joXqZcLw?expires=1792613700&signature=f0f223b601c324f5d551bb6c446fcfe032e40636031148a4b08d33ba2aef0f37&req=dSYvF89%2BmodfXvMW1HO4zWbPxUJ5Nj41Hn9K2IaIG2KkQRiQ7IMUvSXTBUgE%0AB4x5KNTtUkvT8Je%2Bqsk%3D%0A) Click “Install Extension…” and select the .mcpb file. Follow the prompts to install and configure your custom desktop extension. For more in-depth information, please refer to our [desktop extension developer documentation](https://github.com/anthropics/mcpb). diff --git a/content/support/11101966-use-voice-mode.md b/content/support/11101966-use-voice-mode.md index 91b8f791cf..f8d18eb333 100644 --- a/content/support/11101966-use-voice-mode.md +++ b/content/support/11101966-use-voice-mode.md @@ -24,7 +24,7 @@ Voice mode transforms how you interact with Claude by: 2. Tap the sound wave symbol in the lower right corner of the chat window to activate voice mode: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042358620/1bf2311353615c1c494da1312a17/124b93a8-0a9b-4c84-9d1f-ede6ca3498dd?expires=1792599300&signature=ad29c31238ef2443a8d6a53fb6202d46839fb9c1ac9fc4750a75fa129ddcfc01&req=diAjFMp7lYddWfMW1HO4zZyGr8x3sl4TF6uXnTLMvvDtB3YoRSVSankiqjeN%0A%2FpjB%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042358620/1bf2311353615c1c494da1312a17/124b93a8-0a9b-4c84-9d1f-ede6ca3498dd?expires=1792613700&signature=0219a842d3c606bd686c584f34df870497c4052332f575b44564676351eecc16&req=diAjFMp7lYddWfMW1HO4zZyGr8x0ulQXF6uXnTLMvvArKAyapqRLkyWg1aGK%0AhuhV%0A) 3. Start talking and see your prompt automatically populate in the chat input. @@ -32,7 +32,7 @@ Voice mode transforms how you interact with Claude by: 5. Claude will remain in voice mode until you click the “Stop” button in the lower right corner of the chat window: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042352060/162f9e61f7fbeb689201dfc1cac1/6a7fafb2-31df-43be-a43f-0059d735e3c4?expires=1792599300&signature=1d52c8181f939fad7dc24f5fbf8c57617dee019932d1c880c882d998a2ac0521&req=diAjFMp7n4FZWfMW1HO4zU6VRP%2FPQbVqxNdRzYWrfF7nn4hg2qANOk7sY9zm%0Aw8y1zkudk3vxF1iVFJA%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042352060/162f9e61f7fbeb689201dfc1cac1/6a7fafb2-31df-43be-a43f-0059d735e3c4?expires=1792613700&signature=b61191ad90901f6a5796e679a2d4feba542c46474ed44a4d84adec6288399b12&req=diAjFMp7n4FZWfMW1HO4zU6VRP%2FMSb9uxNdRzYWrfF4VfynWdBAVI2uK6lkk%0AMZfVylEbEx9ng3Y%2BEjE%3D%0A) ### On mobile (iOS and Android) @@ -40,7 +40,7 @@ Voice mode transforms how you interact with Claude by: 2. Tap the voice mode icon (sound wave symbol next to the microphone icon) in the text input field: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042359690/68879db64559ecf87991f73ce058/671ff972-9e08-4686-bc04-955dab4b2de3?expires=1792599300&signature=cc5e9e46b03ec07c7de90251a2144cd3f17b8402d6a1d63a384dc78ec5e1c629&req=diAjFMp7lIdWWfMW1HO4zQTUIPZ%2FmdFND%2FRXAPlQ7LabkjZ7GfqzL0J5tsY0%0ANQoh%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042359690/68879db64559ecf87991f73ce058/671ff972-9e08-4686-bc04-955dab4b2de3?expires=1792613700&signature=590cc875e8c09fed024bbcf8050be48ba0ae4976a0b8fae8bc7c144bc7c177ad&req=diAjFMp7lIdWWfMW1HO4zQTUIPZ8kdtJD%2FRXAPlQ7LZzS52SKnAEqC9D14iX%0AQV3L%0A) 3. Choose a voice to personalize your experience. @@ -78,7 +78,7 @@ To change the voice later: - **On mobile:** Click the settings button in the bottom left corner while chatting with Claude in voice mode, then tap your preferred voice and pace: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042352063/25eca25bcfd573ecab30dd53158c/074454a6-fa5a-4c49-8b19-02d434b4ca50?expires=1792599300&signature=197a74c543a03ebee9789118279bc56ce71c8d49ad40944e4dfdca79f7cd9e46&req=diAjFMp7n4FZWvMW1HO4zZ3%2FGWiQaVkJy8OQfYsvK3zfgp%2FIigfQOBn8M82l%0APdRyOplBzdLWTQ%2Fc2oA%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2042352063/25eca25bcfd573ecab30dd53158c/074454a6-fa5a-4c49-8b19-02d434b4ca50?expires=1792613700&signature=b0246bd642475c8aabfa521b6ffaa4bf30d45aac6892126475efaac39b1c6008&req=diAjFMp7n4FZWvMW1HO4zZ3%2FGWiTYVMNy8OQfYsvK3zE25E5TxP0CdKK56yj%0AsJS0TXZitMLVu0HkB9o%3D%0A) ## Choose a model diff --git a/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md b/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md index d4648ae0bb..b16ea4ec46 100644 --- a/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md +++ b/content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md @@ -44,7 +44,7 @@ This article provides information on how to enable the Claude LTI integration in 5. Click "Install" and refresh the course page. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1611422430/c8e0875feac1f2c7cb033be74fc9/AD_4nXfLU_bui3EXcCjQ0qm70HD97neqjGayKeDer_t76utlci8gZSUjYRhw6ZSOlDdqSEcwXBzd_shAh7pQEJ-8OoE0O21DM5coOgxmO_WD5hlwiuwtS2iYXcTavhIRyQT5zKFWvfn3NA?expires=1792599300&signature=ea62e56986a4b6227a09d40ba7ec2526346240f996b69cbbe5a4c8247613b9f5&req=dSYmF818n4VcWfMW1HO4zTEDa%2BkbkvqCEv2ojHLMylYijiXRCVdPfOMpeLFF%0Ahc7fU1xl8B7Z%2BiZWpC0%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1611422430/c8e0875feac1f2c7cb033be74fc9/AD_4nXfLU_bui3EXcCjQ0qm70HD97neqjGayKeDer_t76utlci8gZSUjYRhw6ZSOlDdqSEcwXBzd_shAh7pQEJ-8OoE0O21DM5coOgxmO_WD5hlwiuwtS2iYXcTavhIRyQT5zKFWvfn3NA?expires=1792613700&signature=0eba1159d4996884daaaebf1a182e9c90e028ee61a383ae0b6d12e89a4e50082&req=dSYmF818n4VcWfMW1HO4zTEDa%2BkYmvCGEv2ojHLMylbJwtpVBNENrJdhUfLi%0AL36XtizQym8D%2FhdQe7k%3D%0A) ## Turn on the Claude LTI Integration in Claude for Education organization settings diff --git a/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md b/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md index 3b3962ccdb..6f90b396a7 100644 --- a/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md +++ b/content/support/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context.md @@ -38,9 +38,9 @@ When Claude searches your previous chats, you will see this reflected in your cu ## Can I prevent Claude from searching my past chats? -Yes, navigate to **[Settings > Memory](https://claude.ai/new#settings/customize-memory)** and switch the toggle next to "Search and reference chats" off: +Yes, navigate to **[Settings > Memory](https://claude.ai/new#settings/customize-memory)** and switch the toggle next to **Search and reference chats** off. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2533482439/4dee2d7b267f865205feefc8f4f3/cb60c334-d1e2-4828-a01d-dfb36bbaa7eb?expires=1792599300&signature=614ecf86a6a042cac55173c115674ab6eaad6c54bd97978aa35eb6b07f65e557&req=diUkFc12n4VcUPMW1HO4zY9IRQhpXNh0YNcz5nFaZkENHP5%2FIDG1nsgtUvut%0ApKSHbqKzUwZVs6dFAeY%3D%0A) +**Note:** This setting also controls whether Claude Duet, a research preview for Pro and Max plans, can search your past chats. Learn more about **[getting started with Claude](https://support.claude.com/en/articles/17631495)**[**Duet**](https://support.claude.com/en/articles/17631495). ## Can I exclude a specific past chat from searches? @@ -76,6 +76,8 @@ Each project has its own memory. While working in a project, Claude uses the pro What Claude remembers from your chats is available when you hand it a task in Cowork in the cloud, and what comes up in a Cowork task carries back to chat. For example, ask Cowork to draft an update for your manager, and it already knows who that is and how they like updates written. +Claude Duet, a research preview for Pro and Max plans, also uses and adds to your memory, so what Claude knows about you is there from your first message. + To run a single chat or Cowork task without memory, open a new chat, click the “+” menu, and turn off "Memory." Claude won't use or add to your memory in that chat or task, and your other chats and tasks aren't affected. Your memory setting is set when the task starts and can't be changed later. **Note:** Memory across Cowork and chat only works when Cowork runs in the cloud. It isn't available in Cowork sessions that run locally on your computer. Learn more about **Cowork in the cloud**. @@ -86,7 +88,7 @@ To run a single chat or Cowork task without memory, open a new chat, click the You can toggle Claude’s memory on by navigating to **[Settings > Memory](https://claude.ai/new#settings/customize-memory)** and turning on **Generate memory from chats**: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2533482441/b5c806a8e3f68bf34c4a70724d38/d30be013-d099-4c93-99d1-23d404792f08?expires=1792599300&signature=ed787f91c68df6aa1d86c6bcc09eb83e0c9fe72064725d1808cc748244fc1cbe&req=diUkFc12n4VbWPMW1HO4zRlYr5lo61kvNshWSMEMw9daZVjTaUmQ0nA3Rxhj%0A8cHU%2BPmG%2FaCv1Vt2zXw%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2533482441/b5c806a8e3f68bf34c4a70724d38/d30be013-d099-4c93-99d1-23d404792f08?expires=1792756800&signature=18e2a8a3075f5c27e5ed7c02138f1d2d51200eae7f7bf768a4cfc3ecd146041e&req=diUkFc12n4VbWPMW3nq%2BgUSsLm4la0mTETdz1G74VAF11%2BncCdDCovO7LnA7%0AqTxlQyCv2L5XVrEZdG97YtUQqcs%3D%0A) If you want to disable Claude’s memory, click the toggle and you'll see two options: @@ -282,7 +284,7 @@ When Claude searches your previous chats, you will see this reflected in your cu Yes, navigate to **[Settings > Capabilities](https://claude.ai/settings/capabilities)** and find the **Preferences** section. Switch the toggle next to “Search and reference chats” off: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730889/3fafbf5ecaa0ae31d7d84a66229b/c25536c1-7433-4b94-a5e9-cd5acf97a4fd?expires=1792599300&signature=ab494c001cea224df88b83232efcd7e2efae4602b7d10c8cd3881b3f403864ec&req=dScmH859nYlXUPMW1HO4zRzXHl01KjjBJG68qZhl783XkDOdAENddsfKOvfN%0A1yOaiXRsBoP34E2srjU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730889/3fafbf5ecaa0ae31d7d84a66229b/c25536c1-7433-4b94-a5e9-cd5acf97a4fd?expires=1792756800&signature=035e81158e2ee2f4c03dd4a464eafbf1ae09839395f01b2b5f0c983429683cd3&req=dScmH859nYlXUPMW3nq%2BgZWAenTxyXi5QRiiEHajSEQLc4OrewsGPrGBgzsB%0AEC5jgZA6mIDZhi80EYCXfy9Q3Q4%3D%0A) ### Can I exclude a specific past chat from searches? @@ -290,7 +292,7 @@ Incognito chats are available to all Claude users (free, Pro, Max, Team, and Ent When starting a new chat with Claude outside of a project, you'll see a ghost icon in the upper right corner of your screen: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730893/9549b21954e0070ceb6b85231fd5/88e59234-6fc2-4229-84fe-733b33efff26?expires=1792599300&signature=1094dcfc8c3019eed0b14b41f32f46e95a2b4c6ac502e31e2102b0ca03f73e9c&req=dScmH859nYlWWvMW1HO4za54saFpNY%2B4XDpzhlKsgjNJ%2BryJgrw9aMJ9H8%2Bl%0AFFVl0%2BU9VocxCC27qzY%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730893/9549b21954e0070ceb6b85231fd5/88e59234-6fc2-4229-84fe-733b33efff26?expires=1792756800&signature=bc7b1f2c9d399f6262bbd34b67f1b5fe21b0d6dc924bccd4bc5a02a05957b0cb&req=dScmH859nYlWWvMW3nq%2Bgf44pcp8qOr3MmV1mzkyUm0ospVSu74H%2F09FLptz%0AR9hZidgTRa%2Bai0LxW3Ifm6jrxeo%3D%0A) Clicking the ghost icon will open an incognito chat, creating a temporary conversation that isn’t saved to your chat history. Claude won’t pull information from incognito chats when searching previous conversations. @@ -322,7 +324,7 @@ Each project has its own separate memory space and dedicated project summary, so You can toggle Claude’s memory on by navigating to **[Settings > Capabilities](https://claude.ai/settings/capabilities)**: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730892/62f9f2b68d675a8e33393f06024f/89198978-192f-4c52-915d-5294b16f3fe1?expires=1792599300&signature=c07da933ba711ac700b026c9841add10735554a0cfee5294764b3f9b10b0648d&req=dScmH859nYlWW%2FMW1HO4zTD5McPjfu1GBq9N9dRTKYc1esLQEzQTnjmlCIlG%0A2ngFN5bSERRCBTeG%2Fos%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719730892/62f9f2b68d675a8e33393f06024f/89198978-192f-4c52-915d-5294b16f3fe1?expires=1792756800&signature=6c8b3c60b661c188c645c3bdd76b4c2315747b822459597bf819435397a39ca4&req=dScmH859nYlWW%2FMW3nq%2BgRexfslT1nU9UGfBdWCMNKOp16HguvyI7gKEGoH6%0AX5rs8ic39jXJeqr%2BhV087xzG7yg%3D%0A) If you want to disable Claude’s memory, click the toggle to see two options: diff --git a/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md b/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md index fdfed11c4f..a79424cf78 100644 --- a/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md +++ b/content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md @@ -2,7 +2,7 @@ If you see the following pop-up when you log in to your Claude account, you’ll need to click the “Verify now” button to verify your payment method: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1631413861/42c3b13d7fc44a11a88ec2b9cd03/AD_4nXeMx8QXpeZZCkfAnVSwx8KZ9n4Vr2rvPdQddyE6ZNxch__F6ZqFs1G4ZmU52Wvb7gRlwRqquTLdw8IQv-gICDyP-MXqiQK_Oe7gX3SKsCKKt2IEpMx4qDeMeeZufMaJfv16XgOH5g?expires=1792599300&signature=e30fff35110e6afca33141437952d371bbe9087f1ca6132af96827461595bb10&req=dSYkF81%2FnolZWPMW1HO4zf7%2BjUbr4Ynxn6MrEicvimAkz8DSp%2B0G4LV33oZo%0AXpj8bro4%2FDcY%2FK0UquE%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1631413861/42c3b13d7fc44a11a88ec2b9cd03/AD_4nXeMx8QXpeZZCkfAnVSwx8KZ9n4Vr2rvPdQddyE6ZNxch__F6ZqFs1G4ZmU52Wvb7gRlwRqquTLdw8IQv-gICDyP-MXqiQK_Oe7gX3SKsCKKt2IEpMx4qDeMeeZufMaJfv16XgOH5g?expires=1792613700&signature=34f9436137d958a21e560b786c186a6e025ce94824d238185ccf5db0a19a27c8&req=dSYkF81%2FnolZWPMW1HO4zf7%2BjUbo6YP1n6MrEicvimCSy%2BfzXuh5r9KoJeba%0AvGoLwHeo7q8axk%2F2CT8%3D%0A) ## What happens if I click “Remind me later?” diff --git a/content/support/11869629-use-claude-with-android-apps.md b/content/support/11869629-use-claude-with-android-apps.md index d49564ad85..b713934f5e 100644 --- a/content/support/11869629-use-claude-with-android-apps.md +++ b/content/support/11869629-use-claude-with-android-apps.md @@ -222,7 +222,7 @@ Permission requirements vary by feature: For features requiring permissions (like location or calendar access), Claude will request permission contextually with clear explanations of why the access is needed. You’ll be prompted to approve the action with three options: Allow once, Always allow, or Don't allow. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1707351614/ccb910e4b87b1e96ad9a11bbd835/b57b2130-d8d6-4499-89f6-6c12de236fd4?expires=1792599300&signature=ef334e0bcd0f26a584ff98597634b5819ea75334beb9a9fd53440813cebed722&req=dScnEcp7nIdeXfMW1HO4zQe5G12K0iz3S5x65TIld%2FCS%2FbQPGTBmDIXM1bcF%0AFZLq40cGLPFsBQVPpJU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1707351614/ccb910e4b87b1e96ad9a11bbd835/b57b2130-d8d6-4499-89f6-6c12de236fd4?expires=1792613700&signature=296be8b95c04c658f10f7f3b9ff912f9860969541b99b1094d76c5e87f6a4e1c&req=dScnEcp7nIdeXfMW1HO4zQe5G12J2ibzS5x65TIld%2FBOuuVLV4x%2FA00%2FK8JT%0AkxUK0WgZg3zC1aubAtw%3D%0A) These permissions can be managed at any time in your device settings by going to Settings > Apps > Claude > Permissions. Click into each permission listed under **Allowed** and **Not allowed** to make changes. You can toggle between “Allow only while using the app” or “Ask every time” to change Claude’s access, or remove permissions by choosing “Don’t allow.” Claude will only request permissions if needed for specific features, and you can always choose to decline while still using other capabilities. diff --git a/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md b/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md index ce39be13d9..9c3d784bc3 100644 --- a/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md +++ b/content/support/12005970-manage-usage-credits-for-team-and-seat-based-enterprise-plans.md @@ -70,7 +70,7 @@ After navigating to **[Organization settings > Usage](https://claude.ai/admin-se The **Usage and spend limits** section will show the current limit (if any) or **Unlimited**. Clicking on "Adjust limit" opens a modal where you can either input an amount and click "Set spend limit," or click "Set to unlimited" to remove the organization-wide monthly spend limit. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149347604/936ac4eb025d3ef1f00c3b8a26b0/image.png?expires=1792599300&signature=601582ffea1838749b07c844c1ef6e4d6d7238a4e2bd3de39e2195e97162637e&req=diEjH8p6modfXfMW1HO4zQHwgqPSnyel6DwhVVpk1mAdIyE3Jsgan8yCxRqs%0AdGZcIab44INiFpgmDI0%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149347604/936ac4eb025d3ef1f00c3b8a26b0/image.png?expires=1792613700&signature=a94876d8fc5e6acfebbdbab925d12ca5fead3a1505fbb0b7d288ae548f7ef4b2&req=diEjH8p6modfXfMW1HO4zQHwgqPRly2h6DwhVVpk1mBRFLXQMNZYkUYZhbGV%0AdQNmEwr6U4NeckG8uGU%3D%0A) Changes to your organization’s overall spend limit go into effect immediately. @@ -78,11 +78,11 @@ Changes to your organization’s overall spend limit go into effect immediately. Owners and Primary Owners on **seat-based Enterprise plans only** can set spend limits that apply to all users within a specific seat tier. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149351600/c5b979c366ac2738f60ea84e85b3/CleanShot+2026-03-10+at+15_37_41%402x.png?expires=1792599300&signature=360f6e34e86c9f96be13ec5d85b19fc08318fd171129a7324b2a41d51354c0cb&req=diEjH8p7nIdfWfMW1HO4zYnqMYeRKnmK0wfO62ivdG8IvM4gzbfg3EyQ1%2F5z%0AE1XcbOCXoYg4mORa19Y%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149351600/c5b979c366ac2738f60ea84e85b3/CleanShot+2026-03-10+at+15_37_41%402x.png?expires=1792613700&signature=68e8c1dfe063526f99b9c7b6964d84f054e5700845acf5c36e1927c253815302&req=diEjH8p7nIdfWfMW1HO4zYnqMYeSInOO0wfO62ivdG%2BDthaTTAvFV5TnT0k2%0AHKw04zYdUzpfYB45rq8%3D%0A) Select the "By group" tab to see **Standard seats** and **Premium seats** groups. Click the "..." icon next to the current limit, then "Edit limit." This opens a modal where you can either select "Set dollar amount" and input an amount, or click "Unlimited" to remove the limit for that seat type. Click "Set limit" to save your changes. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149362056/44993661ca2db771fe924d0346f6/image.png?expires=1792599300&signature=cb497ce80a32a59cef8399b81f82b9d8c2bc446c6fb57a3783394feb01246237&req=diEjH8p4n4FaX%2FMW1HO4zRzvvYcOeURFq7nEDCGq9G7%2F99VYM7gWstzVdtiH%0AJvP1vpfXXaj7Oz%2BA%2BDI%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149362056/44993661ca2db771fe924d0346f6/image.png?expires=1792613700&signature=b8d3a6d08f601111d6bd00803535b5eefc6958b99cb81aec2fda83406a90f2a3&req=diEjH8p4n4FaX%2FMW1HO4zRzvvYcNcU5Bq7nEDCGq9G4jgjTzQG0McSxzA6er%0AmWBuePr%2F54Wc51qh0Tc%3D%0A) --- @@ -90,11 +90,11 @@ Select the "By group" tab to see **Standard seats** and **Premium seats** groups Owners and Primary Owners can also set individual monthly spend limits for each member by finding **Spend limits by user** and clicking the "..." button next to the user, then "Edit limit." -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149370853/db66f5cd03683b9cc119d0dcd6b8/image.png?expires=1792599300&signature=d75c48d775e7950e74c2e4fb0664e66c48badc583da2c0937c731833450c5607&req=diEjH8p5nYlaWvMW1HO4zaPdGAVSXCZFe9HwvwG7ubgSwr%2BzyODXgDgwDmW7%0AW%2Fo30MYS6PnSEyUCcgs%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149370853/db66f5cd03683b9cc119d0dcd6b8/image.png?expires=1792613700&signature=aca0b48c12c3d623073af643de577b46be627c7fba8e0dd7b54c7cfe970f94b1&req=diEjH8p5nYlaWvMW1HO4zaPdGAVRVCxBe9HwvwG7ubhnb0mgSgkNK7Dhmx46%0AP1GfSksMMczRJrlLlQ0%3D%0A) Enter the amount and click "Set limit." Alternatively, selecting "Set to unlimited" will remove that member's monthly spend limit (they will still be subject to any organization or seat-level spend limits). -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149374028/97813fe3b515c2e839d8d92abd79/image.png?expires=1792599300&signature=987ae627ddf6d2e0c99571bfdd8d1c0b9dc17da28e1292f4bae394556a5bcf02&req=diEjH8p5mYFdUfMW1HO4zevsA%2FWPOuKJw6z2wGSwkbtuwH3gresUpTWMi2qd%0Ad430SEgyZekRd28c2Uk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2149374028/97813fe3b515c2e839d8d92abd79/image.png?expires=1792613700&signature=b0659a6cbc49ffa374d745a430454b61c332062d39ff7c41641057e195c875c2&req=diEjH8p5mYFdUfMW1HO4zevsA%2FWMMuiNw6z2wGSwkbsCWUNuP4G9pualAleo%0A4zI6Xlf9CfA%2F26c1bcU%3D%0A) This allows owners fine control over usage credits, so you can set limits for different members based on their roles or individual needs. Once a user reaches their defined spend limit, this will automatically pause their usage credits until the end of the month. They will need to wait for their usage limits to reset before using Claude again. diff --git a/content/support/12012173-get-started-with-claude-in-chrome.md b/content/support/12012173-get-started-with-claude-in-chrome.md index 03512e1402..f6c935cc82 100644 --- a/content/support/12012173-get-started-with-claude-in-chrome.md +++ b/content/support/12012173-get-started-with-claude-in-chrome.md @@ -38,7 +38,7 @@ Follow these steps to connect Claude in Chrome in your desktop app: 4. Toggle the connector on, then download and install the extension if you haven’t already. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2604933811/ae37c41fc808dbdf48d135338334/6cc9ba4b-9d31-43a2-ab80-8048b5f9d791?expires=1792599300&signature=44f330d92b1a132b1ec1a9357d87f25d4435d3af2990555e8522fd61029360ea&req=diYnEsB9noleWPMW1HO4zUOPbf7Dn%2BuOnt%2F2nPMwUPiP8Qh%2BEAoYMZDBPOM2%0Akw5NSjOp%2BmtLFI65Aw4%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2604933811/ae37c41fc808dbdf48d135338334/6cc9ba4b-9d31-43a2-ab80-8048b5f9d791?expires=1792613700&signature=e85afe1e93ad4dfa0b6f0a1da1a8c6a1de12e7cc2824a996ab097be0fd0edddf&req=diYnEsB9noleWPMW1HO4zUOPbf7Al%2BGKnt%2F2nPMwUPiWCg4gnVPlEApZQJlw%0A0av8e%2BuW12i39Ft8zyI%3D%0A) Completing these steps will add Claude in Chrome to the “Connectors” drop-down on your chats with Claude. This is disabled by default, so you’ll need to enable it manually for each conversation. diff --git a/content/support/12083917-change-your-team-plan-from-monthly-to-annual-billing.md b/content/support/12083917-change-your-team-plan-from-monthly-to-annual-billing.md index 506bc56d4b..a7f3b3bfa7 100644 --- a/content/support/12083917-change-your-team-plan-from-monthly-to-annual-billing.md +++ b/content/support/12083917-change-your-team-plan-from-monthly-to-annual-billing.md @@ -8,11 +8,11 @@ Owners and Primary Owners of Team plans with monthly subscriptions can switch fr 3. Or from /upgrade, click the “Switch to Annual plan” button: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1690325734/d47f714680d78408d6022d06b8d1/image.png?expires=1792692000&signature=113947c89683cf47e0c634034db5734f14dba174eda9a9215ea5e4131357a9b3&req=dSYuFsp8mIZcXfMW3Hu4gZzas%2FXsuzlbn2rRiVwqPzbXBhLKT3XKm%2Fv82zbV%0AIA%3D%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1690325734/d47f714680d78408d6022d06b8d1/image.png?expires=1792746000&signature=6693738f45161abd5223ea90ff15bde31e3d62add081b76b02a2ef0c00094122&req=dSYuFsp8mIZcXfMW3Hu4gZzas%2FXsuzhWm2rRiVwqPzbROSFsHENGFDR4ISxd%0AIw%3D%3D%0A) 4. The confirmation screen will display the total cost for your upgrade from monthly to annual billing: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1690326039/3a91cdc5fff57d188a18ecc6273f/image.png?expires=1792692000&signature=78ff89b515a8f4fad1d61d9546ed5a5906347afc432749ed4928daffc1550ab2&req=dSYuFsp8m4FcUPMW3Hu4gbNj%2Bk79Xgvoie5vzcg6znVCk2gmMxxodS%2FRw03m%0ACA%3D%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1690326039/3a91cdc5fff57d188a18ecc6273f/image.png?expires=1792746000&signature=60faf325aa68339c1f2ca1d6109f9c2255f0c5fbb3af8b435508026e2f3fdded&req=dSYuFsp8m4FcUPMW3Hu4gbNj%2Bk79Xgrlje5vzcg6znXYvXwxW19AoPkp1SKm%0ALA%3D%3D%0A) 5. Click “Confirm subscription.” diff --git a/content/support/12111783-create-and-edit-files-with-claude.md b/content/support/12111783-create-and-edit-files-with-claude.md index 5c3a9c11c0..c979cd3da3 100644 --- a/content/support/12111783-create-and-edit-files-with-claude.md +++ b/content/support/12111783-create-and-edit-files-with-claude.md @@ -48,7 +48,7 @@ These capabilities make it easy to produce professional documents by simply chat To give Claude access to external data sources, toggle **Allow network egress** on: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2054774005/25bcfffba6c249cd128d6c3f6d52/CleanShot+2026-02-11+at+16_34_47%402x.png?expires=1792599300&signature=52e6cc1b0cdf6f4ea53e068fa1e555e21d0ec37ba1af146e9299e2d77bc8c98a&req=diAiEs55mYFfXPMW1HO4zYFJyg9ABZDNPQVowIiib2lOKPe7Dg%2Fj2Cq3mp1v%0A6MKWd8iGz5XOn2lnaLU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2054774005/25bcfffba6c249cd128d6c3f6d52/CleanShot+2026-02-11+at+16_34_47%402x.png?expires=1792613700&signature=5c0fc6f653aaebd58dc7a31fe1409ba5bb794fcc65b01770729858ccfb6413f1&req=diAiEs55mYFfXPMW1HO4zYFJyg9DDZrJPQVowIiib2ml%2F8UteHn%2F4TGkqq35%0A%2FAVVHQ9UTwbHxXFzP%2FA%3D%0A) ### Enabling on Claude Mobile @@ -66,11 +66,11 @@ Team and Enterprise organization owners can control network access settings in * - **Allow network egress to package managers and specific domains:** Claude can access package managers plus additional domains you specify. Add domains individually to whitelist specific resources your organization needs: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1789945362/ad72504d5429960f369b8b91b43c/86f06c0e-6eaa-4574-a4cb-2c38b273613a?expires=1792599300&signature=72fbb154549b411fb3d003ed42d0129c6883918f2f61a953ea85710b407c2c9f&req=dScvH8B6mIJZW%2FMW1HO4zXJcB29GnCBIpMW6Iph6YZfdTr%2BMHDeafL804JCD%0AxESbZ50HwZ5TenCuz8Q%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1789945362/ad72504d5429960f369b8b91b43c/86f06c0e-6eaa-4574-a4cb-2c38b273613a?expires=1792613700&signature=42d9ab33846b8ad2d2209d9ab2cbf00e8bf8ed379029e5ea0473d168cd861cab&req=dScvH8B6mIJZW%2FMW1HO4zXJcB29FlCpMpMW6Iph6YZfUz9glqfwnXeBJo2k8%0AD2p7Kf96wPU9REt4hlk%3D%0A) **All domains:** Claude has full internet access except for domains on Anthropic's legal blocklist. While this provides maximum flexibility for file creation and analysis tasks, it’s also the riskiest option. Please review the **[security considerations below](#h_0ee9d698a1)** before enabling “All domains”: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1789945361/e3188cb8edb9ca7c303615da6378/f1c99a7d-5956-48d5-9ec7-b7ae6c8c3d28?expires=1792599300&signature=e300429786cb1ea60801ed3a1d2784309964174c97879d7f3dcc77b79fa2d438&req=dScvH8B6mIJZWPMW1HO4zdnseRaX5zahqgKIA6CM1tpImxrCQfS%2B7cgZT63Q%0AQG8XvGtwq0y2gVrCGMg%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1789945361/e3188cb8edb9ca7c303615da6378/f1c99a7d-5956-48d5-9ec7-b7ae6c8c3d28?expires=1792613700&signature=d8b53e7f2d9b777ba2d81bf2334ad3224fd3dc88e3931435885d924be84a7631&req=dScvH8B6mIJZWPMW1HO4zdnseRaU7zylqgKIA6CM1tqhjMFZJOpM7JXPLedy%0AEMgQz9Qxkby2ovOPFIM%3D%0A) --- diff --git a/content/support/12138966-release-notes.md b/content/support/12138966-release-notes.md index ad8e477aa7..597ef22fdd 100644 --- a/content/support/12138966-release-notes.md +++ b/content/support/12138966-release-notes.md @@ -2,6 +2,12 @@ ## October 2026 +### October 21, 2026 + +**Claude Duet research preview for Pro and Max plans** + +We just opened a research preview for users on Pro and Max plans: Claude Duet, a new app where Claude works as a proactive agent. For more information, see our blog post: **[Introducing Claude Duet](https://claude.com/resources/articles/claude-duet)**. + ### October 7, 2026 **Claude Haiku 5.5 launch** diff --git a/content/support/12260368-use-incognito-chats.md b/content/support/12260368-use-incognito-chats.md index 5094a59aae..ef43afaf3f 100644 --- a/content/support/12260368-use-incognito-chats.md +++ b/content/support/12260368-use-incognito-chats.md @@ -34,7 +34,7 @@ These differ from regular chats in several ways: When starting a new chat with Claude outside of a project, you'll see a ghost icon in the upper right corner of your screen: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719768744/c7a2fa56cf284e48472f3b9c4dbf/030563f8-9f97-4891-a749-9ae95968a063?expires=1792599300&signature=96913dc2ae588d0b22f0ae482855efe49c0eca5ba90029913455badb6eb597bf&req=dScmH854lYZbXfMW1HO4zeUcugC4Z%2ByIDCAt3Cx%2FSO3CkeKs%2ByyW1yjjbkKR%0ANp4tH8zkLmbmW9ScAVc%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1719768744/c7a2fa56cf284e48472f3b9c4dbf/030563f8-9f97-4891-a749-9ae95968a063?expires=1792613700&signature=76a15f6d78760d3d50dfac4352f50afb2ad0c4b12e4422a87f84049e19e7288c&req=dScmH854lYZbXfMW1HO4zeUcugC7b%2BaMDCAt3Cx%2FSO1HY9zjJip3sIdrvkOv%0ADpznPwnZo5LFdkhbWkE%3D%0A) 1. Click the ghost icon to enable incognito mode. diff --git a/content/support/12293051-use-claude-in-xcode.md b/content/support/12293051-use-claude-in-xcode.md index c86724def3..b9f6cb8e95 100644 --- a/content/support/12293051-use-claude-in-xcode.md +++ b/content/support/12293051-use-claude-in-xcode.md @@ -34,7 +34,7 @@ To start using Claude in Xcode: 3. Log in with your Claude account. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1727371585/b18ca03a6357c52d12d10386f28e/dab2dcb2-f670-4173-b77d-38767a34cec1?expires=1792599300&signature=59d298b1bbadbc611fbfa67008a0ae7b9c811e28e93bd78bea95da19692fee1e&req=dSclEcp5nIRXXPMW1HO4zUAXIs4HW6HXFalhp3bugHIZ5UddDtljgg%2FA1IpH%0ANYcsZGAm2cjnh7CdWH4%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1727371585/b18ca03a6357c52d12d10386f28e/dab2dcb2-f670-4173-b77d-38767a34cec1?expires=1792613700&signature=7d337d3a56566631c0aa0ef09acdcf634de0b6442235b37d625ffbcd3297750e&req=dSclEcp5nIRXXPMW1HO4zUAXIs4EU6vTFalhp3bugHLunvpHQTrvcmXqOXGB%0AN6XuGvqkC%2By99LxKr88%3D%0A) ## Usage limits diff --git a/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md b/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md index e37e9f2453..5b2564fa62 100644 --- a/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md +++ b/content/support/12429409-manage-usage-credits-for-paid-claude-plans.md @@ -50,7 +50,7 @@ To enable usage credits on your paid Claude plan: 8. You can also enable auto-reload to automatically make a purchase when your balance falls below a threshold you set: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1805819785/5e203c38e6ba3f76bfd1dab0d5ce/fe062e7c-18cb-48cc-a7e2-754ac6e6c4be?expires=1792599300&signature=b70137802b6cb54590e66e917fc8befe7782affc5918b250b48cf41a250e33ed&req=dSgnE8F%2FlIZXXPMW1HO4zYj2ABCcrPk7opE7m38YdfeGqv9OUhKdeClidP1i%0ABeg3qM6F9NNrx9pZSPk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1805819785/5e203c38e6ba3f76bfd1dab0d5ce/fe062e7c-18cb-48cc-a7e2-754ac6e6c4be?expires=1792613700&signature=8db441bb79075fc03080d6dc927e867627c86a8b018061e987a0a48211ba0e24&req=dSgnE8F%2FlIZXXPMW1HO4zYj2ABCfpPM%2FopE7m38YdffS39YvqteMMN1K6D5M%0A%2FdyV6gfVUvAXrrSrK9c%3D%0A) --- diff --git a/content/support/12466728-troubleshoot-claude-error-messages.md b/content/support/12466728-troubleshoot-claude-error-messages.md index 5a942e7f0c..00bcff6bd7 100644 --- a/content/support/12466728-troubleshoot-claude-error-messages.md +++ b/content/support/12466728-troubleshoot-claude-error-messages.md @@ -60,4 +60,4 @@ Capacity issues will not appear on our status page because they represent normal Service incidents are disruptions where Claude is unavailable or significantly degraded for all or most users. These represent actual technical problems with our systems. To check for confirmed incidents, visit status.claude.com, where you'll find real-time updates on scope, impact, and resolution progress for any active incidents. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1753796247/e6a8c6ef8653b229c5758e881242/c2fc6fc0-d163-4119-93e0-394104d86bc9?expires=1792599300&signature=0c1fa032a93048aac5d64af94b3698de88727ab425856d738eee9dce582266ca&req=dSciFc53m4NbXvMW1HO4za4BX60m27vH7y68oYp%2BYg%2Fxmy1rTFdspWc87r3W%0AzWcrbZ22MmNICKO7GlM%3D%0A) \ No newline at end of file +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1753796247/e6a8c6ef8653b229c5758e881242/c2fc6fc0-d163-4119-93e0-394104d86bc9?expires=1792613700&signature=bb7cb111175cc5436e12d10ad8886ae3e1eb57e43f86cc81a8e9a3ea814af3a0&req=dSciFc53m4NbXvMW1HO4za4BX60l07HD7y68oYp%2BYg9cEfCoYeyEGpvXUDaK%0AKCSmWwD4GMbAOk0Go0I%3D%0A) \ No newline at end of file diff --git a/content/support/12512180-use-skills-in-claude.md b/content/support/12512180-use-skills-in-claude.md index ab9776969f..a6938d4993 100644 --- a/content/support/12512180-use-skills-in-claude.md +++ b/content/support/12512180-use-skills-in-claude.md @@ -202,7 +202,7 @@ To remove a custom skill you've uploaded: 4. To delete the custom skill entirely, click the "..." button next to the toggle, then select "Delete": - ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2105391273/8359cbf8be20dce0f1cd3fd40e6f/CleanShot-2B2026-02-25-2Bat-2B15_50_16.png?expires=1792599300&signature=0c99346d1e4e6f6bb1b03db4b2c7919c604cad1f120609c122c9749534f96b24&req=diEnE8p3nINYWvMW1HO4zSOgDikty%2B%2BuH%2BdCnFXB0uinfUN%2FuyyNZ1b%2BtXA9%0A3jqr%0A) + ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2105391273/8359cbf8be20dce0f1cd3fd40e6f/CleanShot-2B2026-02-25-2Bat-2B15_50_16.png?expires=1792613700&signature=6d98e440356384bc8b60a8e1f820c73df6da169eac105bbe109c8b6b2ec6cead&req=diEnE8p3nINYWvMW1HO4zSOgDikuw%2BWqH%2BdCnFXB0ujOi6N4BsMLNO7ldWof%0AGPeA%0A) 5. Click "Delete" in the confirmation prompt. diff --git a/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md b/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md index 35391b67aa..22062eef05 100644 --- a/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md +++ b/content/support/12592343-enabling-and-using-the-desktop-extension-allowlist.md @@ -20,11 +20,11 @@ The desktop extension allowlist is disabled by default, so an organization Owner 4. Switch to the "Desktop" tab: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781755172/63c92550571842577ad435860ec5/6f5cc4e1-ff7d-48de-863a-c4e6184d4605?expires=1792599300&signature=6b42155c8e6783f5f022c2f20aa4f164fdc1fcaf25336219714712c1b4174f3f&req=dScvF857mIBYW%2FMW1HO4zQ9pXEgP9nnY0ugSQm1MFW%2FtIMXuEAh9%2FMzo4%2BE1%0AObAE%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781755172/63c92550571842577ad435860ec5/6f5cc4e1-ff7d-48de-863a-c4e6184d4605?expires=1792613700&signature=61f0a803e71d2fdf2ae3f0e73dcc01687de18c1c0df985c5c37c7dcf741bd54c&req=dScvF857mIBYW%2FMW1HO4zQ9pXEgM%2FnPc0ugSQm1MFW9QyIzfKKMvRmunehpl%0Ag%2FKe%0A) 5. Toggle **Allowlist** on: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781755578/a6bafff5f084dc86ae463703fd3d/6cf0ee18-4e71-4129-98e8-cc08174e3c3a?expires=1792599300&signature=05448cb6922326c827b67b9aacf52bf3a67fdc221632ddb43f7e64f03c262f50&req=dScvF857mIRYUfMW1HO4zaj0BXMuQK4HTAorLxpdoc9NIKIuKzvITkdbwyd0%0AqrqR%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781755578/a6bafff5f084dc86ae463703fd3d/6cf0ee18-4e71-4129-98e8-cc08174e3c3a?expires=1792613700&signature=3fe77069521a82372ed99c2583b4dcf0580869f26545f01bf40b31e7d4ba4f38&req=dScvF857mIRYUfMW1HO4zaj0BXMtSKQDTAorLxpdoc8sSqT6hCuCBDF4p4ad%0Av7go%0A) ## What happens after enabling the allowlist? @@ -42,7 +42,7 @@ Consider completing the allowlist setup during off-hours to minimize disruption **Important:** The allowlist requires Claude Desktop version 0.13.91 or higher, so users should update the desktop app by clicking “Claude”, then either “Check for updates” or “Restart to update to Claude 0.13.91”: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781756960/ad18af50c83d35f2673656c23e00/a7ee450f-0c7d-42d6-a75f-fb1bc088cb52?expires=1792599300&signature=e68d327f3c7a956da9eade2cc61caa4fc4b927d5db15b4ffcbd3621fcae5d8e5&req=dScvF857m4hZWfMW1HO4zYUJqIGvAzvoCEDZ5AdBjIYPEPJT%2F7w%2FtbUJ4FR2%0AJOAp1p%2Bj3hiPBbVZSsg%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781756960/ad18af50c83d35f2673656c23e00/a7ee450f-0c7d-42d6-a75f-fb1bc088cb52?expires=1792613700&signature=9f80da2a97acd6c657864675dfc74ec447f7edc25af21e88ad592028a051021c&req=dScvF857m4hZWfMW1HO4zYUJqIGsCzHsCEDZ5AdBjIaOS2BqyFJktvEbm%2BQV%0AmLGJRnm69ykaEzDVj2s%3D%0A) ## Managing allowed extensions @@ -60,7 +60,7 @@ After enabling the allowlist, you can choose which extensions to allow: If you want to remove an extension from the allowlist, click the “...” button and “Remove from allowlist.” -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781751250/6558c0f59aea7976bd44b0213d76/e750f02b-cd0d-437e-a83f-9ac362cdf456?expires=1792599300&signature=044843dfb8f57be909cef2f5067b06c2d11f9028422bbed60329db602a672dc3&req=dScvF857nINaWfMW1HO4zTrxBKos9l6WqXridZhfx1LJinAXML3iwezkzrYc%0ALn4ICyvDcKt1rZTl0jw%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1781751250/6558c0f59aea7976bd44b0213d76/e750f02b-cd0d-437e-a83f-9ac362cdf456?expires=1792613700&signature=9b66d0fc7939a91f06fb9c58c4f81fa404e79eab84c5044cd73c9aef272fe149&req=dScvF857nINaWfMW1HO4zTrxBKov%2FlSSqXridZhfx1K1NcsqP5iyzqbkZq4S%0AtKSBs%2Bc3v7winlV1jh4%3D%0A) ## Uploading custom extensions diff --git a/content/support/12618689-use-claude-code-in-the-cloud.md b/content/support/12618689-use-claude-code-in-the-cloud.md index 70042353b8..8077a77db5 100644 --- a/content/support/12618689-use-claude-code-in-the-cloud.md +++ b/content/support/12618689-use-claude-code-in-the-cloud.md @@ -10,7 +10,7 @@ This feature works with repositories you may not have on your local machine. You Cloud sessions enable asynchronous development workflows. In a local session in your terminal or editor, you typically work synchronously: you make a request, wait for Claude to respond, review the changes, then make another request. Synchronous work like this gives you fine-grained control but requires your attention throughout the process. A cloud session handles this differently: you can assign a larger task, let Claude work independently, and return later to review the completed work. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446157/07ec74cd46317f8278083a317841/6448f3ee-c6df-4417-8a13-90d8c2ca3d55?expires=1792599300&signature=58e256a49baf4c4dc2dda882523e4949e991a7277c6ed53808878014185c9acd&req=dScvEM16m4BaXvMW1HO4zR8%2BAVGFS5R17XrRA1YwWGvG7yly9uwbdNbKyjT7%0Am5S5eSFlYR0Psq4qYGI%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446157/07ec74cd46317f8278083a317841/6448f3ee-c6df-4417-8a13-90d8c2ca3d55?expires=1792613700&signature=e59bc68e883a4c066231c732f9266033c6a1719721e696b2dc660c501941413c&req=dScvEM16m4BaXvMW1HO4zR8%2BAVGGQ55x7XrRA1YwWGtlRwml0fv3PCcPZmaM%0AO6h7fs2oN4yZGHfuZlg%3D%0A) You can also run multiple tasks in parallel. Since each task runs in its own isolated environment, you can have Claude working on several different issues or repositories simultaneously. Each task proceeds independently and creates its own pull request when complete. More than one task can work on the same repository at the same time. @@ -20,13 +20,13 @@ You can also run multiple tasks in parallel. Since each task runs in its own iso When you start a cloud session, Claude Code creates an isolated virtual machine for your work. Your GitHub repository is cloned into this environment, which comes pre-configured with common development tools and language ecosystems. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446158/c092f1383826cb871493f74169d4/97b7cb98-5da2-438e-a920-e170b8b9790e?expires=1792599300&signature=44f4815c9c77f5328aa429dd179da30b21a0c4aec10ea33f13ebcac49a2afb9a&req=dScvEM16m4BaUfMW1HO4zcR0rJQxhuDD7DtpMiX%2FBYmSKmdD3hYuB1YVVwZm%0A3YIIYmb4R8%2BzLs7Ftmo%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446158/c092f1383826cb871493f74169d4/97b7cb98-5da2-438e-a920-e170b8b9790e?expires=1792613700&signature=e338ac4bc8d65144d92c7c1af0b5bedbb206aca031367f0f21f89eec369a34d1&req=dScvEM16m4BaUfMW1HO4zcR0rJQyjurH7DtpMiX%2FBYnaOgm88XVEZLuxw8YF%0AfzYuMJBeXHCMMty1oIY%3D%0A) Claude prepares the environment by running any setup commands you've defined in your repository's configuration. This includes installing dependencies, setting up databases, or running other initialization steps your project needs. If your task requires network access, maybe to install packages or fetch data, you can configure the level of internet access the environment has. Once the environment is ready, Claude begins working on your task. Claude reads your code, makes changes, writes tests, and runs commands to verify the work. You can monitor progress and provide guidance through the web interface if needed. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446156/83ecf0a5b98eddc9ffc9694c50f7/353589ce-b678-441d-8909-71b45fa2d065?expires=1792599300&signature=a3d41587e252f39760552e86d9cfdc9ffa69576ad88df6ab7137a24cacc682d8&req=dScvEM16m4BaX%2FMW1HO4zVbcTWGG6s3NUQl3YqgIJdY6HkYloVbqJSIflw%2B0%0AxoGquM8COxL77k7vfCU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1786446156/83ecf0a5b98eddc9ffc9694c50f7/353589ce-b678-441d-8909-71b45fa2d065?expires=1792613700&signature=951c75eb5862d2b5396f58a8b5ddf75fa4f1436cb2d272cb6bb6d75388012e24&req=dScvEM16m4BaX%2FMW1HO4zVbcTWGF4sfJUQl3YqgIJdbNnX%2Bsi8imd2w%2BwFV6%0AKKdrbD4TuSil9A4t47c%3D%0A) When Claude completes the task, it pushes the changes to a new branch in your GitHub repository. You receive a notification and can review the changes, then create a pull request directly from the interface. The pull request includes all of Claude's work, ready for your review and any additional changes you want to make. diff --git a/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md b/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md index 623d86ddf4..4b833f0d68 100644 --- a/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md +++ b/content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md @@ -40,7 +40,7 @@ When you first open the updated version of Claude Desktop, you'll see a prompt t Once enabled, double-tapping Option will open a text box where you can type your message and start a new chat. You can also click "New chat" to see your five most recent conversations. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1893088365/2ca4b782dda90abea1fe5f4150af/CleanShot+2025-12-18+at+13_14_30%402x.png?expires=1792599300&signature=ca992016460986d5e1588220c890bddd007a97ce4ad565d2b6260478f1c43172&req=dSguFcl2lYJZXPMW1HO4zWggDtxUr5WZRC8c%2FcM5c2LGKXg6%2FmJyLk1GsOMn%0Ai6F%2FN2DYbXRU5xWWMd4%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1893088365/2ca4b782dda90abea1fe5f4150af/CleanShot+2025-12-18+at+13_14_30%402x.png?expires=1792613700&signature=d24debe4c06f454d027b218924eecc3f0091a13aaf49dfbeb9e29bd7f8761eed&req=dSguFcl2lYJZXPMW1HO4zWggDtxXp5%2BdRC8c%2FcM5c2KWvXImx%2FgaHscAmu8F%0AzKWigh3swqrEQbSAYPY%3D%0A) ### Enable the voice shortcut (optional) diff --git a/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md b/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md index 0d7a9cfbfc..34ac8ec446 100644 --- a/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md +++ b/content/support/12883420-view-usage-analytics-for-team-and-enterprise-plans.md @@ -22,7 +22,7 @@ This page includes the following analytics: - Sessions in Cowork -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515895966/9f231a620f47d49e0ee648152189/848c1787-4eaa-4809-8fd2-1dbe2722560f?expires=1792599300&signature=caa0c7fe86dd73fb302246f85fbcdea89f7a8a3f1dee1623386c82913a672780&req=diUmE8F3mIhZX%2FMW1HO4zZL6wKR3koxyExEG4dCAGDamx40tzvOy4uGawOPI%0A993egoaHOmWZ6Dm4Gqs%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515895966/9f231a620f47d49e0ee648152189/848c1787-4eaa-4809-8fd2-1dbe2722560f?expires=1792613700&signature=e9b20c46a7e9e719f32134f43ed1a87632610c76bcadc4d941c9a7c715f1f043&req=diUmE8F3mIhZX%2FMW1HO4zZL6wKR0moZ2ExEG4dCAGDbvTSHoqGbHrGVU7BOy%0ACSNEYzNpNET3Y7HTBII%3D%0A) ### Who’s using Claude? @@ -34,7 +34,7 @@ This page includes the following analytics: Use the dropdown on the **Active members and assigned seats** chart to filter by product, including Claude Design. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896351/4d955858e6662c37489cc1470871/457cf159-8c2a-4403-ba22-cb92cb47e459?expires=1792599300&signature=c4963cf2f7fb8db63406916fbf56c7646484e19930cce6747db485f229eba2cf&req=diUmE8F3m4JaWPMW1HO4zYEqezWsS5msYqPRsgaNdTzcfY2zVqI1sAcwV8KF%0Aqs0x5SAXqyh7Z%2BO73mg%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896351/4d955858e6662c37489cc1470871/457cf159-8c2a-4403-ba22-cb92cb47e459?expires=1792613700&signature=bb30b6aba0c15cfa8c429491f5435816e646cf992f37878ef19e386b6e6b5134&req=diUmE8F3m4JaWPMW1HO4zYEqezWvQ5OoYqPRsgaNdTxHYJQYInCwSHXqI2Ug%0Ak2WyRiz16bBhiDUNI%2FU%3D%0A) ### How are they using Claude? @@ -48,9 +48,9 @@ Use the dropdown on the **Active members and assigned seats** chart to filter by - How agentic is their work? (beta) -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2583875713/e3cb3c329f3b643cb9a3809876b3/image.png?expires=1792599300&signature=4348059bb8cc255bf8aa951665db9f9302dd9b93d67719d34e3a3e3e8f3f4dba&req=diUvFcF5mIZeWvMW1HO4zciS3Krsk7doDFD6TO7tG4idyn%2BKAyBC1zdW%2BrhR%0AmN2f6ZsCzmRYbXxxMyY%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2583875713/e3cb3c329f3b643cb9a3809876b3/image.png?expires=1792613700&signature=2fb6191ecc5ce08b4e3b21f3f417626357641ccefb9eb96fb725c84cf654c7ec&req=diUvFcF5mIZeWvMW1HO4zciS3Krvm71sDFD6TO7tG4iROG%2F%2BlRw5B%2FVEWZzC%0AuSCsHAOqjwLcJGrHUGY%3D%0A) -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896563/abf008596ce5501297a609696362/fce5423c-4769-4b73-9a0a-c50f6407ebea?expires=1792599300&signature=63bdea415cbb53bf0d755295fd6954acab45d727e6c6b98b6cadb868f66e6d3d&req=diUmE8F3m4RZWvMW1HO4zR%2BID4VrtP70LS3kobW3ZgR4Lcwe17jdt9zHlq4K%0A3fVoYLqorXKHo7vGhEQ%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896563/abf008596ce5501297a609696362/fce5423c-4769-4b73-9a0a-c50f6407ebea?expires=1792613700&signature=1bd6c60f5f9361f25309e78e12e486995542d31f9b31edfc8b6d7887f222260b&req=diUmE8F3m4RZWvMW1HO4zR%2BID4VovPTwLS3kobW3ZgT%2BSUckTqcG2CSyKImL%0AiosHk0zPAioJFw3pVM0%3D%0A) ### What are the results? @@ -66,7 +66,7 @@ Use the dropdown on the **Active members and assigned seats** chart to filter by - Estimated time saved -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896943/dd415f03afe56ca38308ef987f86/189e8ebc-5594-4f4b-bd84-e3c11c824d5b?expires=1792599300&signature=9bea12f762a7c15a62c898070669e1eb1d4fb98a4f88a50929de50f19a425e67&req=diUmE8F3m4hbWvMW1HO4zfJThSY6oNVFiovaLYNN7Rmcjt7J3EQDRWB0Jccx%0AP4BiwBcu1opR2xjKur4%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896943/dd415f03afe56ca38308ef987f86/189e8ebc-5594-4f4b-bd84-e3c11c824d5b?expires=1792613700&signature=69e8e8de86004682743183bfd524f0b241b54c83ca3e95e8f93cd48435e44e1d&req=diUmE8F3m4hbWvMW1HO4zfJThSY5qN9BiovaLYNN7Rnp7CKqX0rwSzNxTOOQ%0A1g0IjVxHI0AcE2%2FBhTE%3D%0A) ### How much is Claude costing? @@ -82,9 +82,9 @@ This section includes the following analytics: - Spend by model (month-to-date, quarter-to-date, year-to-date, 1 year) -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896942/b403f2d216fc40b5195911020b8e/446b99f1-3187-4b79-b2be-9f17b1632ff8?expires=1792599300&signature=d444cd48ae66bb44f775fb1be0906eb7ba5ed6245efa9d160ea3c291bf28618a&req=diUmE8F3m4hbW%2FMW1HO4zYE%2BQtwH5TjeWbBLGZ4vBJUuGBSbX96BSf%2F7edmK%0AaDQUKjweyoQ%2Bs2xWcF0%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896942/b403f2d216fc40b5195911020b8e/446b99f1-3187-4b79-b2be-9f17b1632ff8?expires=1792613700&signature=84d4305daec68b5ffa196f029b4dd522b206c592ca36de96763256dc336c53a4&req=diUmE8F3m4hbW%2FMW1HO4zYE%2BQtwE7TLaWbBLGZ4vBJWnAnBi0Ws3sIHw7E3l%0Arwk%2FiDErNnk6SVjzVJ4%3D%0A) -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896941/2239ce38639df339b24d5af1cb50/f829bc2a-ee52-4135-9b13-09ef1b7d66d6?expires=1792599300&signature=7d9fb092640fca7343408dd69298d0b5005213ecb91a158bf3f568ef2db4a825&req=diUmE8F3m4hbWPMW1HO4zTz0N%2BgHLsBTC%2BtvTPa1I7HWq%2F42RPLuEmnzC0cv%0A1xBn%2BhFDlUO6%2FoEbGuE%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515896941/2239ce38639df339b24d5af1cb50/f829bc2a-ee52-4135-9b13-09ef1b7d66d6?expires=1792613700&signature=9df320b6dad12e29326b8a89cf8fc7113435ce1aa145f96ba1aa4bfada1b8502&req=diUmE8F3m4hbWPMW1HO4zTz0N%2BgEJspXC%2BtvTPa1I7ExMMEXi%2F6OZxTqR3N7%0AkNSA2wdz%2FWmDFGQMcmQ%3D%0A) **Note:** For a view of how spend limits are affecting your organization, you can also check the **Blocked by a spend limit** section at the top of **[Organization settings > Usage](https://claude.ai/admin-settings/usage)**. **Blocked by a spend limit** is built for usage-based Enterprise plans. Orgs without usage-based seats only see how many members are blocked or near their limit right now. Learn more about **[monitoring usage and spend on Enterprise plans](https://support.claude.com/en/articles/11526368-how-am-i-billed-for-my-enterprise-plan#h_ae17ec8236)**. @@ -162,7 +162,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to - Top members by chats -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515898793/405db0c492da11886c28a2b82731/71a55afc-1cef-4c50-b7e1-86775cb9a168?expires=1792599300&signature=bb2d00f11479f2448a08ecf28d7240b19fa63b10c80f41dd534d073bb649ec28&req=diUmE8F3lYZWWvMW1HO4zbhc8P%2BZaO0iTcfMEUwBBiWr7MdeT3L9PMIBM8bn%0AvKTDuN8AH%2FiIPs4QjpE%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515898793/405db0c492da11886c28a2b82731/71a55afc-1cef-4c50-b7e1-86775cb9a168?expires=1792613700&signature=1762c7f02d6b50fd8860504633d20128cd8586c16912b51be20aa2ec761a033c&req=diUmE8F3lYZWWvMW1HO4zbhc8P%2BaYOcmTcfMEUwBBiVcH193UtpmriSTJUFU%0AIzLeiRPZ59d%2BLC3jO3w%3D%0A) ### Projects @@ -174,7 +174,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to - Top members by project usage -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515899610/91d93108f0767e795fb9e488e882/71607d6d-dff1-4a13-a445-aa1d79850eed?expires=1792599300&signature=9f0b84e10ed3866b5860eb67ea3438d14acf6bba1c218cfbbaf7a01c6636d657&req=diUmE8F3lIdeWfMW1HO4zWhGoD6ckiqhExu5cYiHHN%2F9CLEMgfXMhRb0INa5%0AjUEAHVjPXznpyWPOaS8%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515899610/91d93108f0767e795fb9e488e882/71607d6d-dff1-4a13-a445-aa1d79850eed?expires=1792613700&signature=565665bdc28e73d21302ab027f04e2c73f088583f5d59b70bee985b7e36fdef9&req=diUmE8F3lIdeWfMW1HO4zWhGoD6fmiClExu5cYiHHN%2Fa3xyFP0dDtV1d%2Ftu3%0AOjpLXt4yKisRvmXmFQ4%3D%0A) ### Artifacts @@ -184,7 +184,7 @@ Navigate to **[Analytics > Claude Chat](https://claude.ai/analytics/usage)** to - Top 10 users by artifacts generated (month-to-date, quarter-to-date, year-to-date, 1 year) -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515899838/33d737f2357d6e485704669962ae/43faadc3-47da-4a93-bbb7-47a7983e7441?expires=1792599300&signature=6281c55c6ba9e73f0e54ba89a66e5e0f465523a9ceb99b3dc2e2f19f49c7b281&req=diUmE8F3lIlcUfMW1HO4zcSk47jXd%2BfDjHDogqK0V%2BxTFmI9z792EvzndlnB%0AYTCZO0CdYw6RCxZ9HMg%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515899838/33d737f2357d6e485704669962ae/43faadc3-47da-4a93-bbb7-47a7983e7441?expires=1792613700&signature=f07e6be54382b049869b3c500865fbc6ca0a100335e0f7fd1b856af01ee0dce6&req=diUmE8F3lIlcUfMW1HO4zcSk47jUf%2B3HjHDogqK0V%2BzDAGPFcuYR%2BQ5PxSxb%0ASChd0mH%2BXRa53GDkgHM%3D%0A) --- @@ -280,7 +280,7 @@ Navigate to **[Analytics > Cowork](https://claude.ai/analytics/cowork)** to view - Daily, weekly, and monthly active Cowork users -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515901489/8005693d55b7fefbfe9233258d39/106c22a0-3f47-47a6-abbd-4788dd70f218?expires=1792599300&signature=c4218d0ac449a891be8ea761b3bcdff5f47d29e5293a3f85d57c2f39e0f7c773&req=diUmE8B%2BnIVXUPMW1HO4zX7WE4q0VEirFSi1Z3SzLLsE4t8IKJbm9uiCSq9w%0AcmCwx1%2FpCzM0gRgS2%2FU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2515901489/8005693d55b7fefbfe9233258d39/106c22a0-3f47-47a6-abbd-4788dd70f218?expires=1792613700&signature=84aba14fb4a8f26e1a26d1a082e01d46536ef7fb22d4825f31706a074d3e8acc&req=diUmE8B%2BnIVXUPMW1HO4zX7WE4q3XEKvFSi1Z3SzLLv3%2B3S%2BxZ6HpZz4MFqU%0ApoYmGGn578lKRQOhmU4%3D%0A) **Note:** Cowork analytics are available alongside Chat and Claude Code data in the **[Analytics API](https://platform.claude.com/docs/en/manage-claude/analytics-api)**. @@ -296,7 +296,7 @@ Navigate to **[Analytics > Surveys](https://claude.ai/analytics/surveys)** to as On Enterprise plans with usage-based billing, when your admin turns on individual usage analytics, any member of the organization can see their own usage broken down by product, model, and skill, along with where they stand against any spend limits set for them. Individual usage analytics are available in **[Settings > Usage](https://claude.ai/settings/usage)**. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2533906328/1f5cd0a57def40676410f8f379b4/member-usage-30d-model.png?expires=1792599300&signature=39f408f28c84252e98301a8a8b086b93eccaee5d644a83e81a8f685d7399ae8c&req=diUkFcB%2Bm4JdUfMW1HO4zfveBq3AdeLZWGUKUw6QS49JOUOyOzD%2BmFlYTTi5%0AzHEsPnABzWolBvgx%2FNk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2533906328/1f5cd0a57def40676410f8f379b4/member-usage-30d-model.png?expires=1792613700&signature=c463e35edf1674b548a020d1e7308b55a7e457098160d53909ed3a63296ea680&req=diUkFcB%2Bm4JdUfMW1HO4zfveBq3DfejdWGUKUw6QS4%2FUxxAc%2FycXKPRiDi21%0AO%2FwdTuexLiB9Q1ZtBp4%3D%0A) --- diff --git a/content/support/12902446-claude-in-chrome-permissions-guide.md b/content/support/12902446-claude-in-chrome-permissions-guide.md index 6b32f0ba05..b38b5f6907 100644 --- a/content/support/12902446-claude-in-chrome-permissions-guide.md +++ b/content/support/12902446-claude-in-chrome-permissions-guide.md @@ -28,7 +28,7 @@ In "Manually approve," Claude checks with you before it acts. What that looks li Claude creates a plan from your prompt, which you can approve before Claude starts. The plan specifies which websites you're allowing Claude to access, as well as the approach it will follow: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1843320727/8d1c859ae9b8e0cdb536d024bf40/9bc3d239-8eb6-4bae-a032-a236f88ee606?expires=1792599300&signature=fc2f79334c0aa60040456a4c6379e2aaadfdfb226db964a3032ca6647ec01227&req=dSgjFcp8nYZdXvMW1HO4zYqyZMBI9Yu0gN0ADj5oqFDnQ1NWGYQKNIUxE0p8%0AkAS%2BKR36e9XdtvFOONo%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1843320727/8d1c859ae9b8e0cdb536d024bf40/9bc3d239-8eb6-4bae-a032-a236f88ee606?expires=1792613700&signature=fff823e4242d713f196e5634b8e2bc725911ca53d1764dd87f44f3b8d2d439d8&req=dSgjFcp8nYZdXvMW1HO4zYqyZMBL%2FYGwgN0ADj5oqFAwUMWdpql%2BYjZL0zjs%0AZK84XmVfop%2FfZM4F%2F48%3D%0A) Note that Claude will only use the websites listed in the plan, so you’ll need to manually approve any additional access requests. @@ -62,7 +62,7 @@ When you choose "Skip all approvals," Claude doesn't pause to ask, and nothing c There are some websites on which Claude requires approval for every action. If you navigate to one of these sites, a **New permissions required** prompt will appear in the extension side panel, Claude Cowork, or Claude Code where Claude will ask for permission before accessing the page or taking any action. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2604970825/d7b961271be69e7541b406df1efd/d845324e-6b4a-4f54-83b9-0bea86ec09c6?expires=1792599300&signature=ade516016f649f3e5cb3edf66e51ab8f71e53dc9e49a5cc37403e04d74ca8ca4&req=diYnEsB5nYldXPMW1HO4zZ3Nq2R1gSXv7A4lHPBihAX9djryWoptO2QcMtZg%0AFA%2BydyOoM90BsblDzuk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2604970825/d7b961271be69e7541b406df1efd/d845324e-6b4a-4f54-83b9-0bea86ec09c6?expires=1792613700&signature=db04bb4faf5948b5cb68e4419d64f1f3251ff9de917ee25fdf8f7dcaa3cbb281&req=diYnEsB5nYldXPMW1HO4zZ3Nq2R2iS%2Fr7A4lHPBihAV3WZ4zq9GquZGDJWXo%0AZGzcPKuN%2Fr20OhJPvcg%3D%0A) ### Permission options diff --git a/content/support/12997503-team-plan-billing-faqs.md b/content/support/12997503-team-plan-billing-faqs.md index 8e8c0cf781..cc8fe1dad3 100644 --- a/content/support/12997503-team-plan-billing-faqs.md +++ b/content/support/12997503-team-plan-billing-faqs.md @@ -18,7 +18,7 @@ Your organization's billing address determines where your invoices are sent. You If you want to use a name other than the one tied to your payment method, an organization Owner should check the "Use a different name on invoices" box when adding or updating your payment method in **[Organization settings > Billing](https://claude.ai/admin-settings/billing)**: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1922145253/f2e3d4e0fe43a2ea07e89244764c/image.png?expires=1792599300&signature=89d24b0e11540dad7f249807b56ef8ed741c76b080a2dcb7302cb01223293e6d&req=dSklFMh6mINaWvMW1HO4zRZTxVjEssLQKAqLF4ERnlXNPPEms79qS8cfvdGE%0AX48NVQFKdW%2Bc9P0lJAM%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1922145253/f2e3d4e0fe43a2ea07e89244764c/image.png?expires=1792613700&signature=ebe9de5fa97546b5512af289c86d0494aa4576aff79d2792f919849cec6945ab&req=dSklFMh6mINaWvMW1HO4zRZTxVjHusjUKAqLF4ERnlUpOpSzI6mYCrr9Ikec%0Ayygne%2Fgt%2B%2FRBTojlDks%3D%0A) ## When will I be billed? diff --git a/content/support/13132885-set-up-single-sign-on-sso.md b/content/support/13132885-set-up-single-sign-on-sso.md index c04ce1bb59..1d85a542d0 100644 --- a/content/support/13132885-set-up-single-sign-on-sso.md +++ b/content/support/13132885-set-up-single-sign-on-sso.md @@ -42,7 +42,7 @@ You can verify multiple domains for a single organization, but all domains must 3. Enter the domain(s) you want to verify in the **Update organization email domains** modal and click the “+” button: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2498843282/561d5ceb1c3a5df75bdfee8bfc3f/d2491145-362d-490b-bdcf-66a0a7656ddc?expires=1792599300&signature=ef49d58a8ef05e9ddc22baa5d655b7e22e1a681c14c81e86fb8513da7b8643e8&req=diQuHsF6noNXW%2FMW1HO4zSdmH348882Pe3H0OpmIzWH849NPsniSa57sARDF%0Av2qn%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2498843282/561d5ceb1c3a5df75bdfee8bfc3f/d2491145-362d-490b-bdcf-66a0a7656ddc?expires=1792613700&signature=5b855e22111f83a293a02997639800a344d3c015c0b8619bec3e97d778038f6d&req=diQuHsF6noNXW%2FMW1HO4zSdmH34%2F%2B8eLe3H0OpmIzWE1zCK7LrMpK%2FPax8It%0A7BHk%0A) 4. Click “Save” when you’re finished adding domains. @@ -50,7 +50,7 @@ You can verify multiple domains for a single organization, but all domains must 6. Enter your domain in the text box and click “Continue”: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2047042630/0617a562cd28a7ff0e607d66a30b/6bd08e1d-2b65-40ab-bc79-a257153854c1?expires=1792599300&signature=626043d521a14068090692b6f70dabe869f1a915654c76dda258df0e465834a3&req=diAjEcl6n4dcWfMW1HO4zWHctB%2BSntipyoyXAW0OlXror%2FVUt3LDJXEzuU36%0AmKGv%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2047042630/0617a562cd28a7ff0e607d66a30b/6bd08e1d-2b65-40ab-bc79-a257153854c1?expires=1792613700&signature=fb311caf9900004d5690e8c2b507370d6df6a7f8fe9853347fb501355f6244cd&req=diAjEcl6n4dcWfMW1HO4zWHctB%2BRltKtyoyXAW0OlXpqTIEDXK59O%2BmW2eXp%0Adpz2%0A) 7. The setup screen displays a TXT record. **Copy the full Value using the copy button**—it begins with `anthropic-domain-verification-` and is longer than what's visible in the box. In your DNS provider, add a TXT record to your domain and **Value** set to the copied string. The domain must match exactly what you entered in the previous step, including any subdomains. Add it alongside any existing TXT records; don't replace them. The value is case-sensitive, so paste it exactly. Please refer to your DNS provider's documentation on this topic. @@ -76,7 +76,7 @@ Clicking "Refresh" re-checks your DNS; it won't show Verified until the publishe If the record is correct and propagated but the status still shows Pending, contact Support. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2047044496/b8df54a0331784cc9ae8f00112aa/bf9609c1-dc93-4665-a066-4cae2fe4b002?expires=1792599300&signature=bec9e67622139dea84e8433a91bb0e9b99570aacf1678bb141def17a890fdbb4&req=diAjEcl6mYVWX%2FMW1HO4zVjmWCsFZn26PM2D8ZcdgrhC7iIeV%2FvcDvMmOit0%0AMYwDyJcwE%2FcYBTboUY0%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2047044496/b8df54a0331784cc9ae8f00112aa/bf9609c1-dc93-4665-a066-4cae2fe4b002?expires=1792613700&signature=507dec81e414bbe47f5ad3b38163be64b22accfa0d4d91106f1255942c8fa339&req=diAjEcl6mYVWX%2FMW1HO4zVjmWCsGbne%2BPM2D8ZcdgriGoUsyVZkj6jfRPPmd%0AlcVXGNBq%2BwOb1SxAj4k%3D%0A) **Note:** Once your domain is verified, you'll see a **Restrict organization creation** toggle under **Security** on the Organization and access organization settings page. Enable this if you want to prevent users from creating new Claude or Console organizations—including personal accounts—using your verified domains. @@ -116,7 +116,7 @@ For IdP-specific setup instructions, see: You can now choose to toggle on **Require SSO for Console** and/or **Require SSO for Claude,** on the **Organization and access** page, under the **Authentication** section: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312690200/bd2403586d4f6651ccd79e2a45af/b9f8d7ce-0def-49d9-bfb2-3a14352d7214?expires=1792599300&signature=9ed29d5b3a2141a15cadcb89078ddf49de5c6e750ced9e8b1dbf24e5ae92c356&req=diMmFM93nYNfWfMW1HO4zdAICg2kC3UJItXtKivx6ZG3w2%2FQIbA6vYdp3sWT%0AKFnG5H%2FFPyNjctGb4dI%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312690200/bd2403586d4f6651ccd79e2a45af/b9f8d7ce-0def-49d9-bfb2-3a14352d7214?expires=1792613700&signature=359fc2c476e03c7a04bb566901bafd737b0f829e2ef87f3c67815346073b78e1&req=diMmFM93nYNfWfMW1HO4zdAICg2nA38NItXtKivx6ZFZNjZu59GziMa1U1kg%0AF7L%2F6fq1AlPgEhSE%2BrM%3D%0A) When SSO is required, users must use the “Continue with SSO” option to log in to their Claude/Console accounts. When SSO is not required, they will have the option to choose “Continue with SSO” or “Continue with email.” diff --git a/content/support/13133195-set-up-jit-or-scim-provisioning.md b/content/support/13133195-set-up-jit-or-scim-provisioning.md index 698e66fe00..87dccb6dac 100644 --- a/content/support/13133195-set-up-jit-or-scim-provisioning.md +++ b/content/support/13133195-set-up-jit-or-scim-provisioning.md @@ -40,7 +40,7 @@ Use this table to help decide which provisioning mode is right for your organiza Both JIT and SCIM can be combined with **Enable group mappings** to control role or seat tier assignment based on IdP group membership. If you select either of these options for your provisioning mode, **Enable group mappings** will appear within the **User provisioning** section: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312706099/35d5d3ec149880a96bb7acec59f6/a4cfce55-86bf-40b0-b455-c8f412d48e9e?expires=1792599300&signature=2bbaa43d12dbe19c5bd7d241ae096869dd84c98344d7c057397185f32d86bab3&req=diMmFM5%2Bm4FWUPMW1HO4zXBDQqlRBFN1xFMG%2BIEvQSc57GPPZDG8qZxXLykP%0AQA3jW8kqQOc6MvtrJ7E%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312706099/35d5d3ec149880a96bb7acec59f6/a4cfce55-86bf-40b0-b455-c8f412d48e9e?expires=1792613700&signature=b794ffa95b524a002ed38ff75d9a4690e34ea0e188483382b0b7f24380267040&req=diMmFM5%2Bm4FWUPMW1HO4zXBDQqlSDFlxxFMG%2BIEvQSev8NO0s1kCazAMnr7m%0AZOAsk4fDObCgLcMglNE%3D%0A) **Important:** Group mappings set a user’s role type and seat tier only. Users with the Custom role get their permissions from groups in Claude, and those groups sync from your IdP only when your provisioning mode is SCIM directory sync. With JIT, you need to create groups and add users to them manually in **[Organization settings > Groups](https://claude.ai/admin-settings/groups)**. If you map an IdP group to the Custom role under JIT without doing this, those users have no permissions when they log in. Learn more about **[managing groups on Enterprise plans](https://support.claude.com/en/articles/13799932)**. @@ -136,7 +136,7 @@ Learn more about **[setting up role-based permissions on Enterprise plans](https 4. Toggle **Enable group mappings** on (if it’s not already): - ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312714635/b57870b51e6511c8293637bceee2/da1ceabc-b6bc-451b-9cda-24ff6aa90d02?expires=1792599300&signature=81d34f1e6bf6273ddf40f4134df90f535da6da9bad139f26e4a5bcd11f9fe542&req=diMmFM5%2FmYdcXPMW1HO4zeBEb8fdnvNLyb72rapuHpPF0UdiMv2eYebbNlAt%0Aqnsa%0A) + ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312714635/b57870b51e6511c8293637bceee2/da1ceabc-b6bc-451b-9cda-24ff6aa90d02?expires=1792613700&signature=11c0e7ffa351bfa0bf4c7af63927aea466f4aa75eb23e5e009c89f7b81b170af&req=diMmFM5%2FmYdcXPMW1HO4zeBEb8felvlPyb72rapuHpNdZo3SG9Z1faLjVQWd%0AmuwM%0A) 5. In the **Enable group mappings** section, click “Add” next to each role and select the corresponding group from your IdP in the dropdown. @@ -188,7 +188,7 @@ Verify you have enough seats purchased and available to add members to your org. 4. **For SCIM:** Click "Sync" to prompt an immediate sync, or wait for the automatic sync cycle: - ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312717421/c97fce49ad17d4660880a05fbaaf/59fbfa2a-1072-4662-8ca5-102970d5a795?expires=1792599300&signature=8777ae58794b69c24cf0ea592d8b440e97ef85fff3a8d1c21997d2c2f5eb50ee&req=diMmFM5%2FmoVdWPMW1HO4zZ9Lal%2BoEMPB5hujYvMis4d0DF4s1mcY82LNuDO6%0AYYaQ%0A) + ![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312717421/c97fce49ad17d4660880a05fbaaf/59fbfa2a-1072-4662-8ca5-102970d5a795?expires=1792613700&signature=869685e3b2967ce0ef4601c360558060cac3cf7e5678ecfbe864458fa7440cbd&req=diMmFM5%2FmoVdWPMW1HO4zZ9Lal%2BrGMnF5hujYvMis4cvp9L1EgEM616bv1yr%0AX5Kf%0A) ### Users mapped to the Custom role can't access anything after logging in diff --git a/content/support/13163631-configuring-session-security-settings.md b/content/support/13163631-configuring-session-security-settings.md index e35c8752aa..dda7a3c36c 100644 --- a/content/support/13163631-configuring-session-security-settings.md +++ b/content/support/13163631-configuring-session-security-settings.md @@ -18,7 +18,7 @@ Session duration controls allow Enterprise and Console Admins to set a maximum s 5. Confirm your selection by clicking “Enable.” -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469436/1725e63ea1a2615948faecf4ec73/9bd276a1-7329-414d-87a1-d04dac93fff7?expires=1792599300&signature=6aa793bb630e1f62e14425457f310aa9aeef85ae6f997cd5e76947ed543798f3&req=dSgvHs14lIVcX%2FMW1HO4zQNx6uAiSlNTg%2F6XaftFnjyhBEQjnPZQfnnoHcIG%0AFxzvWVh8NhVCYLzOvqc%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469436/1725e63ea1a2615948faecf4ec73/9bd276a1-7329-414d-87a1-d04dac93fff7?expires=1792613700&signature=026f6ccaba6a1ed4b6d1412afacc12585a4577cbedc9ed8d65206aeeb3b9b776&req=dSgvHs14lIVcX%2FMW1HO4zQNx6uAhQllXg%2F6XaftFnjyzHTC5vWpV0ZYdnoqy%0AmyFTqzWZSu0uIWM7ZQQ%3D%0A) ### For Console Admins @@ -32,7 +32,7 @@ Session duration controls allow Enterprise and Console Admins to set a maximum s 5. Confirm your selection by clicking “Enable.” -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469435/7a766bbe02e61c7d8f05deb5b8f0/b0bda400-47c6-43dd-9907-131ebe180b36?expires=1792599300&signature=97aa28b289a78f7250c53f0663a2b0faf90039ead72203dba5d15efc2cc1c138&req=dSgvHs14lIVcXPMW1HO4zWzx2bszLnYiXZ5D7eVpMteP6c6dHjJTTDoFoRyP%0Am7FlwPmW6mllwsRRP3Y%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469435/7a766bbe02e61c7d8f05deb5b8f0/b0bda400-47c6-43dd-9907-131ebe180b36?expires=1792613700&signature=a24b1bb8ec0ddcee8e1c3a1c5931b768d8c9bd57abe31d9dd72ae3d945643dd1&req=dSgvHs14lIVcXPMW1HO4zWzx2bswJnwmXZ5D7eVpMtdUWPFeucMs97eXjVGz%0A851%2FEEvIEdn52aGcmc8%3D%0A) ### What happens after enabling shortened session length? @@ -50,7 +50,7 @@ You can change the session duration at any time by selecting a new value from th - Sessions scheduled to expire beyond the new duration will have their expiration shortened accordingly. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469437/46ac5bc55484ca01556d87a5ade7/b01a7651-ad65-4b32-93ff-16dbc9ca97c0?expires=1792599300&signature=2be5634f9ddccb570490164508ac711b9ba74e9d91f34399b9ea65a5ac607b2d&req=dSgvHs14lIVcXvMW1HO4zZ7mW8qe7jCgA00cbyPOLDWTc6W5MEvGDAYx86Nu%0AgSrttcSO4q6VXGMy7VM%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1888469437/46ac5bc55484ca01556d87a5ade7/b01a7651-ad65-4b32-93ff-16dbc9ca97c0?expires=1792613700&signature=5a3c5094b7259bf42ec5be6fddc9858a85fa2a77f136ebaa993bf2bbb364d333&req=dSgvHs14lIVcXvMW1HO4zZ7mW8qd5jqkA00cbyPOLDUwzjr5Ak7La9Es5ZJS%0A%2B3KRFdXOe3CxZprnKfA%3D%0A) ## Disabling session length settings diff --git a/content/support/13189465-log-in-to-your-claude-account.md b/content/support/13189465-log-in-to-your-claude-account.md index 730e4b1d94..83c7a806f3 100644 --- a/content/support/13189465-log-in-to-your-claude-account.md +++ b/content/support/13189465-log-in-to-your-claude-account.md @@ -2,7 +2,7 @@ When you open Claude on a web browser ([claude.ai](https://claude.ai)), the desktop app, or a mobile app, you will see two different options for logging in to your Claude account. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1893216804/f2209c3ec6cf4fc2e803d13bbc9d/40520c9e-ff82-4a7c-adca-5a064fe18d8c?expires=1792599300&signature=4853be53d63303256fae544c5394896fbb98d7dd753edb9242347d4b9f4b7425&req=dSguFct%2Fm4lfXfMW1HO4zXg5B4CJ6hu3zWhrqpWiTMnuWtCk7NZztxEBcUKF%0AMe180xROsCSUwl9jURY%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1893216804/f2209c3ec6cf4fc2e803d13bbc9d/40520c9e-ff82-4a7c-adca-5a064fe18d8c?expires=1792613700&signature=24f518b9fc20eafc138bb9ef289c7b5d365c886faedc3899df2bd32caddbd8de&req=dSguFct%2Fm4lfXfMW1HO4zXg5B4CK4hGzzWhrqpWiTMnU6PySa9lPGa8lgj%2FE%0ADo%2Bqo0jcdEglovnrTsk%3D%0A) ## Continue with Google diff --git a/content/support/13325567-account-management-faqs.md b/content/support/13325567-account-management-faqs.md index 87aeb14050..5db8c259ec 100644 --- a/content/support/13325567-account-management-faqs.md +++ b/content/support/13325567-account-management-faqs.md @@ -44,6 +44,6 @@ The email domain that was used to create your Team or Enterprise plan organizati Owners can remove domains by opening up the same modal and clicking the trash can icon to the right of the domain: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2053873852/1cbccea3b7067e03205f2ff8546b/CleanShot+2026-02-11+at+11_16_07%402x.png?expires=1792599300&signature=2620dc381c8ece94a04f7f5201bc6d93cb9cf91a906fde6b7cc79a0de42e47fa&req=diAiFcF5nolaW%2FMW1HO4zUrhF%2BmdYAEZkeFUnrkrQZjoAn%2FCRISSaRXTuN3n%0AjKR3Wbfg4mYvdTogJOI%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2053873852/1cbccea3b7067e03205f2ff8546b/CleanShot+2026-02-11+at+11_16_07%402x.png?expires=1792613700&signature=6ea1f553a2877135a5e6f6cfa434b813f175efeadc6f249708dc51c65cb8255e&req=diAiFcF5nolaW%2FMW1HO4zUrhF%2BmeaAsdkeFUnrkrQZhnJORmC3WhZ%2F4s6P5C%0AQET%2FSO4TF2NaqHr1kcM%3D%0A) While the account creator must use a business email address, you can add public domains like @gmail.com, @yahoo.com, and @hotmail.com as allowed domains for other members of your organization. \ No newline at end of file diff --git a/content/support/13345190-get-started-with-claude-cowork.md b/content/support/13345190-get-started-with-claude-cowork.md index 142cfa760a..f00a1d6cab 100644 --- a/content/support/13345190-get-started-with-claude-cowork.md +++ b/content/support/13345190-get-started-with-claude-cowork.md @@ -182,7 +182,7 @@ To set global instructions: 3. Type your instructions in the text box and click "Save": -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2525926874/15324ac4155d7802272e8bdef04b/ec66cd09-a4db-4f1d-8f30-226c9d126333?expires=1792599300&signature=84c4bca59e8d8b00df753ef83af7a33aa683ab171c335d98c01012522d8b57a1&req=diUlE8B8m4lYXfMW1HO4zcDl69rpP1iz8iWjaktE943MehvlhjstXg%2Bp6cY3%0AXK0sp5A6IWDQ2HPb39g%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2525926874/15324ac4155d7802272e8bdef04b/ec66cd09-a4db-4f1d-8f30-226c9d126333?expires=1792613700&signature=683b8a3f0780c4bef35e4247c1858bed5d11270a6dcc5b817d79197ee7c8b346&req=diUlE8B8m4lYXfMW1HO4zcDl69rqN1K38iWjaktE941ocsf3znbtpZ44Y1T0%0AolnRR9ARoGTfiuNZW24%3D%0A) ### Folder instructions diff --git a/content/support/13371040-log-in-to-your-console-account.md b/content/support/13371040-log-in-to-your-console-account.md index 952cdb49da..476e80120b 100644 --- a/content/support/13371040-log-in-to-your-console-account.md +++ b/content/support/13371040-log-in-to-your-console-account.md @@ -2,7 +2,7 @@ When you navigate to the **[Claude Console](https://platform.claude.com)**, you will see two different options for logging in to your Console account. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1935026646/d90d1613a3dbe763fef5abb96e3c/image.png?expires=1792599300&signature=5a9a0b0a3beab2a0bf3f9c26c4668e07bfc275f21e9662e58a0877e129c20fd2&req=dSkkE8l8m4dbX%2FMW1HO4zcrI5ovpqYkO8vUNcPt4%2B73iaz4ZmE33LzIDZDbn%0Ap4lJ4Oo6%2F8SBsF%2FC9CI%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/1935026646/d90d1613a3dbe763fef5abb96e3c/image.png?expires=1792613700&signature=592a81a3785e276bb1503fbd9cc3020bcd7b1af6e5aa6b2ce6bb5da858792dd4&req=dSkkE8l8m4dbX%2FMW1HO4zcrI5ovqoYMK8vUNcPt4%2B71w82wUwjU0wA4tAGEr%0AN7f3B4UO%2B5UUo9Grf5M%3D%0A) ## Continue with Google diff --git a/content/support/13641943-visual-and-interactive-content.md b/content/support/13641943-visual-and-interactive-content.md index 587d545615..14b30981b7 100644 --- a/content/support/13641943-visual-and-interactive-content.md +++ b/content/support/13641943-visual-and-interactive-content.md @@ -18,7 +18,7 @@ Claude can show current weather conditions and forecasts when you ask about the Claude automatically displays temperatures in Fahrenheit for US locations and Celsius for everywhere else. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544927/3a9c695b24df387ecdd766ad308c/8be9f393-dcb0-4ff8-89e8-5fa47bedaa38?expires=1792599300&signature=ff027e5c2a4ad3dce7fb2f67e63e865b5bb9064f1dc2335990ba66fb010246cb&req=diAjFsx6mYhdXvMW1HO4zXlB7Dy%2F3BGLdgndksVD5R16MuLBgOeSyFikk6P6%0AtLru7FR1OXJ53RvEdBs%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544927/3a9c695b24df387ecdd766ad308c/8be9f393-dcb0-4ff8-89e8-5fa47bedaa38?expires=1792613700&signature=cdf7f4024053b20c6220b6a34a638006745592a7ab68440fccfb144de9542f5f&req=diAjFsx6mYhdXvMW1HO4zXlB7Dy81BuPdgndksVD5R1dTDYS1KoR2iIoeZ6K%0AR7jccXeopKqmFQwIgLI%3D%0A) Weather is powered by Google Maps (). @@ -28,7 +28,7 @@ When you ask about recipes, Claude can display formatted recipe cards that are e **Note:** Visual recipe cards are available on web and desktop only. On mobile, Claude provides recipe information as text in the conversation. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544929/12f4c51eda7779d65d3ea2c7ab16/d0f4a314-cff8-421a-b401-10c2bf50374e?expires=1792599300&signature=739148baf0221dd5f4091cace5f9b7fb018731f94a123debd32cef2decbae142&req=diAjFsx6mYhdUPMW1HO4zUQperIQ212UrIPm%2FImZVg3NpFQBEVIQiHQXr%2FGP%0AltSBy%2FNfYbpVuLDWpkE%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544929/12f4c51eda7779d65d3ea2c7ab16/d0f4a314-cff8-421a-b401-10c2bf50374e?expires=1792613700&signature=f6a5844d26f71180d42a2aa136144d4d677d3ea250bd5a9acb5ea74d3ea81d61&req=diAjFsx6mYhdUPMW1HO4zUQperIT01eQrIPm%2FImZVg2kidYliucyfyT76pWt%0AtIRbepupH%2FU%2FPQCi37k%3D%0A) ### Custom visuals @@ -76,7 +76,7 @@ For example, if you ask Claude to help you plan a trip, it might ask you to: This content appears at the bottom of the chat. You can still type a response if you prefer. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544930/9ad066e137d11e4b559b0217e12d/9bf30d2d-1715-42b3-9da5-2a9298f41f08?expires=1792599300&signature=829443100f5a371af25e1bc8f815c0dcb3677162fa8a8cec1fb2864d1d09984d&req=diAjFsx6mYhcWfMW1HO4zWmF5ve7YBehx4wz0C7CTAKwH4Fdd95M77yCO4vL%0AUNv%2F0nRR7otnL%2FhrsUg%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2040544930/9ad066e137d11e4b559b0217e12d/9bf30d2d-1715-42b3-9da5-2a9298f41f08?expires=1792613700&signature=b1443c34d32053aebfa7403f9c0856464fd7b01d84885e52ab192e1cafc8b028&req=diAjFsx6mYhcWfMW1HO4zWmF5ve4aB2lx4wz0C7CTAKJ%2FcIifWkDFEPXGzWo%0AeXqI6vdHROUJZUrlvgQ%3D%0A) --- diff --git a/content/support/13837440-use-plugins-in-claude.md b/content/support/13837440-use-plugins-in-claude.md index 9ee373309a..2f05f35fd4 100644 --- a/content/support/13837440-use-plugins-in-claude.md +++ b/content/support/13837440-use-plugins-in-claude.md @@ -58,7 +58,7 @@ In Cowork, open the "Cowork" tab first, then open **Customize**. You can also upload a custom plugin file if you built one yourself. On Team and Enterprise plans, a colleague can share a plugin with you directly instead of sending you the file. See **[Use a plugin shared with you](#h_ef985546b4)** below. Plugins you add in Claude on the web or in Claude Desktop are saved to your account, not to your computer, so they follow you to chat, Cowork, and Claude Code. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2100409211/fc01614dde1a616fa31ffaa9cb04/47bacf5b-a810-45b5-a468-9769f1a58ef8?expires=1792599300&signature=5a548548c2fad51124c1503247e4d0819a4ef56cb19b6675c1aaca0fe12666db&req=diEnFs1%2BlINeWPMW1HO4zZF3IxfYOvxWxakFVfq5Wwx8E%2B2POwJaiZVaS8NP%0AvJlU21I9bl%2F%2BgDyh59k%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2100409211/fc01614dde1a616fa31ffaa9cb04/47bacf5b-a810-45b5-a468-9769f1a58ef8?expires=1792613700&signature=0f3e579311ab7693729d505d7b3fc65d5cceaee797f3b8127d4d80a88db54631&req=diEnFs1%2BlINeWPMW1HO4zZF3IxfbMvZSxakFVfq5WwwIo%2B%2FxhQM7mo6KMUxl%0A8TLGfCac1QHap6n%2F2mE%3D%0A) If you're on the Enterprise plan and your organization has skill scanning turned on, plugins are checked for malicious content when they're installed or updated. A plugin with malicious content is blocked, and one that may carry risk shows a caution banner. Learn more about **[skill and plugin scanning](https://support.claude.com/en/articles/15927065)**. @@ -68,7 +68,7 @@ If you're on the Enterprise plan and your organization has skill scanning turned Each plugin you add brings skills and commands you can use while working with Claude. Type "/" or click the "+" button to see the available skills from your plugins, in chat and in Cowork. In Cowork, you can also run a plugin's command by typing `/plugin-name:command`. Click any skill to see its details. -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2157396844/4a790e10f5b88df770783df1d7e9/image.png?expires=1792599300&signature=2611c3564ccf8acdec107679edbadd95bd6dd860b0747e8ec0357c7d4c3c9c52&req=diEiEcp3m4lbXfMW1HO4zf4NBfT5ikmXmKUxugP2BQuvwR%2BCgIepr61flSGV%0A5XjHNiXNlEV4o%2Bif5TY%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2157396844/4a790e10f5b88df770783df1d7e9/image.png?expires=1792613700&signature=328c7aaa177f4571130321ea22f1d0d16668afd4d326c15f05c56222a47d6ad6&req=diEiEcp3m4lbXfMW1HO4zf4NBfT6gkOTmKUxugP2BQueolu4nUxKr5W6EjHa%0Aipj2kDkVdkO1qpgmNMk%3D%0A) --- diff --git a/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md b/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md index f5597e3ff2..775befc2d7 100644 --- a/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md +++ b/content/support/13947068-assign-tasks-from-anywhere-in-claude-cowork.md @@ -52,11 +52,11 @@ Follow these steps to get started: 5. You’ll land on a page describing the functionality. Click “Get started”: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2169954086/419674f781edb2977b93cce062b4/93b1893c-d79a-4eb6-b2f1-2fe3e043bd90?expires=1792599300&signature=75cf4aa3832a34adcb01202c2bb015178c1b1e2aa9b2717402ee64575130d034&req=diEhH8B7mYFXX%2FMW1HO4zSZP05COHAf8B32drIe5EDmBN%2BDSzD67RL8sicvL%0Ak%2FCg%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2169954086/419674f781edb2977b93cce062b4/93b1893c-d79a-4eb6-b2f1-2fe3e043bd90?expires=1792613700&signature=acff2e71b321bc212cd97e1583e2d42fe83159c0b6dca702a653d8501eae31b8&req=diEhH8B7mYFXX%2FMW1HO4zSZP05CNFA34B32drIe5EDm5mUsA0YWC%2FhgwX19P%0AgO5D%0A) 6. On the next screen, you can give Claude access to your files and keep your computer awake by toggling those on: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2169955082/de4053ee0eab8fcb9263584bb171/d39b77da-1a69-4682-9fdb-7ed488f236b0?expires=1792599300&signature=00fca92fb8917389022be36b6075faa1d8524739d9ce6a0d982fbfa76aaafdf8&req=diEhH8B7mIFXW%2FMW1HO4zaZWstidVAgdepuGRb1rD3Kx9Kv2DMLvTO3DuU7f%0Auj25%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2169955082/de4053ee0eab8fcb9263584bb171/d39b77da-1a69-4682-9fdb-7ed488f236b0?expires=1792613700&signature=472e8bd1c6ce846030cde3b5ef241bfcebbb69a3eabaecf53a5f702fd54ca4da&req=diEhH8B7mIFXW%2FMW1HO4zaZWstieXAIZepuGRb1rD3JN%2FY9LgN935C0wGMOZ%0AYe%2FM%0A) 7. Click “Finish setup.” diff --git a/content/support/14116274-organize-your-tasks-with-projects-in-claude-cowork.md b/content/support/14116274-organize-your-tasks-with-projects-in-claude-cowork.md index 7a3cd04bda..9187a0ab50 100644 --- a/content/support/14116274-organize-your-tasks-with-projects-in-claude-cowork.md +++ b/content/support/14116274-organize-your-tasks-with-projects-in-claude-cowork.md @@ -24,23 +24,23 @@ Cowork is available for paid plans (Pro, Max, Team, Enterprise) on: Find **Projects** in the left navigation panel and click the “+” button to see the three different ways to create a project: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183720240/6f6ef438913391703598d86d606c/CleanShot+2026-03-20+at+09_11_43.png?expires=1792599300&signature=eac09b5cc778b4ee9393d188aa1253d049bbf603ae7c28d8648f32888433c134&req=diEvFc58nYNbWfMW1HO4zcOgige%2F2CF2ZwSvwegvtgysehD07A8foXtON5tW%0A7MxHM9CVcKRSBnSjU6w%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183720240/6f6ef438913391703598d86d606c/CleanShot+2026-03-20+at+09_11_43.png?expires=1792613700&signature=02dc5b98321977031461be7372201ef2e1a38ff0a836813e9b9e386b5166cbff&req=diEvFc58nYNbWfMW1HO4zcOgige80CtyZwSvwegvtgwYAnKKXoSoxJIUFcJ6%0A7GZwaVOmwW%2FzWxMElzk%3D%0A) ### Start from scratch Selecting “Start from scratch” allows you to set up a new folder with instructions and files: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177090014/07832b50003cf7fd3b4e9c7c448b/3385d9b8-c3e7-42b9-ae3f-4d213baa53a7?expires=1792599300&signature=ad8e6ffc9b0502a6b2186f2f2315e134ddbb3040b9c23be7ad230d909db00387&req=diEgEcl3nYFeXfMW1HO4zZCoQo9AR3yVvb0suCMAnj0cmpGAbwcqcAMR4hMQ%0Asd4AOWPXbNZgfKUh4KQ%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177090014/07832b50003cf7fd3b4e9c7c448b/3385d9b8-c3e7-42b9-ae3f-4d213baa53a7?expires=1792613700&signature=c3a8134b9571bef51ba40dd447946f05a0dd9a8ad5a885b8070b20479772ca40&req=diEgEcl3nYFeXfMW1HO4zZCoQo9DT3aRvb0suCMAnj0O4Rkiip7wt0hjsILI%0AG237ehse1dEq6af5QiY%3D%0A) ### Import from a Claude project After selecting “Import from project,” you’ll see a “Search projects in Chat…” field: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183717962/acdc11bcc825ae76a13f508365bc/CleanShot+2026-03-20+at+09_12_08.png?expires=1792599300&signature=f79a1e05e0c2db2870a4d1ed31f66802f650f55377460279ba63169e51cba641&req=diEvFc5%2FmohZW%2FMW1HO4zQQ7UWFYw5EcjggUT7FIJz%2FSHSKxQrRTdBOdc4e0%0A8qg%2BfhRpbtoHZxaN%2Bdk%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183717962/acdc11bcc825ae76a13f508365bc/CleanShot+2026-03-20+at+09_12_08.png?expires=1792613700&signature=4a92f0322b932849a82b6a142d1c3bcf072bce6e51f1a63731c9db2f7b11aefe&req=diEvFc5%2FmohZW%2FMW1HO4zQQ7UWFby5sYjggUT7FIJz%2BoBG%2Bcka%2FOG3SFcXhK%0AYgTVli6ECcJXOeTdaMk%3D%0A) Clicking into the field will display a drop-down showing your recent projects, but you can also use it to search all your projects. After you select a chat project (bulk upload is not supported), you can name the new Cowork project and choose where to save it on your computer: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183727973/7a25430123d9e13e7c3cdd411f70/CleanShot+2026-03-20+at+09_13_41.png?expires=1792599300&signature=5bcd759dea41a44f9ac4fe605030259bb5d544ccc7c0eff93430ffa6f1d44db5&req=diEvFc58mohYWvMW1HO4zU%2FKAyFD9SrPI7f%2FdY0VL6iB4%2F9idBF4EC7gty62%0AciRqDkTcSKekk5L8LPc%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2183727973/7a25430123d9e13e7c3cdd411f70/CleanShot+2026-03-20+at+09_13_41.png?expires=1792613700&signature=9c43cd30a1f0ce10750283a6e0d88b3c9a5e0143cacc19aa4ed0c5d5151245c5&req=diEvFc58mohYWvMW1HO4zU%2FKAyFA%2FSDLI7f%2FdY0VL6hSdX7t6Fq2cosqlmOb%0AYcUuc4xijV3S373a8K8%3D%0A) Clicking “Create” will transfer the files and instructions from your existing Claude project and create a new Cowork project. @@ -48,11 +48,11 @@ Clicking “Create” will transfer the files and instructions from your existin If you select “Use an existing folder,” you’ll be prompted to pick a file to use as context for the new Cowork project: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177087935/2f0052dae601d0b7fecdc029e1c3/2e3ca9e7-23b1-436e-bbdb-edcd31c41f15?expires=1792599300&signature=8dd246f26c6220a7a409ebc78bf77ec106e73454a937d672a68b2c8a92274f2d&req=diEgEcl2mohcXPMW1HO4zejrnjTTHCpcuv8e2Xj2xOXFggWcbTz%2BRHY%2B5fJn%0AE5Q%2FymO4tU1JzjKcj4Q%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177087935/2f0052dae601d0b7fecdc029e1c3/2e3ca9e7-23b1-436e-bbdb-edcd31c41f15?expires=1792613700&signature=ef541978ac33e1eb63f1e03ed5b317d5287d1e89d5ae8693d8ba874d8cbfa12b&req=diEgEcl2mohcXPMW1HO4zejrnjTQFCBYuv8e2Xj2xOUU%2FOD9MI%2BfrKZ5n9dz%0AgvQ16DxLGOkziRYMh0g%3D%0A) After selecting a folder, you can name the new Cowork project, choose where to save it on your computer, add instructions, and attach any additional files. Click “Create” to start using your new project: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177087937/f59dbe3fc28448a9597ea097cb4d/96a59acb-4054-4b4b-a208-751f9711f535?expires=1792599300&signature=aecfb6242a45c752c75328cdc1cc0c72957a341fe81a4248c4878193e01ccb6d&req=diEgEcl2mohcXvMW1HO4zUq4VuGxiqs5MfnqHouW6MIMuseg3z%2BR0aex6CsA%0A8v0uigEDQNFsNwLi2sU%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2177087937/f59dbe3fc28448a9597ea097cb4d/96a59acb-4054-4b4b-a208-751f9711f535?expires=1792613700&signature=e99d19a381d6a8dd8ba3b26fbbd52bc3bcfa29a7b24cc27d410c6e52826a89dd&req=diEgEcl2mohcXvMW1HO4zUq4VuGygqE9MfnqHouW6MLKzKTlHxnNrV0GvSrJ%0ASBLbgi0uXYaPmfjAWO8%3D%0A) --- diff --git a/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md b/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md index 86cacf9cdb..eaf87b47ff 100644 --- a/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md +++ b/content/support/14499648-how-scim-sync-works-for-enterprise-organizations.md @@ -50,7 +50,7 @@ You can trigger a manual sync from two places in your admin settings. 2. Click "Check for updates" under **SCIM sync**: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312613548/44cd5970ee3c3b2c7f8dcd592d71/image+%2824%29.png?expires=1792599300&signature=6e613c7a86d32e0b5c031077b90c4b22dacc659db27d092fe7e5732423c84bb1&req=diMmFM9%2FnoRbUfMW1HO4zW4gbTeoPMS3rgfl7PnOiukh6wc%2FZU5KGKtgGFdD%0AS28l%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312613548/44cd5970ee3c3b2c7f8dcd592d71/image+%2824%29.png?expires=1792613700&signature=bf83f8580e872b6a78f525d64961238a3d0260f84692b6db369bf6cbd58537ee&req=diMmFM9%2FnoRbUfMW1HO4zW4gbTerNM6zrgfl7PnOiumCUjuyXE8qUxIMvubg%0Axw17%0A) 3. Select whether to sync members, groups, or both. @@ -62,7 +62,7 @@ You can trigger a manual sync from two places in your admin settings. 3. Select whether to sync members, groups, or both: -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312608119/e4b0ef4f309f3c4eac8311a6ef47/image.png?expires=1792599300&signature=f41a5508eacc8b742c0dec138003b74d571a4b478a8ddc6a0888b61490a8b723&req=diMmFM9%2BlYBeUPMW1HO4zX%2F4f7j1wjIc43OpyTHzM9SnPfplFrxIrm9c8EgG%0A%2FtN7%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2312608119/e4b0ef4f309f3c4eac8311a6ef47/image.png?expires=1792613700&signature=8be45b674624867d609d9f17e4319d99addc163458f929e066d1333be2f6e232&req=diMmFM9%2BlYBeUPMW1HO4zX%2F4f7j2yjgY43OpyTHzM9SuMT7LB4RQle6kzYYm%0A6nl9%0A) **Note:** If you trigger a manual sync while background changes are processing, your organization takes the most recent change for each member or group. If multiple changes are queued for the same member or group, you may need to resync again to make sure everything applies correctly. diff --git a/content/support/14604842-cyber-verification-program.md b/content/support/14604842-cyber-verification-program.md index 2a6c7b9394..98b50aa04a 100644 --- a/content/support/14604842-cyber-verification-program.md +++ b/content/support/14604842-cyber-verification-program.md @@ -12,7 +12,7 @@ Our generally available models can still be used by all users for secure code re ## Access tiers -![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2716457392/33c90f9ccfbd33fee02840fd2efa/267bc7d1-baeb-4302-a1d9-4491b4110775?expires=1792599300&signature=7fd93a8ef0f2d9889a3efe071193ff1d25fa7044cc3ec5cab0f4642236e0f7ce&req=dicmEM17moJWW%2FMW1HO4zVYZ0Nq7Z81Ey1US26KtMzKCS3XS8iRoRUAg1YGR%0A52aFJTsV9P6OMb2j9bs%3D%0A) +![](https://downloads.intercomcdn.com/i/o/lupk8zyo/2716457392/33c90f9ccfbd33fee02840fd2efa/267bc7d1-baeb-4302-a1d9-4491b4110775?expires=1792613700&signature=7a29353a156e164baf1b0a37772f76f67e69a27d0033dea1b5f1356f60526445&req=dicmEM17moJWW%2FMW1HO4zVYZ0Nq4b8dAy1US26KtMzJp3OjvJmNEWz1OOCtU%0AxWz1SvkIimtCtW21KzQ%3D%0A) ## How to apply diff --git a/content/support/14661296-use-claude-security.md b/content/support/14661296-use-claude-security.md index 79391877c4..916486e002 100644 --- a/content/support/14661296-use-claude-security.md +++ b/content/support/14661296-use-claude-security.md @@ -2,59 +2,64 @@ ## Overview -Claude Security is a capability built into Claude that scans codebases for security vulnerabilities and suggests targeted patches for human review. It helps teams find and fix issues that traditional methods often miss. Learn more **[about Claude security](https://claude.com/product/claude-security)**. +**[Claude Security](https://claude.com/product/claude-security)** is a capability built into Claude that continuously watches your codebases for security vulnerabilities, tracks each finding until it is fixed, and suggests targeted patches for human review. It helps teams find and fix issues that traditional methods often miss. Claude Security is now available in public beta for users on Enterprise plans. Claude Security allows you to: -1. **Scan your code in parallel** — Claude Security understands context, traces data flows across files, and identifies complex, multi-component vulnerability patterns that traditional scanners might not detect. +1. **Scan your codebase holistically** — Claude Security understands how your code fits together, traces data flows across files and across the repositories in a project, and identifies complex, multi-component vulnerabilities and bugs that traditional rules-based scanners cannot detect. -2. **Validate findings** — Every finding goes through multi-stage verification, with Claude challenging its own results before surfacing them. The result: more real issues reported and fewer false positives. +2. **Deep Scan** — Create a project and connect up to eight repositories from GitHub or other Git providers. Claude reads the code, writes a threat model, and runs a deep baseline scan. -3. **Review and patch** — Move from a finding into a Claude Code session to review the proposed fix. Resolve vulnerabilities quickly instead of growing a backlog. +3. **Continuous Scanning** — Claude Security runs an efficient scan when new commits land, and surfaces any new findings for quick remediation. -Learn how to get started and how leading enterprises use the tool here: **[Getting started with Claude Security](https://claude.com/resources/tutorials/getting-started-with-claude-security)**. +4. **Add what the code can’t show** — Tell Claude how your code is deployed, who can reach it, and which risks you’ve accepted. Each project keeps this in a threat model, and Claude uses it to decide what to flag and how to rate it. ---- +5. **Validate findings** — Every finding goes through multi-stage verification, with Claude critically reviewing its own findings before they’re surfaced. The result: fewer false positives, less noise. + +6. **Review and patch** — Seamlessly move from a finding into a Claude Code session to generate a targeted fix. Resolve vulnerabilities quickly instead of growing a backlog. + +7. **Track fixes** — Claude checks open findings against the code that changed and marks them fixed when the fix lands. -## Enable Claude Security +8. **Integrate into your workflow** — Read and resolve findings through the Claude Security API or the Claude Security connector (MCP) in Claude and Claude Code, and get a webhook when a new finding is added. -An organization owner can enable Claude Security by going to **[Organization settings > Claude Security](https://claude.ai/admin-settings/claude-security)** and switching the **Turn on for your organization** toggle on. +9. **Control access** — Share each project with a Full, Triage, or View role. Admins can decide who can create projects and who can view, triage, or manage all projects with RBAC. --- ## Finding types -Finding falls into these example categories below. +Findings fall into these example categories below. -**Injection (SQL, Command, Code, XSS):** Untrusted input changes query structure or gets executed. E.g., ' OR 1=1--, ; rm -rf /,