{"id":599,"date":"2026-02-02T00:19:37","date_gmt":"2026-02-01T16:19:37","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/02\/02\/claude-agent-sdk-python-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e7%94%a8-cli-%e5%ad%90%e7%a8%8b%e5%ba%8f%e6%9e%b6%e6%a7%8b%e6%a9%8b%e6%8e%a5-python-%e8%88%87-ai-%e4%bb%a3%e7%90%86\/"},"modified":"2026-02-02T00:51:13","modified_gmt":"2026-02-01T16:51:13","slug":"claude-agent-sdk-python-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e7%94%a8-cli-%e5%ad%90%e7%a8%8b%e5%ba%8f%e6%9e%b6%e6%a7%8b%e6%a9%8b%e6%8e%a5-python-%e8%88%87-ai-%e4%bb%a3%e7%90%86","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/02\/02\/claude-agent-sdk-python-%e5%8e%9f%e5%a7%8b%e7%a2%bc%e8%a7%a3%e8%ae%80%ef%bc%9a%e7%94%a8-cli-%e5%ad%90%e7%a8%8b%e5%ba%8f%e6%9e%b6%e6%a7%8b%e6%a9%8b%e6%8e%a5-python-%e8%88%87-ai-%e4%bb%a3%e7%90%86\/","title":{"rendered":"Claude Agent SDK Python \u539f\u59cb\u78bc\u89e3\u8b80\uff1a\u7528 CLI \u5b50\u7a0b\u5e8f\u67b6\u69cb\u6a4b\u63a5 Python \u8207 AI \u4ee3\u7406"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Claude Agent SDK Python \u662f Anthropic \u5b98\u65b9\u63d0\u4f9b\u7684 Python SDK\uff0c\u8b93\u958b\u767c\u8005\u80fd\u4ee5\u7a0b\u5f0f\u5316\u65b9\u5f0f\u64cd\u63a7 Claude Code \u4ee3\u7406\u3002\u9019\u4efd\u539f\u59cb\u78bc\u6700\u503c\u5f97\u6df1\u8b80\u7684\u5730\u65b9\u5728\u65bc\uff1a\u5b83\u4e0d\u662f\u76f4\u63a5\u547c\u53eb HTTP API\uff0c\u800c\u662f\u900f\u904e CLI \u5b50\u7a0b\u5e8f\u52a0\u4e0a\u4e00\u5957\u81ea\u8a02\u7684\u96d9\u5411\u63a7\u5236\u5354\u5b9a\uff0c\u5c07 Claude Code \u7684\u5b8c\u6574\u80fd\u529b\u66b4\u9732\u7d66 Python \u751f\u614b\u7cfb\u3002\u5f9e\u4e2d\u4f60\u80fd\u5b78\u5230\u5982\u4f55\u8a2d\u8a08\u5206\u5c64\u5f0f Transport \u62bd\u8c61\u3001\u96d9\u5411\u4e32\u6d41\u7684\u63a7\u5236\u5354\u5b9a\u3001In-Process MCP Server \u6574\u5408\uff0c\u4ee5\u53ca\u5728 Python \u4e2d\u5be6\u73fe Hook \u6514\u622a\u6a21\u5f0f\u7684\u5177\u9ad4\u624b\u6cd5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\">Claude Agent SDK Python GitHub Repository<\/a> \u2014 \u5c08\u6848\u539f\u59cb\u78bc\uff0c\u5305\u542b\u672c\u6587\u89e3\u8b80\u7684\u6240\u6709\u8a2d\u8a08\u5be6\u4f5c<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5c08\u6848\u6982\u89bd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Agent SDK Python \u662f\u4e00\u500b\u5305\u88dd Claude Code CLI \u7684 Python SDK\uff0c\u7248\u672c 0.1.27\uff0c\u4f7f\u7528 Python 3.10+ \u958b\u767c\u3002\u6838\u5fc3\u4f9d\u8cf4\u70ba <code>anyio<\/code>\uff08\u975e\u540c\u6b65 I\/O \u6846\u67b6\uff0c\u540c\u6642\u652f\u63f4 asyncio \u548c trio\uff09\u548c <code>mcp<\/code>\uff08Model Context Protocol SDK\uff09\u3002\u5c08\u6848\u900f\u904e <code>hatchling<\/code> \u5efa\u69cb\u7cfb\u7d71\u6253\u5305\uff0c\u4e26\u5728 wheel \u4e2d\u6346\u7d81 Claude Code CLI \u57f7\u884c\u6a94\uff0c\u8b93\u4f7f\u7528\u8005\u5b89\u88dd pip \u5957\u4ef6\u5f8c\u5373\u53ef\u76f4\u63a5\u4f7f\u7528\uff0c\u7121\u9700\u984d\u5916\u5b89\u88dd CLI\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c08\u6848\u6838\u5fc3\u529f\u80fd\u63d0\u4f9b\u5169\u7a2e\u4f7f\u7528\u6a21\u5f0f\uff1a<code>query()<\/code> \u7528\u65bc\u55ae\u6b21\u554f\u7b54\uff0c<code>ClaudeSDKClient<\/code> \u7528\u65bc\u591a\u8f2a\u4e92\u52d5\u5c0d\u8a71\u3002\u5169\u8005\u5171\u4eab\u540c\u4e00\u5957 Transport \u2192 Query \u2192 Message Parser \u7684\u5206\u5c64\u67b6\u69cb\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u67b6\u69cb\u7e3d\u89bd<\/h2>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">src\/claude_agent_sdk\/\n\u251c\u2500\u2500 __init__.py                    <span class=\"hljs-comment\"># \u516c\u958b API \u5f59\u51fa + MCP Server \u5de5\u5ee0<\/span>\n\u251c\u2500\u2500 query.py                       <span class=\"hljs-comment\"># query() \u55ae\u6b21\u67e5\u8a62\u516c\u958b\u4ecb\u9762<\/span>\n\u251c\u2500\u2500 client.py                      <span class=\"hljs-comment\"># ClaudeSDKClient \u4e92\u52d5\u5f0f\u5ba2\u6236\u7aef<\/span>\n\u251c\u2500\u2500 types.py                       <span class=\"hljs-comment\"># \u5b8c\u6574\u578b\u5225\u5b9a\u7fa9\uff08500+ \u884c\uff09<\/span>\n\u251c\u2500\u2500 _errors.py                     <span class=\"hljs-comment\"># \u968e\u5c64\u5f0f\u932f\u8aa4\u985e\u5225<\/span>\n\u251c\u2500\u2500 _version.py                    <span class=\"hljs-comment\"># SDK \u7248\u672c<\/span>\n\u251c\u2500\u2500 _cli_version.py                <span class=\"hljs-comment\"># \u7d81\u5b9a\u7684 CLI \u7248\u672c<\/span>\n\u251c\u2500\u2500 _bundled\/                      <span class=\"hljs-comment\"># \u7d81\u5b9a\u7684 CLI \u57f7\u884c\u6a94<\/span>\n\u2514\u2500\u2500 _internal\/                     <span class=\"hljs-comment\"># \u5167\u90e8\u5be6\u4f5c\u5c64<\/span>\n    \u251c\u2500\u2500 __init__.py\n    \u251c\u2500\u2500 client.py                  <span class=\"hljs-comment\"># InternalClient \u5354\u8abf\u5668<\/span>\n    \u251c\u2500\u2500 query.py                   <span class=\"hljs-comment\"># Query \u63a7\u5236\u5354\u5b9a\u8655\u7406<\/span>\n    \u251c\u2500\u2500 message_parser.py          <span class=\"hljs-comment\"># \u8a0a\u606f\u89e3\u6790\u5668<\/span>\n    \u2514\u2500\u2500 transport\/\n        \u251c\u2500\u2500 __init__.py            <span class=\"hljs-comment\"># Transport \u62bd\u8c61\u57fa\u985e<\/span>\n        \u2514\u2500\u2500 subprocess_cli.py      <span class=\"hljs-comment\"># CLI \u5b50\u7a0b\u5e8f Transport \u5be6\u4f5c<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u67b6\u69cb\u5206\u70ba\u4e09\u500b\u660e\u78ba\u7684\u5c64\u6b21\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5c64\u7d1a<\/th><th>\u6a21\u7d44<\/th><th>\u8077\u8cac<\/th><\/tr><\/thead><tbody><tr><td><strong>Public API<\/strong><\/td><td><code>query.py<\/code>, <code>client.py<\/code><\/td><td>\u9762\u5411\u4f7f\u7528\u8005\u7684\u4ecb\u9762\uff0c\u63d0\u4f9b <code>query()<\/code> \u548c <code>ClaudeSDKClient<\/code><\/td><\/tr><tr><td><strong>Control Protocol<\/strong><\/td><td><code>_internal\/query.py<\/code>, <code>_internal\/client.py<\/code><\/td><td>\u96d9\u5411\u63a7\u5236\u5354\u5b9a\u3001Hook \u5206\u6d3e\u3001MCP \u8def\u7531\u3001\u6b0a\u9650\u7ba1\u7406<\/td><\/tr><tr><td><strong>Transport<\/strong><\/td><td><code>_internal\/transport\/<\/code><\/td><td>\u5e95\u5c64 I\/O \u62bd\u8c61\uff0c\u5b50\u7a0b\u5e8f\u7ba1\u7406\u3001stdin\/stdout \u4e32\u6d41<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u6838\u5fc3\u8a2d\u8a08\u89e3\u6790<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e00\uff1aTransport \u62bd\u8c61\u8207\u5b50\u7a0b\u5e8f\u901a\u8a0a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6574\u500b SDK \u6700\u6838\u5fc3\u7684\u8a2d\u8a08\u6c7a\u7b56\u662f<strong>\u4e0d\u76f4\u63a5\u547c\u53eb HTTP API\uff0c\u800c\u662f\u900f\u904e CLI \u5b50\u7a0b\u5e8f\u8207 Claude Code \u901a\u8a0a<\/strong>\u3002Transport \u4f5c\u70ba\u62bd\u8c61\u57fa\u985e\uff0c\u5b9a\u7fa9\u4e86\u516d\u500b\u65b9\u6cd5\u7684\u4ecb\u9762\u5951\u7d04\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/_internal\/transport\/&lt;strong&gt;init&lt;\/strong&gt;.py\"><code>src\/claude_agent_sdk\/_internal\/transport\/__init__.py<\/code><\/a> \u2014 Transport \u62bd\u8c61\u57fa\u985e\uff0c\u5b9a\u7fa9\u4e86\u6240\u6709\u50b3\u8f38\u5c64\u5fc5\u9808\u5be6\u4f5c\u7684\u4ecb\u9762<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">class<\/span> <span class=\"hljs-selector-tag\">Transport<\/span>(<span class=\"hljs-selector-tag\">ABC<\/span>):\n    <span class=\"hljs-keyword\">@abstractmethod<\/span>\n    async def connect(self) -&gt; <span class=\"hljs-attribute\">None:<\/span> ...\n\n    @abstractmethod\n    async def write(self, <span class=\"hljs-attribute\">data:<\/span> str) -&gt; <span class=\"hljs-attribute\">None:<\/span> ...\n\n    @abstractmethod\n    def read_messages(self) -&gt; AsyncIterator&#91;dict&#91;str, Any]]: ...\n\n    @abstractmethod\n    async def close(self) -&gt; <span class=\"hljs-attribute\">None:<\/span> ...\n\n    @abstractmethod\n    def is_ready(self) -&gt; <span class=\"hljs-attribute\">bool:<\/span> ...\n\n    @abstractmethod\n    async def end_input(self) -&gt; <span class=\"hljs-attribute\">None:<\/span> ...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b\u8a2d\u8a08\u7684\u7cbe\u5999\u4e4b\u8655\u5728\u65bc docstring \u4e2d\u7684 WARNING\uff1a\u9019\u662f\u4e00\u500b\u300c\u66b4\u9732\u7684\u5167\u90e8 API\u300d\uff0c\u5141\u8a31\u958b\u767c\u8005\u5be6\u4f5c\u81ea\u8a02 Transport\uff08\u4f8b\u5982\u9060\u7aef Claude Code \u9023\u7dda\uff09\uff0c\u4f46\u660e\u78ba\u8072\u660e\u53ef\u80fd\u5728\u4efb\u4f55\u7248\u672c\u4e2d\u8b8a\u66f4\u3002\u9019\u9ad4\u73fe\u4e86\u300c\u958b\u653e\u64f4\u5c55\uff0c\u4f46\u4e0d\u627f\u8afe\u7a69\u5b9a\u300d\u7684\u52d9\u5be6\u614b\u5ea6\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/_internal\/transport\/subprocess_cli.py\"><code>src\/claude_agent_sdk\/_internal\/transport\/subprocess_cli.py<\/code><\/a> \u2014 SubprocessCLITransport\uff0c\u552f\u4e00\u7684\u5167\u5efa Transport \u5be6\u4f5c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SubprocessCLITransport \u7684\u5be6\u4f5c\u63ed\u793a\u4e86\u5e7e\u500b\u95dc\u9375\u8a2d\u8a08\u6c7a\u7b56\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><span><code class=\"hljs\">class SubprocessCLITransport(Transport):\n    def __init__(self, prompt, options):\n        self._prompt = prompt\n        self._is_streaming = not isinstance(prompt, str)\n        # ...\n        self._max_buffer_size = (\n            options.max_buffer_size\n            if options.max_buffer_size is not None\n            else _DEFAULT_MAX_BUFFER_SIZE  # 1MB\n        )\n        self._write_lock: anyio.Lock = anyio.Lock()\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u6839\u64da <code>prompt<\/code> \u7684\u578b\u5225\u81ea\u52d5\u5224\u65b7\u6a21\u5f0f\uff1a\u5b57\u4e32\u4ee3\u8868\u55ae\u6b21\u67e5\u8a62\uff08<code>--print<\/code> \u6a21\u5f0f\uff09\uff0c<code>AsyncIterable<\/code> \u4ee3\u8868\u4e32\u6d41\u6a21\u5f0f\uff08<code>--input-format stream-json<\/code>\uff09\u3002\u9019\u662f\u4e00\u7a2e <strong>\u578b\u5225\u9a45\u52d5\u884c\u70ba<\/strong> \u7684\u8a2d\u8a08\u2014\u2014API \u547c\u53eb\u8005\u7684\u578b\u5225\u9078\u64c7\u76f4\u63a5\u6c7a\u5b9a\u4e86\u5e95\u5c64\u7684\u57f7\u884c\u7b56\u7565\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e8c\uff1aSpeculative JSON Buffering<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Transport \u5c64\u7684\u8a0a\u606f\u8b80\u53d6\u63a1\u7528\u4e86\u4e00\u7a2e speculative\uff08\u6295\u6a5f\u5f0f\uff09JSON \u89e3\u6790\u7b56\u7565\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">async def _read_messages_impl(<span class=\"hljs-keyword\">self<\/span>) -&gt; AsyncIterator&#91;dict&#91;str, Any]]:\n    json_buffer = <span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-keyword\">try<\/span>:\n        async <span class=\"hljs-keyword\">for<\/span> line in <span class=\"hljs-keyword\">self<\/span>._stdout_stream:\n            line_str = line.strip()\n            <span class=\"hljs-keyword\">if<\/span> not line_str:\n                <span class=\"hljs-keyword\">continue<\/span>\n            json_lines = line_str.split(<span class=\"hljs-string\">\"\\n\"<\/span>)\n            <span class=\"hljs-keyword\">for<\/span> json_line in json_lines:\n                json_buffer += json_line\n                <span class=\"hljs-keyword\">if<\/span> len(json_buffer) &gt; <span class=\"hljs-keyword\">self<\/span>._max_buffer_size:\n                    json_buffer = <span class=\"hljs-string\">\"\"<\/span>\n                    raise SDKJSONDecodeError(...)\n                <span class=\"hljs-keyword\">try<\/span>:\n                    data = json.loads(json_buffer)\n                    json_buffer = <span class=\"hljs-string\">\"\"<\/span>\n                    <span class=\"hljs-keyword\">yield<\/span> data\n                except json.JSONDecodeError:\n                    <span class=\"hljs-keyword\">continue<\/span>  <span class=\"hljs-comment\"># \u7e7c\u7e8c\u7d2f\u7a4d\uff0c\u7b49\u5f85\u5b8c\u6574 JSON<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b\u8a2d\u8a08\u6e90\u65bc\u4e00\u500b\u73fe\u5be6\u554f\u984c\uff1a<code>TextReceiveStream<\/code> \u53ef\u80fd\u5728\u9577\u884c\u4e2d\u9593\u622a\u65b7\u8f38\u51fa\u3002SDK \u4e0d\u5047\u8a2d\u6bcf\u884c\u90fd\u662f\u5b8c\u6574\u7684 JSON\uff0c\u800c\u662f\u6301\u7e8c\u7d2f\u7a4d buffer \u4e26\u5728\u6bcf\u6b21\u8ffd\u52a0\u5f8c\u5617\u8a66\u89e3\u6790\u3002\u89e3\u6790\u6210\u529f\u5c31 yield\uff0c\u5931\u6557\u5c31\u7e7c\u7e8c\u7d2f\u7a4d\u3002\u914d\u5408 <code>_max_buffer_size<\/code> \u4e0a\u9650\uff08\u9810\u8a2d 1MB\uff09\uff0c\u5728\u5065\u58ef\u6027\u548c\u8a18\u61b6\u9ad4\u5b89\u5168\u4e4b\u9593\u53d6\u5f97\u5e73\u8861\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e09\uff1a\u96d9\u5c64 API \u2014 query() \u8207 ClaudeSDKClient<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SDK \u63d0\u4f9b\u5169\u7a2e\u516c\u958b\u4ecb\u9762\uff0c\u5206\u5225\u5c0d\u61c9\u4e0d\u540c\u7684\u4f7f\u7528\u5834\u666f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/query.py\"><code>src\/claude_agent_sdk\/query.py<\/code><\/a> \u2014 \u55ae\u6b21\u67e5\u8a62\u7684 async generator \u4ecb\u9762<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">async<\/span> def query(\n    *,\n    <span class=\"hljs-attr\">prompt<\/span>: str | AsyncIterable&#91;dict&#91;str, Any]],\n    <span class=\"hljs-attr\">options<\/span>: ClaudeAgentOptions | None = None,\n    <span class=\"hljs-attr\">transport<\/span>: Transport | None = None,\n) -&gt; AsyncIterator&#91;Message]:\n    <span class=\"hljs-keyword\">if<\/span> options is None:\n        options = ClaudeAgentOptions()\n    os.environ&#91;<span class=\"hljs-string\">\"CLAUDE_CODE_ENTRYPOINT\"<\/span>] = <span class=\"hljs-string\">\"sdk-py\"<\/span>\n    client = InternalClient()\n    <span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-keyword\">for<\/span> message <span class=\"hljs-keyword\">in<\/span> client.process_query(\n        prompt=prompt, options=options, transport=transport\n    ):\n        <span class=\"hljs-keyword\">yield<\/span> message\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>query()<\/code> \u662f\u4e00\u500b\u7cbe\u7c21\u7684 async generator\uff0c\u6bcf\u6b21\u547c\u53eb\u90fd\u5efa\u7acb\u65b0\u7684 <code>InternalClient<\/code>\uff0c\u9069\u5408 fire-and-forget \u5834\u666f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/client.py\"><code>src\/claude_agent_sdk\/client.py<\/code><\/a> \u2014 ClaudeSDKClient \u4e92\u52d5\u5f0f\u5ba2\u6236\u7aef\uff0c\u652f\u63f4\u591a\u8f2a\u5c0d\u8a71<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><span><code class=\"hljs\">class ClaudeSDKClient:\n    async def connect(self, prompt=None) -&gt; None:\n        # Auto-connect with empty async iterable\n        async def _empty_stream() -&gt; AsyncIterator&#91;dict&#91;str, Any]]:\n            return\n            yield {}  # type: ignore&#91;unreachable]\n        actual_prompt = _empty_stream() if prompt is None else prompt\n        # ...\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>ClaudeSDKClient<\/code> \u4f7f\u7528 async context manager \u6a21\u5f0f\uff0c\u9023\u7dda\u6642\u5982\u679c\u6c92\u6709\u63d0\u4f9b prompt\uff0c\u6703\u5efa\u7acb\u4e00\u500b\u300c\u6c38\u9060\u4e0d yield \u7684\u7a7a async generator\u300d\u4f86\u7dad\u6301\u9023\u7dda\u3002\u6ce8\u610f <code>return<\/code> \u5f8c\u9762\u7684 <code>yield {}<\/code>\u2014\u2014\u9019\u884c\u6c38\u9060\u4e0d\u6703\u57f7\u884c\uff0c\u4f46\u5b83\u8b93 Python \u628a\u9019\u500b\u51fd\u5f0f\u8b58\u5225\u70ba async generator \u800c\u975e\u666e\u901a coroutine\u3002\u9019\u662f\u4e00\u500b\u5de7\u5999\u7684\u578b\u5225\u7cfb\u7d71\u6280\u5de7\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u56db\uff1aControl Protocol \u96d9\u5411\u901a\u8a0a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Query \u985e\u5225\u5be6\u4f5c\u4e86\u5b8c\u6574\u7684\u96d9\u5411\u63a7\u5236\u5354\u5b9a\uff0c\u9019\u662f\u6574\u500b SDK \u6700\u8907\u96dc\u4e5f\u6700\u6838\u5fc3\u7684\u90e8\u5206\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/_internal\/query.py\"><code>src\/claude_agent_sdk\/_internal\/query.py<\/code><\/a> \u2014 Query \u63a7\u5236\u5354\u5b9a\u8655\u7406\u5668\uff0c\u7ba1\u7406\u96d9\u5411\u901a\u8a0a\u548c\u8acb\u6c42\u8def\u7531<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><span><code class=\"hljs\">class Query:\n    def __init__(self, transport, is_streaming_mode, can_use_tool, hooks, sdk_mcp_servers, ...):\n        self.pending_control_responses: dict&#91;str, anyio.Event] = {}\n        self.pending_control_results: dict&#91;str, dict&#91;str, Any] | Exception] = {}\n        self.hook_callbacks: dict&#91;str, Callable&#91;..., Any]] = {}\n        self._message_send, self._message_receive = anyio.create_memory_object_stream&#91;\n            dict&#91;str, Any]\n        ](max_buffer_size=100)\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Query \u4f7f\u7528\u4e86\u591a\u500b\u4e26\u884c\u6a5f\u5236\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Memory Object Stream<\/strong> (<code>anyio.create_memory_object_stream<\/code>)\uff1a\u4f5c\u70ba\u8a0a\u606f\u4f47\u5217\uff0c\u5c07\u8b80\u53d6\u5230\u7684 SDK \u8a0a\u606f\u50b3\u905e\u7d66\u6d88\u8cbb\u8005<\/li>\n\n\n\n<li><strong>Event + Dict \u7d44\u5408<\/strong>\uff1a<code>pending_control_responses<\/code> \u5132\u5b58 <code>anyio.Event<\/code>\uff0c<code>pending_control_results<\/code> \u5132\u5b58\u7d50\u679c\uff0c\u5be6\u73fe request-response \u914d\u5c0d<\/li>\n\n\n\n<li><strong>Task Group<\/strong>\uff1a\u4f7f\u7528 <code>anyio.create_task_group()<\/code> \u7ba1\u7406\u80cc\u666f\u4efb\u52d9\uff08\u8b80\u53d6\u8a0a\u606f\u3001\u4e32\u6d41\u8f38\u5165\uff09<\/li>\n<\/ol>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">async def _read_messages(<span class=\"hljs-keyword\">self<\/span>) -&gt; None:\n    async <span class=\"hljs-keyword\">for<\/span> message in <span class=\"hljs-keyword\">self<\/span>.transport.read_messages():\n        msg_type = message.get(<span class=\"hljs-string\">\"type\"<\/span>)\n        <span class=\"hljs-keyword\">if<\/span> msg_type == <span class=\"hljs-string\">\"control_response\"<\/span>:\n            <span class=\"hljs-comment\"># \u8def\u7531\u5230\u7b49\u5f85\u4e2d\u7684\u63a7\u5236\u8acb\u6c42<\/span>\n            response = message.get(<span class=\"hljs-string\">\"response\"<\/span>, {})\n            request_id = response.get(<span class=\"hljs-string\">\"request_id\"<\/span>)\n            <span class=\"hljs-keyword\">if<\/span> request_id in <span class=\"hljs-keyword\">self<\/span>.pending_control_responses:\n                event = <span class=\"hljs-keyword\">self<\/span>.pending_control_responses&#91;request_id]\n                <span class=\"hljs-keyword\">self<\/span>.pending_control_results&#91;request_id] = response\n                event.set()\n            <span class=\"hljs-keyword\">continue<\/span>\n        elif msg_type == <span class=\"hljs-string\">\"control_request\"<\/span>:\n            <span class=\"hljs-comment\"># CLI \u767c\u4f86\u7684\u63a7\u5236\u8acb\u6c42\uff0c\u5728 task group \u4e2d\u8655\u7406<\/span>\n            <span class=\"hljs-keyword\">self<\/span>._tg.start_soon(<span class=\"hljs-keyword\">self<\/span>._handle_control_request, request)\n            <span class=\"hljs-keyword\">continue<\/span>\n        <span class=\"hljs-comment\"># \u666e\u901a SDK \u8a0a\u606f\u653e\u5165\u4f47\u5217<\/span>\n        await <span class=\"hljs-keyword\">self<\/span>._message_send.send(message)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u8b80\u53d6\u8ff4\u5708\u5145\u7576\u4e86\u4e00\u500b<strong>\u8a0a\u606f\u8def\u7531\u5668<\/strong>\uff1acontrol_response \u914d\u5c0d\u5230\u5c0d\u61c9\u7684 pending request\uff0ccontrol_request \u5206\u6d3e\u5230\u8655\u7406\u51fd\u5f0f\uff0c\u5176\u9918\u8a0a\u606f\u63a8\u5165\u6d88\u8cbb\u8005\u4f47\u5217\u3002\u9019\u7a2e\u8a2d\u8a08\u8b93 SDK \u53ef\u4ee5\u5728\u540c\u4e00\u689d stdio \u7ba1\u9053\u4e0a\u591a\u5de5\u8655\u7406\u4e0d\u540c\u985e\u578b\u7684\u901a\u8a0a\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e94\uff1aHook \u7cfb\u7d71 \u2014 Python \u95dc\u9375\u5b57\u885d\u7a81\u7684\u512a\u96c5\u8655\u7406<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hook \u7cfb\u7d71\u8b93\u4f7f\u7528\u8005\u5728\u4ee3\u7406\u8ff4\u5708\u7684\u7279\u5b9a\u6642\u9593\u9ede\u6ce8\u5165\u81ea\u8a02\u908f\u8f2f\u3002\u8a2d\u8a08\u4e0a\u6700\u503c\u5f97\u6ce8\u610f\u7684\u662f\u5982\u4f55\u8655\u7406 Python \u95dc\u9375\u5b57\u885d\u7a81\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/types.py\"><code>src\/claude_agent_sdk\/types.py<\/code><\/a> \u2014 \u5b8c\u6574\u7684\u578b\u5225\u5b9a\u7fa9\uff0c\u5305\u542b Hook \u8f38\u51fa\u683c\u5f0f\u7684\u5de7\u5999\u8a2d\u8a08<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">class<\/span> <span class=\"hljs-selector-tag\">SyncHookJSONOutput<\/span>(<span class=\"hljs-selector-tag\">TypedDict<\/span>):\n    # <span class=\"hljs-selector-tag\">Using<\/span> <span class=\"hljs-selector-tag\">continue_<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">avoid<\/span> <span class=\"hljs-selector-tag\">Python<\/span> <span class=\"hljs-selector-tag\">keyword<\/span> (<span class=\"hljs-selector-tag\">converted<\/span> <span class=\"hljs-selector-tag\">to<\/span> \"<span class=\"hljs-selector-tag\">continue<\/span>\" <span class=\"hljs-selector-tag\">for<\/span> <span class=\"hljs-selector-tag\">CLI<\/span>)\n    <span class=\"hljs-selector-tag\">continue_<\/span>: <span class=\"hljs-selector-tag\">NotRequired<\/span><span class=\"hljs-selector-attr\">&#91;bool]<\/span>\n    <span class=\"hljs-selector-tag\">suppressOutput<\/span>: <span class=\"hljs-selector-tag\">NotRequired<\/span><span class=\"hljs-selector-attr\">&#91;bool]<\/span>\n    <span class=\"hljs-selector-tag\">stopReason<\/span>: <span class=\"hljs-selector-tag\">NotRequired<\/span><span class=\"hljs-selector-attr\">&#91;str]<\/span>\n    # ...\n    <span class=\"hljs-selector-tag\">hookSpecificOutput<\/span>: <span class=\"hljs-selector-tag\">NotRequired<\/span><span class=\"hljs-selector-attr\">&#91;HookSpecificOutput]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">CLI \u7aef\u671f\u671b\u7684 JSON \u6b04\u4f4d\u540d\u70ba <code>async<\/code> \u548c <code>continue<\/code>\uff0c\u4f46\u9019\u5169\u8005\u5728 Python \u4e2d\u662f\u4fdd\u7559\u5b57\u3002SDK \u5728\u578b\u5225\u5b9a\u7fa9\u4e2d\u4f7f\u7528 <code>async_<\/code> \u548c <code>continue_<\/code> \u4f5c\u70ba\u66ff\u4ee3\uff0c\u7136\u5f8c\u5728\u767c\u9001\u524d\u900f\u904e <code>_convert_hook_output_for_cli()<\/code> \u81ea\u52d5\u8f49\u63db\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">def _convert_hook_output_for_cli(hook_output: dict&#91;str, Any]) -&gt; dict&#91;str, Any]:\n    converted = {}\n    <span class=\"hljs-keyword\">for<\/span> key, value in hook_output.items():\n        <span class=\"hljs-keyword\">if<\/span> key == <span class=\"hljs-string\">\"async_\"<\/span>:\n            converted&#91;<span class=\"hljs-string\">\"async\"<\/span>] = value\n        elif key == <span class=\"hljs-string\">\"continue_\"<\/span>:\n            converted&#91;<span class=\"hljs-string\">\"continue\"<\/span>] = value\n        <span class=\"hljs-keyword\">else<\/span>:\n            converted&#91;key] = value\n    <span class=\"hljs-keyword\">return<\/span> converted\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b\u8a2d\u8a08\u5c55\u73fe\u4e86\u8de8\u8a9e\u8a00 SDK \u958b\u767c\u7684\u5178\u578b\u6311\u6230\u2014\u2014<strong>\u540c\u4e00\u5957\u5354\u5b9a\u5728\u4e0d\u540c\u8a9e\u8a00\u4e2d\u7684\u547d\u540d\u9069\u914d<\/strong>\u3002\u4e0d\u662f\u7c21\u55ae\u5730\u6539\u540d\uff0c\u800c\u662f\u5728\u578b\u5225\u5c64\u9762\u4f7f\u7528 Python \u53cb\u5584\u7684\u540d\u7a31\uff0c\u5728\u50b3\u8f38\u5c64\u81ea\u52d5\u8f49\u63db\uff0c\u8b93\u4f7f\u7528\u8005\u7121\u611f\u77e5\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u516d\uff1aIn-Process MCP Server \u2014 \u8de8\u8d8a\u7a0b\u5e8f\u908a\u754c\u7684\u6574\u5408<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SDK \u6700\u5177\u5275\u610f\u7684\u8a2d\u8a08\u662f In-Process MCP Server\uff0c\u8b93\u539f\u672c\u9700\u8981\u7368\u7acb\u7a0b\u5e8f\u7684 MCP \u5de5\u5177\u76f4\u63a5\u5728 Python \u61c9\u7528\u5167\u57f7\u884c\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\/blob\/main\/src\/claude_agent_sdk\/&lt;strong&gt;init&lt;\/strong&gt;.py\"><code>src\/claude_agent_sdk\/__init__.py<\/code><\/a> \u2014 \u5305\u542b <code>@tool<\/code> \u88dd\u98fe\u5668\u548c <code>create_sdk_mcp_server()<\/code> \u5de5\u5ee0\u51fd\u5f0f<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@dataclass<\/span>\nclass SdkMcpTool(Generic&#91;T]):\n    <span class=\"hljs-attribute\">name:<\/span> str\n    <span class=\"hljs-attribute\">description:<\/span> str\n    input_<span class=\"hljs-attribute\">schema:<\/span> type&#91;T] | dict&#91;str, Any]\n    <span class=\"hljs-attribute\">handler:<\/span> Callable&#91;&#91;T], Awaitable&#91;dict&#91;str, Any]]]\n\ndef tool(name, description, input_schema):\n    def decorator(handler):\n        return SdkMcpTool(\n            name=name, description=description,\n            input_schema=input_schema, handler=handler,\n        )\n    return decorator\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>@tool<\/code> \u88dd\u98fe\u5668\u5c07\u4e00\u822c\u7684 async \u51fd\u5f0f\u8f49\u5316\u70ba <code>SdkMcpTool<\/code> dataclass\u3002<code>create_sdk_mcp_server()<\/code> \u518d\u5c07\u591a\u500b tool \u6ce8\u518a\u5230\u4e00\u500b MCP Server \u5be6\u4f8b\u4e0a\uff0c\u81ea\u52d5\u8655\u7406 schema \u8f49\u63db\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">def create_sdk_mcp_server(name, version=<span class=\"hljs-string\">\"1.0.0\"<\/span>, tools=None):\n    server = Server(name, version=version)\n    <span class=\"hljs-keyword\">if<\/span> tools:\n        tool_map = {tool_def.name: tool_def <span class=\"hljs-keyword\">for<\/span> tool_def in tools}\n\n        @server.list_tools()\n        async def list_tools() -&gt; <span class=\"hljs-keyword\">list<\/span>&#91;Tool]:\n            <span class=\"hljs-comment\"># \u81ea\u52d5\u5c07 Python \u578b\u5225\u8f49\u63db\u70ba JSON Schema<\/span>\n            <span class=\"hljs-keyword\">for<\/span> param_name, param_type in tool_def.input_schema.items():\n                <span class=\"hljs-keyword\">if<\/span> param_type is str:\n                    properties&#91;param_name] = {<span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"string\"<\/span>}\n                elif param_type is int:\n                    properties&#91;param_name] = {<span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"integer\"<\/span>}\n                <span class=\"hljs-comment\"># ...<\/span>\n\n        @server.call_tool()\n        async def call_tool(name, arguments):\n            result = await tool_def.handler(arguments)\n            <span class=\"hljs-comment\"># \u5c07\u7d50\u679c\u8f49\u70ba MCP TextContent\/ImageContent<\/span>\n\n    <span class=\"hljs-keyword\">return<\/span> McpSdkServerConfig(type=<span class=\"hljs-string\">\"sdk\"<\/span>, name=name, instance=server)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u66f4\u7cbe\u5999\u7684\u662f SDK \u5982\u4f55\u5c07 In-Process Server \u8207 CLI \u6a4b\u63a5\u3002\u5728 Query \u985e\u5225\u4e2d\uff0c<code>_handle_sdk_mcp_request()<\/code> \u65b9\u6cd5\u624b\u52d5\u8def\u7531 JSONRPC \u8acb\u6c42\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">async def _handle_sdk_mcp_request(<span class=\"hljs-keyword\">self<\/span>, server_name, message):\n    server = <span class=\"hljs-keyword\">self<\/span>.sdk_mcp_servers&#91;server_name]\n    method = message.get(<span class=\"hljs-string\">\"method\"<\/span>)\n\n    <span class=\"hljs-comment\"># <span class=\"hljs-doctag\">TODO:<\/span> Python MCP SDK lacks the Transport abstraction that TypeScript has.<\/span>\n    <span class=\"hljs-comment\"># TypeScript: server.connect(transport) allows custom transports<\/span>\n    <span class=\"hljs-comment\"># Python: server.run(read_stream, write_stream) requires actual streams<\/span>\n    <span class=\"hljs-comment\">#<\/span>\n    <span class=\"hljs-comment\"># This forces us to manually route methods.<\/span>\n\n    <span class=\"hljs-keyword\">if<\/span> method == <span class=\"hljs-string\">\"tools\/list\"<\/span>:\n        handler = server.request_handlers.get(ListToolsRequest)\n        result = await handler(request)\n        <span class=\"hljs-comment\"># \u624b\u52d5\u8f49\u63db\u56de JSONRPC \u683c\u5f0f<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u539f\u59cb\u78bc\u4e2d\u7684 TODO \u8a3b\u89e3\u5766\u8aa0\u6307\u51fa\u4e86\u9650\u5236\uff1aPython MCP SDK \u4e0d\u50cf TypeScript \u7248\u672c\u63d0\u4f9b Transport \u62bd\u8c61\uff0c\u6240\u4ee5\u5fc5\u9808\u624b\u52d5\u8def\u7531\u6bcf\u500b JSONRPC method\u3002\u9019\u662f\u4e00\u500b\u300c\u5728\u6846\u67b6\u9650\u5236\u4e0b\u627e\u5230\u53ef\u884c\u65b9\u6848\u300d\u7684\u5178\u578b\u6848\u4f8b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e03\uff1aTool Permission Callback \u2014 \u578b\u5225\u5b89\u5168\u7684\u6b0a\u9650\u63a7\u5236<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SDK \u63d0\u4f9b\u4e86\u7a0b\u5f0f\u5316\u7684\u5de5\u5177\u6b0a\u9650\u63a7\u5236\u6a5f\u5236\uff0c\u4f7f\u7528 discriminated union \u8a2d\u8a08\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@dataclass<\/span>\nclass <span class=\"hljs-attribute\">PermissionResultAllow:<\/span>\n    <span class=\"hljs-attribute\">behavior:<\/span> Literal&#91;<span class=\"hljs-string\">\"allow\"<\/span>] = <span class=\"hljs-string\">\"allow\"<\/span>\n    updated_<span class=\"hljs-attribute\">input:<\/span> dict&#91;str, Any] | None = None\n    updated_<span class=\"hljs-attribute\">permissions:<\/span> list&#91;PermissionUpdate] | None = None\n\n@dataclass\nclass <span class=\"hljs-attribute\">PermissionResultDeny:<\/span>\n    <span class=\"hljs-attribute\">behavior:<\/span> Literal&#91;<span class=\"hljs-string\">\"deny\"<\/span>] = <span class=\"hljs-string\">\"deny\"<\/span>\n    <span class=\"hljs-attribute\">message:<\/span> str = <span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-attribute\">interrupt:<\/span> bool = False\n\nPermissionResult = PermissionResultAllow | PermissionResultDeny\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>can_use_tool<\/code> callback \u56de\u50b3 <code>PermissionResult<\/code> union type\uff0c\u4e0d\u53ea\u80fd\u5141\u8a31\u6216\u62d2\u7d55\uff0c\u9084\u80fd\u900f\u904e <code>updated_input<\/code> \u4fee\u6539\u5de5\u5177\u8f38\u5165\uff08\u4f8b\u5982\u5c07\u6a94\u6848\u8def\u5f91\u91cd\u5c0e\u5411\u5230\u5b89\u5168\u76ee\u9304\uff09\uff0c\u4ee5\u53ca\u900f\u904e <code>updated_permissions<\/code> \u52d5\u614b\u66f4\u65b0\u6b0a\u9650\u898f\u5247\u3002\u9019\u7a2e\u8a2d\u8a08\u8b93\u6b0a\u9650\u63a7\u5236\u4e0d\u50c5\u662f\u4e00\u500b boolean \u958b\u95dc\uff0c\u800c\u662f\u4e00\u500b\u5b8c\u6574\u7684\u6514\u622a\u548c\u4fee\u6539\u7ba1\u9053\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u516b\uff1aCLI \u63a2\u6e2c\u8207 Bundled Binary \u7b56\u7565<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SDK \u63a1\u7528\u4e86\u591a\u91cd CLI \u63a2\u6e2c\u7b56\u7565\uff0c\u5c55\u73fe\u4e86\u5c0d\u90e8\u7f72\u74b0\u5883\u591a\u6a23\u6027\u7684\u8003\u91cf\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">def _find_cli(<span class=\"hljs-keyword\">self<\/span>) -&gt; str:\n    <span class=\"hljs-comment\"># \u512a\u5148\u4f7f\u7528 bundled CLI<\/span>\n    bundled_cli = <span class=\"hljs-keyword\">self<\/span>._find_bundled_cli()\n    <span class=\"hljs-keyword\">if<\/span> bundled_cli:\n        <span class=\"hljs-keyword\">return<\/span> bundled_cli\n    <span class=\"hljs-comment\"># \u5176\u6b21\u7528 PATH \u4e2d\u7684 claude<\/span>\n    <span class=\"hljs-keyword\">if<\/span> cli := shutil.which(<span class=\"hljs-string\">\"claude\"<\/span>):\n        <span class=\"hljs-keyword\">return<\/span> cli\n    <span class=\"hljs-comment\"># \u6700\u5f8c\u6aa2\u67e5\u5e38\u898b\u5b89\u88dd\u4f4d\u7f6e<\/span>\n    locations = &#91;\n        Path.home() \/ <span class=\"hljs-string\">\".npm-global\/bin\/claude\"<\/span>,\n        Path(<span class=\"hljs-string\">\"\/usr\/local\/bin\/claude\"<\/span>),\n        Path.home() \/ <span class=\"hljs-string\">\".local\/bin\/claude\"<\/span>,\n        Path.home() \/ <span class=\"hljs-string\">\"node_modules\/.bin\/claude\"<\/span>,\n        Path.home() \/ <span class=\"hljs-string\">\".yarn\/bin\/claude\"<\/span>,\n        Path.home() \/ <span class=\"hljs-string\">\".claude\/local\/claude\"<\/span>,\n    ]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u7d50\u5408 <code>_check_claude_version()<\/code> \u7684\u7248\u672c\u6aa2\u67e5\uff08\u5e36 2 \u79d2\u8d85\u6642\uff09\uff0c\u4ee5\u53ca\u5efa\u69cb\u7cfb\u7d71\u4e2d\u5e73\u53f0\u7279\u5b9a\u7684 wheel \u6253\u5305\uff0c\u6574\u500b\u7b56\u7565\u662f\uff1a<strong>pip install \u5f8c\u5373\u53ef\u4f7f\u7528\uff0c\u4f46\u4e5f\u5bb9\u932f\u5404\u7a2e\u624b\u52d5\u5b89\u88dd\u5834\u666f<\/strong>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u4e5d\uff1a\u578b\u5225\u7cfb\u7d71 \u2014 Discriminated Union \u8207 TypedDict \u7684\u6df7\u7528<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">types.py \u8d85\u904e 500 \u884c\uff0c\u5c55\u73fe\u4e86\u5982\u4f55\u5728 Python \u4e2d\u5efa\u69cb TypeScript \u98a8\u683c\u7684\u578b\u5225\u7cfb\u7d71\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><span><code class=\"hljs\"># Hook \u8f38\u5165\u4f7f\u7528 discriminated union\nHookInput = (\n    PreToolUseHookInput\n    | PostToolUseHookInput\n    | PostToolUseFailureHookInput\n    | UserPromptSubmitHookInput\n    | StopHookInput\n    | SubagentStopHookInput\n    | PreCompactHookInput\n)\n\n# \u6bcf\u500b\u8b8a\u9ad4\u90fd\u6709 Literal \u9451\u5225\u6b04\u4f4d\nclass PreToolUseHookInput(BaseHookInput):\n    hook_event_name: Literal&#91;\"PreToolUse\"]\n    tool_name: str\n    tool_input: dict&#91;str, Any]\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528 <code>TypedDict<\/code> \u800c\u975e Pydantic model \u662f\u523b\u610f\u7684\u9078\u64c7\u2014\u2014SDK \u7684\u578b\u5225\u5b9a\u7fa9\u4e0d\u9700\u8981 validation \u6216 serialization\uff0c\u53ea\u9700\u8981\u975c\u614b\u578b\u5225\u6aa2\u67e5\u548c IDE \u652f\u63f4\u3002\u540c\u6642\uff0c<code>@dataclass<\/code> \u7528\u65bc\u9700\u8981\u5be6\u4f8b\u5316\u7684\u7269\u4ef6\uff08\u5982 <code>TextBlock<\/code>\u3001<code>AssistantMessage<\/code>\uff09\uff0c<code>TypedDict<\/code> \u7528\u65bc\u5b57\u5178\u683c\u5f0f\u7684\u5354\u5b9a\u8a0a\u606f\u3002\u9019\u7a2e\u6df7\u7528\u7b56\u7565\u5728\u6548\u80fd\u548c\u958b\u767c\u8005\u9ad4\u9a57\u4e4b\u9593\u53d6\u5f97\u4e86\u597d\u7684\u5e73\u8861\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a2d\u8a08\u5341\uff1aStream \u95dc\u9589\u7684\u6642\u5e8f\u63a7\u5236<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576 SDK MCP Server \u6216 Hooks \u9700\u8981\u96d9\u5411\u901a\u8a0a\u6642\uff0cstdin \u4e0d\u80fd\u5728\u8f38\u5165\u7d50\u675f\u5f8c\u7acb\u5373\u95dc\u9589\uff0c\u5426\u5247 CLI \u7121\u6cd5\u767c\u9001\u63a7\u5236\u8acb\u6c42\u56de\u4f86\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">async def stream_input(<span class=\"hljs-keyword\">self<\/span>, stream: AsyncIterable&#91;dict&#91;str, Any]]) -&gt; None:\n    <span class=\"hljs-keyword\">try<\/span>:\n        async <span class=\"hljs-keyword\">for<\/span> message in stream:\n            <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">self<\/span>._closed:\n                <span class=\"hljs-keyword\">break<\/span>\n            await <span class=\"hljs-keyword\">self<\/span>.transport.write(json.dumps(message) + <span class=\"hljs-string\">\"\\n\"<\/span>)\n\n        <span class=\"hljs-comment\"># \u6709 MCP Server \u6216 Hooks \u6642\uff0c\u7b49\u5f85\u7b2c\u4e00\u500b result \u624d\u95dc stdin<\/span>\n        has_hooks = bool(<span class=\"hljs-keyword\">self<\/span>.hooks)\n        <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">self<\/span>.sdk_mcp_servers <span class=\"hljs-keyword\">or<\/span> has_hooks:\n            <span class=\"hljs-keyword\">try<\/span>:\n                with anyio.move_on_after(<span class=\"hljs-keyword\">self<\/span>._stream_close_timeout):\n                    await <span class=\"hljs-keyword\">self<\/span>._first_result_event.wait()\n            except <span class=\"hljs-keyword\">Exception<\/span>:\n                pass  <span class=\"hljs-comment\"># \u8d85\u6642\u4e5f\u7e7c\u7e8c<\/span>\n        await <span class=\"hljs-keyword\">self<\/span>.transport.end_input()\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9019\u6bb5\u7a0b\u5f0f\u78bc\u89e3\u6c7a\u4e86\u4e00\u500b\u5fae\u5999\u7684\u6642\u5e8f\u554f\u984c\uff1a\u5728\u4e32\u6d41\u6a21\u5f0f\u4e0b\uff0c\u6240\u6709\u4f7f\u7528\u8005\u8f38\u5165\u767c\u9001\u5b8c\u7562\u5f8c\uff0c\u5982\u679c\u7acb\u5373\u95dc\u9589 stdin\uff0cCLI \u7a0b\u5e8f\u5c31\u7121\u6cd5\u518d\u900f\u904e control_request \u8207 SDK \u901a\u8a0a\u3002SDK \u900f\u904e <code>_first_result_event<\/code> \u4e8b\u4ef6\u7b49\u5f85 CLI \u56de\u50b3\u7b2c\u4e00\u500b\u7d50\u679c\uff0c\u78ba\u4fdd\u6240\u6709\u96d9\u5411\u901a\u8a0a\uff08MCP \u5de5\u5177\u547c\u53eb\u3001Hook \u56de\u8abf\uff09\u90fd\u6709\u6a5f\u6703\u5b8c\u6210\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8a2d\u8a08\u7406\u5ff5\u8403\u53d6<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CLI \u5b50\u7a0b\u5e8f\u4f5c\u70ba\u7a69\u5b9a\u4ecb\u9762<\/strong> \u2014 SDK \u4e0d\u76f4\u63a5\u547c\u53eb API\uff0c\u800c\u662f\u5305\u88dd CLI \u4e8c\u9032\u4f4d\u6a94\u3002\u9019\u8b93 SDK \u80fd\u7e7c\u627f Claude Code \u7684\u6240\u6709\u529f\u80fd\uff08\u5de5\u5177\u3001\u6b0a\u9650\u3001\u6c99\u7bb1\uff09\uff0c\u800c\u4e0d\u9700\u8981\u5728 Python \u7aef\u91cd\u65b0\u5be6\u4f5c\u3002\u4ee3\u50f9\u662f\u591a\u4e00\u5c64\u7a0b\u5e8f\u9593\u901a\u8a0a\uff0c\u4f46\u63db\u4f86\u7684\u662f\u529f\u80fd\u5b8c\u6574\u6027\u548c\u7dad\u8b77\u7c21\u4fbf\u6027\u3002<\/li>\n\n\n\n<li><strong>\u578b\u5225\u9a45\u52d5\u884c\u70ba\u5206\u652f<\/strong> \u2014 \u900f\u904e <code>prompt<\/code> \u53c3\u6578\u662f <code>str<\/code> \u9084\u662f <code>AsyncIterable<\/code> \u4f86\u81ea\u52d5\u6c7a\u5b9a\u57f7\u884c\u6a21\u5f0f\uff0c\u8b93\u4f7f\u7528\u8005\u7121\u9700\u5b78\u7fd2\u4e0d\u540c\u7684 API\u3002\u9019\u7a2e\u300c\u770b\u4f60\u50b3\u4ec0\u9ebc\u578b\u5225\uff0c\u6211\u5c31\u77e5\u9053\u4f60\u8981\u4ec0\u9ebc\u300d\u7684\u8a2d\u8a08\uff0c\u6bd4\u7528\u4e0d\u540c\u7684\u51fd\u5f0f\u540d\u6216 flag \u53c3\u6578\u66f4\u76f4\u89ba\u3002<\/li>\n\n\n\n<li><strong>\u5206\u5c64\u4f46\u4e0d\u904e\u5ea6\u62bd\u8c61<\/strong> \u2014 Transport \u2192 Query \u2192 Public API \u4e09\u5c64\u6e05\u6670\uff0c\u4f46\u4e0d\u5275\u9020\u4e0d\u5fc5\u8981\u7684\u4e2d\u9593\u5c64\u3002Transport \u66b4\u9732\u70ba\u53ef\u64f4\u5c55\u7684\u62bd\u8c61\uff0c\u4f46\u53ea\u6709\u4e00\u500b\u5167\u5efa\u5be6\u4f5c\u3002\u9019\u7a2e\u300c\u9810\u7559\u63a5\u53e3\u4f46\u4e0d\u904e\u5ea6\u8a2d\u8a08\u300d\u7684\u614b\u5ea6\u503c\u5f97\u5b78\u7fd2\u3002<\/li>\n\n\n\n<li><strong>\u8de8\u8a9e\u8a00\u5354\u5b9a\u7684\u547d\u540d\u9069\u914d<\/strong> \u2014 \u5728 Python \u7aef\u4f7f\u7528 <code>async_<\/code>\u3001<code>continue_<\/code> \u7b49\u53cb\u5584\u540d\u7a31\uff0c\u5728\u50b3\u8f38\u5c64\u81ea\u52d5\u8f49\u63db\u70ba JavaScript \u7aef\u7684 <code>async<\/code>\u3001<code>continue<\/code>\u3002\u9019\u7a2e\u65b9\u5f0f\u6bd4\u8981\u6c42\u4f7f\u7528\u8005\u7528\u5b57\u4e32 key \u5b58\u53d6\u66f4\u5b89\u5168\uff0c\u4e5f\u6bd4\u5b8c\u5168\u91cd\u65b0\u547d\u540d\u66f4\u4e00\u81f4\u3002<\/li>\n\n\n\n<li><strong>In-Process MCP \u7684\u52d9\u5be6\u6a4b\u63a5<\/strong> \u2014 \u9762\u5c0d Python MCP SDK \u7f3a\u4e4f Transport \u62bd\u8c61\u7684\u9650\u5236\uff0cSDK \u9078\u64c7\u624b\u52d5\u8def\u7531 JSONRPC \u65b9\u6cd5\u800c\u975e\u7b49\u5f85\u4e0a\u6e38\u4fee\u5fa9\u3002\u7a0b\u5f0f\u78bc\u4e2d\u7684 TODO \u8a3b\u89e3\u5766\u8aa0\u8a18\u9304\u4e86\u6280\u8853\u50b5\u52d9\uff0c\u9019\u662f\u958b\u6e90\u5c08\u6848\u4e2d\u8ca0\u8cac\u4efb\u7684\u505a\u6cd5\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5ef6\u4f38\u601d\u8003<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b SDK \u7684\u67b6\u69cb\u6a21\u5f0f\u53ef\u4ee5\u76f4\u63a5\u61c9\u7528\u5230\u5e7e\u500b\u5834\u666f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5982\u679c\u4f60\u5728\u5305\u88dd\u7b2c\u4e09\u65b9 CLI \u5de5\u5177<\/strong>\uff0cSubprocessCLITransport \u7684\u8a2d\u8a08\u662f\u4e00\u500b\u5f88\u597d\u7684\u7bc4\u672c\u2014\u2014\u62bd\u8c61 Transport \u4ecb\u9762\u3001\u6295\u6a5f\u5f0f JSON \u89e3\u6790\u3001\u547d\u4ee4\u884c\u9577\u5ea6\u9650\u5236\u8655\u7406\uff08\u8d85\u9577\u53c3\u6578\u81ea\u52d5\u5beb\u5165\u66ab\u5b58\u6a94\uff09\u3001\u4ee5\u53ca\u591a\u91cd\u8def\u5f91\u63a2\u6e2c\u7b56\u7565\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5982\u679c\u4f60\u5728\u8a2d\u8a08\u9700\u8981\u96d9\u5411\u901a\u8a0a\u7684\u5354\u5b9a<\/strong>\uff0cQuery \u985e\u5225\u7684 request-response \u914d\u5c0d\u6a5f\u5236\uff08Event + Dict\uff09\u548c\u8a0a\u606f\u8def\u7531\u6a21\u5f0f\u53ef\u4ee5\u76f4\u63a5\u501f\u9451\u3002\u7279\u5225\u662f\u5b83\u5982\u4f55\u5728\u540c\u4e00\u689d\u7ba1\u9053\u4e0a\u591a\u5de5\u8655\u7406 control_request\u3001control_response \u548c\u666e\u901a\u8a0a\u606f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5982\u679c\u4f60\u5728\u5efa\u69cb SDK \u7684\u578b\u5225\u7cfb\u7d71<\/strong>\uff0ctypes.py \u5c55\u793a\u4e86\u4e00\u7a2e\u6df7\u5408\u7b56\u7565\uff1a\u7528 <code>@dataclass<\/code> \u5b9a\u7fa9\u9700\u8981\u5be6\u4f8b\u5316\u7684\u7269\u4ef6\uff0c\u7528 <code>TypedDict<\/code> \u5b9a\u7fa9\u7d14\u5b57\u5178\u683c\u5f0f\u7684\u5354\u5b9a\u8a0a\u606f\uff0c\u7528 union type \u5be6\u73fe discriminated union\u3002\u9019\u6bd4\u5168\u7528 Pydantic \u6216\u5168\u7528\u5b57\u5178\u66f4\u7cbe\u6e96\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vibe Coding\uff1a\u628a\u89c0\u5ff5\u8b8a\u6210\u7a0b\u5f0f\u78bc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662f\u4f60\u53ef\u4ee5\u76f4\u63a5\u7d66 AI \u7684 prompt \u6307\u4ee4\uff0c\u5c07\u672c\u6587\u4ecb\u7d39\u7684\u8a2d\u8a08\u89c0\u5ff5\u61c9\u7528\u5230\u4f60\u7684\u5c08\u6848\u4e2d\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Transport \u62bd\u8c61\u5c64\u8a2d\u8a08<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u6b63\u5728\u958b\u767c\u4e00\u500b\u9700\u8981\u8207\u5916\u90e8\u7a0b\u5f0f\uff08CLI \u5de5\u5177\u3001\u5b50\u7a0b\u5e8f\u3001\u9060\u7aef\u670d\u52d9\uff09\u901a\u8a0a\u7684 Python \u5957\u4ef6\uff0c\u60f3\u8981\u8b93\u901a\u8a0a\u5c64\u53ef\u66ff\u63db\u3001\u53ef\u6e2c\u8a66\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u8acb\u5e6b\u6211\u8a2d\u8a08\u4e00\u500b Transport \u62bd\u8c61\u5c64\uff0c\u7528\u65bc\u5305\u88dd\u5916\u90e8 CLI \u5de5\u5177\u7684\u901a\u8a0a\u3002\u53c3\u8003 Claude Agent SDK \u7684 Transport \u6a21\u5f0f\uff0c\u9700\u8981\uff1a<br>1. \u4e00\u500b ABC \u57fa\u985e\uff0c\u5b9a\u7fa9 connect()\u3001write()\u3001read_messages()\uff08async iterator\uff09\u3001close()\u3001is_ready() \u7b49\u65b9\u6cd5<br>2. \u4e00\u500b SubprocessTransport \u5be6\u4f5c\uff0c\u7528 anyio.open_process \u7ba1\u7406\u5b50\u7a0b\u5e8f\uff0c\u900f\u904e stdin\/stdout \u9032\u884c JSON \u8a0a\u606f\u4ea4\u63db<br>3. read_messages() \u8981\u5be6\u4f5c speculative JSON buffering\u2014\u2014\u4e0d\u5047\u8a2d\u6bcf\u884c\u662f\u5b8c\u6574 JSON\uff0c\u6301\u7e8c\u7d2f\u7a4d buffer \u4e26\u5617\u8a66\u89e3\u6790\uff0c\u914d\u5408 max_buffer_size \u4e0a\u9650\u9632\u6b62\u8a18\u61b6\u9ad4\u6ea2\u51fa<br>4. write() \u8981\u52a0\u4e0a anyio.Lock \u78ba\u4fdd\u4e26\u767c\u5b89\u5168<br><br>\u6211\u8981\u5305\u88dd\u7684 CLI \u5de5\u5177\u662f [\u4f60\u7684\u5de5\u5177\u540d\u7a31]\uff0c\u5b83\u63a5\u53d7 [\u8f38\u5165\u683c\u5f0f] \u4e26\u8f38\u51fa [\u8f38\u51fa\u683c\u5f0f]\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u500b\u5206\u5c64\u6e05\u6670\u7684 Transport \u67b6\u69cb\uff0c\u5305\u542b\u62bd\u8c61\u57fa\u985e\u548c\u5177\u9ad4\u5be6\u4f5c\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0d\u4fee\u6539\u4e0a\u5c64\u908f\u8f2f\u7684\u60c5\u6cc1\u4e0b\u66ff\u63db\u901a\u8a0a\u65b9\u5f0f\uff08\u4f8b\u5982\u5f9e\u5b50\u7a0b\u5e8f\u6539\u70ba HTTP \u6216 WebSocket\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u96d9\u5411\u63a7\u5236\u5354\u5b9a\u7684 Request-Response \u914d\u5c0d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u7684\u61c9\u7528\u9700\u8981\u5728\u540c\u4e00\u689d\u901a\u8a0a\u7ba1\u9053\u4e0a\u8655\u7406\u591a\u7a2e\u8a0a\u606f\u985e\u578b\uff08\u666e\u901a\u8a0a\u606f\u3001\u63a7\u5236\u8acb\u6c42\u3001\u63a7\u5236\u56de\u61c9\uff09\uff0c\u9700\u8981\u4e00\u500b\u8a0a\u606f\u8def\u7531\u6a5f\u5236\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u6b63\u5728\u8a2d\u8a08\u4e00\u500b\u96d9\u5411\u901a\u8a0a\u5354\u5b9a\uff0c\u9700\u8981\u5728\u540c\u4e00\u689d stdio \u7ba1\u9053\u4e0a\u591a\u5de5\u8655\u7406\u4e0d\u540c\u985e\u578b\u7684\u8a0a\u606f\u3002\u53c3\u8003 Claude Agent SDK \u7684 Query \u985e\u5225\u7684\u63a7\u5236\u5354\u5b9a\u6a21\u5f0f\uff0c\u8acb\u5e6b\u6211\u5be6\u4f5c\uff1a<br>1. \u4e00\u500b\u8a0a\u606f\u8def\u7531\u5668\uff1a\u8b80\u53d6\u8ff4\u5708\u6839\u64da message type \u5206\u6d41\u2014\u2014control_response \u914d\u5c0d\u5230 pending request\uff0ccontrol_request \u5206\u6d3e\u5230\u8655\u7406\u51fd\u5f0f\uff0c\u666e\u901a\u8a0a\u606f\u63a8\u5165\u6d88\u8cbb\u8005\u4f47\u5217<br>2. Request-Response \u914d\u5c0d\u6a5f\u5236\uff1a\u7528 dict[str, anyio.Event] \u8ffd\u8e64 pending requests\uff0c\u7528\u53e6\u4e00\u500b dict \u5132\u5b58\u7d50\u679c\uff0c\u767c\u9001\u8acb\u6c42\u6642\u7522\u751f unique ID\uff0c\u7b49\u5f85\u5c0d\u61c9\u7684 Event \u88ab set<br>3. \u4f7f\u7528 anyio.create_memory_object_stream \u4f5c\u70ba\u666e\u901a\u8a0a\u606f\u7684\u975e\u540c\u6b65\u4f47\u5217<br>4. \u4f7f\u7528 anyio.create_task_group \u7ba1\u7406\u80cc\u666f\u7684\u8b80\u53d6\u4efb\u52d9\u548c\u63a7\u5236\u8acb\u6c42\u8655\u7406<br><br>\u6211\u7684\u8a0a\u606f\u985e\u578b\u6709\uff1a[\u5217\u51fa\u4f60\u7684\u8a0a\u606f\u985e\u578b]\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u500b\u5b8c\u6574\u7684\u96d9\u5411\u5354\u5b9a\u8655\u7406\u5668\uff0c\u652f\u63f4\u5728\u55ae\u4e00\u7ba1\u9053\u4e0a\u540c\u6642\u9032\u884c request-response \u914d\u5c0d\u548c\u8a0a\u606f\u4e32\u6d41\uff0c\u53ef\u76f4\u63a5\u6574\u5408\u5230\u4f60\u7684\u901a\u8a0a\u67b6\u69cb\u4e2d\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hook \u6514\u622a\u7cfb\u7d71<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u6b63\u5728\u5efa\u69cb\u4e00\u500b\u6709\u591a\u6b65\u9a5f\u6d41\u7a0b\u7684\u61c9\u7528\uff08\u4f8b\u5982 CI\/CD pipeline\u3001\u8cc7\u6599\u8655\u7406\u7ba1\u7dda\u3001AI Agent \u8ff4\u5708\uff09\uff0c\u60f3\u8b93\u4f7f\u7528\u8005\u5728\u6d41\u7a0b\u7684\u7279\u5b9a\u6642\u9593\u9ede\u6ce8\u5165\u81ea\u8a02\u908f\u8f2f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u8acb\u5e6b\u6211\u8a2d\u8a08\u4e00\u500b Hook \u7cfb\u7d71\uff0c\u8b93\u4f7f\u7528\u8005\u53ef\u4ee5\u5728\u6211\u7684\u61c9\u7528\u6d41\u7a0b\u4e2d\u6ce8\u5165\u56de\u8abf\u51fd\u5f0f\u3002\u53c3\u8003 Claude Agent SDK \u7684 Hook \u6a21\u5f0f\uff0c\u9700\u8981\uff1a<br>1. \u5b9a\u7fa9 Hook \u4e8b\u4ef6\u7684 TypedDict \u8f38\u5165\u578b\u5225\uff0c\u6bcf\u500b\u4e8b\u4ef6\u7528 Literal \u6b04\u4f4d\u4f5c\u70ba discriminated union \u7684\u9451\u5225\u5668<br>2. Hook \u56de\u50b3\u503c\u4f7f\u7528 TypedDict\uff0c\u652f\u63f4 continue\uff08\u662f\u5426\u7e7c\u7e8c\u6d41\u7a0b\uff09\u3001\u4fee\u6539\u5f8c\u7684\u8f38\u5165\u7b49\u63a7\u5236\u6b04\u4f4d<br>3. \u5982\u679c Hook \u8f38\u51fa\u7684\u6b04\u4f4d\u540d\u8207 Python \u4fdd\u7559\u5b57\u885d\u7a81\uff08\u5982 async\u3001continue\uff09\uff0c\u7528\u5e95\u7dda\u5f8c\u7db4\u547d\u540d\uff08async_\u3001continue_\uff09\uff0c\u4e26\u5728\u767c\u9001\u5230\u5916\u90e8\u7cfb\u7d71\u524d\u81ea\u52d5\u8f49\u63db\u56de\u539f\u59cb\u540d\u7a31<br>4. Hook \u7684\u8a3b\u518a\u548c\u5206\u6d3e\u6a5f\u5236\uff0c\u652f\u63f4\u540c\u6b65\u548c\u975e\u540c\u6b65\u56de\u8abf<br><br>\u6211\u7684\u6d41\u7a0b\u6b65\u9a5f\u662f\uff1a[\u5217\u51fa\u4f60\u7684\u6d41\u7a0b\u6b65\u9a5f\uff0c\u4f8b\u5982 pre_execute, post_execute, on_error]\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u578b\u5225\u5b89\u5168\u7684 Hook \u7cfb\u7d71\uff0c\u5305\u542b\u4e8b\u4ef6\u5b9a\u7fa9\u3001\u56de\u8abf\u8a3b\u518a\u3001\u5206\u6d3e\u908f\u8f2f\uff0c\u4ee5\u53ca\u8de8\u8a9e\u8a00\u547d\u540d\u885d\u7a81\u7684\u81ea\u52d5\u8f49\u63db\u6a5f\u5236\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">In-Process MCP Server \u8207 @tool \u88dd\u98fe\u5668<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u60f3\u70ba Claude Agent SDK \u5efa\u7acb\u81ea\u8a02\u5de5\u5177\uff0c\u8b93 AI \u4ee3\u7406\u53ef\u4ee5\u547c\u53eb\u4f60\u7684 Python \u51fd\u5f0f\uff0c\u800c\u4e0d\u9700\u8981\u555f\u52d5\u7368\u7acb\u7684 MCP Server \u7a0b\u5e8f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6211\u60f3\u7528 Claude Agent SDK \u7684 In-Process MCP Server \u529f\u80fd\uff0c\u70ba\u6211\u7684\u61c9\u7528\u5efa\u7acb\u81ea\u8a02\u5de5\u5177\u3002\u8acb\u5e6b\u6211\uff1a<br>1. \u7528 @tool \u88dd\u98fe\u5668\u5b9a\u7fa9 [\u5de5\u5177\u6578\u91cf] \u500b\u5de5\u5177\uff0c\u6bcf\u500b\u5de5\u5177\u9700\u8981\u6709 name\u3001description \u548c input_schema<br>2. \u7528 create_sdk_mcp_server() \u5c07\u6240\u6709\u5de5\u5177\u8a3b\u518a\u5230\u4e00\u500b MCP Server<br>3. \u5efa\u7acb ClaudeSDKClient\uff0c\u8a2d\u5b9a mcp_servers \u548c allowed_tools<br>4. \u5de5\u5177\u7684\u8f38\u5165 schema \u7528 Python dict \u5b9a\u7fa9\uff08\u5982 {&#8220;query&#8221;: str, &#8220;limit&#8221;: int}\uff09\uff0cSDK \u6703\u81ea\u52d5\u8f49\u63db\u70ba JSON Schema<br><br>\u6211\u9700\u8981\u7684\u5de5\u5177\u529f\u80fd\uff1a<br>&#8211; [\u5de5\u5177 1]\uff1a[\u63cf\u8ff0\u529f\u80fd\u548c\u53c3\u6578]<br>&#8211; [\u5de5\u5177 2]\uff1a[\u63cf\u8ff0\u529f\u80fd\u548c\u53c3\u6578]<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u53ef\u76f4\u63a5\u57f7\u884c\u7684 In-Process MCP \u5de5\u5177\u5b9a\u7fa9\u548c\u5ba2\u6236\u7aef\u7a0b\u5f0f\u78bc\uff0c\u4f60\u7684 Python \u51fd\u5f0f\u6703\u5728\u540c\u4e00\u500b\u7a0b\u5e8f\u5167\u88ab Claude \u4ee3\u7406\u547c\u53eb\uff0c\u7121\u9700\u7ba1\u7406\u984d\u5916\u7684\u7a0b\u5e8f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Discriminated Union \u578b\u5225\u7cfb\u7d71\u8a2d\u8a08<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5834\u666f<\/strong>\uff1a\u4f60\u5728\u8a2d\u8a08 Python SDK \u6216\u51fd\u5f0f\u5eab\u7684\u578b\u5225\u7cfb\u7d71\uff0c\u9700\u8981\u8655\u7406\u591a\u7a2e\u8b8a\u9ad4\u7684\u8a0a\u606f\u6216\u56de\u50b3\u503c\uff0c\u60f3\u8981\u517c\u9867\u578b\u5225\u5b89\u5168\u548c\u57f7\u884c\u6548\u7387\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d66 AI \u7684\u6307\u4ee4<\/strong>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u8acb\u5e6b\u6211\u8a2d\u8a08\u4e00\u5957 Python \u578b\u5225\u7cfb\u7d71\uff0c\u8655\u7406 [\u4f60\u7684\u9818\u57df] \u4e2d\u7684\u591a\u7a2e\u8a0a\u606f\/\u56de\u50b3\u503c\u8b8a\u9ad4\u3002\u53c3\u8003 Claude Agent SDK \u7684 types.py \u6df7\u5408\u7b56\u7565\uff1a<br>1. \u9700\u8981\u5be6\u4f8b\u5316\u7684\u7269\u4ef6\u7528 @dataclass \u5b9a\u7fa9\uff08\u800c\u975e Pydantic\uff09\uff0c\u4fdd\u6301\u8f15\u91cf<br>2. \u7d14\u5b57\u5178\u683c\u5f0f\u7684\u5354\u5b9a\u8a0a\u606f\u7528 TypedDict \u5b9a\u7fa9\uff0c\u642d\u914d NotRequired \u8655\u7406\u53ef\u9078\u6b04\u4f4d<br>3. \u591a\u8b8a\u9ad4\u985e\u578b\u7528 Union type \u7d44\u5408\uff0c\u6bcf\u500b\u8b8a\u9ad4\u7528 Literal \u6b04\u4f4d\u4f5c\u70ba\u9451\u5225\u5668\uff0c\u5be6\u73fe discriminated union<br>4. \u6b0a\u9650\u63a7\u5236\u7b49\u56de\u50b3\u503c\u8a2d\u8a08\uff1a\u4e0d\u53ea\u662f\u5e03\u6797\u503c\uff0c\u800c\u662f\u7528 PermissionResultAllow \/ PermissionResultDeny \u9019\u6a23\u7684 union\uff0c\u5141\u8a31\u5728\u300c\u5141\u8a31\u300d\u6642\u9644\u5e36\u4fee\u6539\u5f8c\u7684\u8f38\u5165<br><br>\u6211\u7684\u8b8a\u9ad4\u985e\u578b\u6709\uff1a[\u5217\u51fa\u4f60\u9700\u8981\u5340\u5206\u7684\u8a0a\u606f\u6216\u56de\u50b3\u503c\u985e\u578b]\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6548\u679c<\/strong>\uff1aAI \u6703\u7522\u51fa\u4e00\u5957\u6df7\u5408\u4f7f\u7528 dataclass\u3001TypedDict \u548c Union type \u7684\u578b\u5225\u5b9a\u7fa9\uff0c\u6bd4\u5168\u7528 Pydantic \u66f4\u8f15\u91cf\uff0c\u6bd4\u5168\u7528 dict \u66f4\u5b89\u5168\uff0cIDE \u81ea\u52d5\u88dc\u5168\u548c\u975c\u614b\u6aa2\u67e5\u90fd\u80fd\u6b63\u5e38\u904b\u4f5c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5ef6\u4f38\u95b1\u8b80<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/anthropics\/claude-agent-sdk-python\">Claude Agent SDK Python GitHub Repository<\/a> \u2014 \u5c08\u6848\u539f\u59cb\u78bc\u8207 README\uff0c\u5305\u542b\u6700\u65b0\u7684 API \u7bc4\u4f8b\u548c\u5b89\u88dd\u8aaa\u660e<\/li>\n\n\n\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/agent-sdk\/python\">Agent SDK Reference &#8211; Python (\u5b98\u65b9\u6587\u4ef6)<\/a> \u2014 Anthropic \u5b98\u65b9\u7684 Python SDK \u5b8c\u6574 API \u53c3\u8003\u6587\u4ef6\uff0c\u6db5\u84cb query()\u3001ClaudeSDKClient\u3001Hook\u3001\u81ea\u8a02\u5de5\u5177\u7b49\u6240\u6709\u4ecb\u9762<\/li>\n\n\n\n<li><a href=\"https:\/\/www.anthropic.com\/engineering\/building-agents-with-the-claude-agent-sdk\">Building Agents with the Claude Agent SDK (Anthropic Engineering Blog)<\/a> \u2014 Anthropic \u5de5\u7a0b\u5718\u968a\u64b0\u5beb\u7684\u5b98\u65b9\u6587\u7ae0\uff0c\u8aaa\u660e\u70ba\u4ec0\u9ebc\u5efa\u69cb\u9019\u5957 SDK\u3001\u4ee3\u7406\u8a2d\u8a08\u7684\u6700\u4f73\u5be6\u8e10\uff0c\u4ee5\u53ca Subagent \u7b49\u9032\u968e\u529f\u80fd<\/li>\n\n\n\n<li><a href=\"https:\/\/deepwiki.com\/anthropics\/claude-agent-sdk-python\">DeepWiki: claude-agent-sdk-python<\/a> \u2014 AI \u751f\u6210\u7684\u5c08\u6848\u6df1\u5ea6\u6587\u4ef6\uff0c\u4ee5\u4e92\u52d5\u5f0f\u67b6\u69cb\u5716\u5448\u73fe Transport\u3001Query\u3001MCP Server \u7b49\u6a21\u7d44\u4e4b\u9593\u7684\u95dc\u4fc2<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/modelcontextprotocol\/python-sdk\">Model Context Protocol Python SDK<\/a> \u2014 MCP \u5b98\u65b9 Python SDK \u539f\u59cb\u78bc\uff0c\u4e86\u89e3 Claude Agent SDK \u4e2d In-Process MCP Server \u6240\u4f9d\u8cf4\u7684\u5e95\u5c64\u5354\u5b9a\u5be6\u4f5c<\/li>\n\n\n\n<li><a href=\"https:\/\/anyio.readthedocs.io\/en\/stable\/subprocesses.html\">AnyIO Subprocess \u6587\u4ef6<\/a> \u2014 Claude Agent SDK \u5e95\u5c64\u4f7f\u7528\u7684\u975e\u540c\u6b65\u5b50\u7a0b\u5e8f\u7ba1\u7406\u6846\u67b6\u6587\u4ef6\uff0c\u7406\u89e3 open_process\u3001TextReceiveStream \u7b49\u6838\u5fc3 API<\/li>\n<\/ul>\n\n\n<div class=\"wp-like-post__wrapper\" style=\"\"><button type=\"button\" class=\"wp-like-post__button \" style=\"height: 30px; color: #000000;\" data-post-id=\"599\" data-total-likes=\"0\" data-likes-from-user=\"0\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" width=\"30\" height=\"30\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z\" \/><\/svg><\/button><div class=\"wp-like-post__count\"\">0<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Claude Agent SDK Python \u662f Anthropic \u5b98\u65b9\u63d0\u4f9b\u7684 Python SDK\uff0c\u8b93\u958b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[555],"tags":[570,573,440,240,572,571],"class_list":["post-599","post","type-post","status-publish","format-standard","hentry","category-ai-agent-github","tag-ai-agent-sdk","tag-hook-","tag-mcp","tag-python","tag-transport-","tag-571"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=599"}],"version-history":[{"count":1,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/599\/revisions"}],"predecessor-version":[{"id":611,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/599\/revisions\/611"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}