{"id":1868,"date":"2026-08-18T20:14:02","date_gmt":"2026-08-18T12:14:02","guid":{"rendered":"https:\/\/tongchun.website\/index.php\/kimiagent-02-runtime\/"},"modified":"2026-08-18T20:26:24","modified_gmt":"2026-08-18T12:26:24","slug":"kimiagent-02-runtime","status":"publish","type":"page","link":"https:\/\/tongchun.website\/index.php\/kimiagent-02-runtime\/","title":{"rendered":"02-runtime \u2014 Kimi \u6c99\u7bb1\u4ee3\u7801\u6267\u884c\u8fd0\u884c\u65f6\uff08kernel-server \/ ipykernel\uff09"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u2190 \u8fd4\u56de\u4e3b\u62a5\u544a\uff1a<a href=\"https:\/\/tongchun.website\/index.php\/2026\/kimi-agent%ef%bc%88%e4%ba%91%e7%ab%af%e6%b2%99%e7%ae%b1%ef%bc%89%e6%8a%80%e6%9c%af%e6%8a%a5%e5%91%8a\/\">Kimi Agent\uff08\u4e91\u7aef\u6c99\u7bb1\uff09\u6280\u672f\u62a5\u544a<\/a> \uff5c <a href=\"https:\/\/github.com\/SHAWNTRIBBIANI\/kimiagent-analysis\/blob\/main\/sections\/02-runtime.md\">GitHub \u539f\u6587<\/a><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>\u5408\u89c4\u4e0e\u98ce\u9669\u58f0\u660e<\/strong>\uff1a\u672c\u62a5\u544a\u4e3a\u5b89\u5168\u7814\u7a76\u4e0e\u4e92\u64cd\u4f5c\u5b66\u4e60\u76ee\u7684\u7684\u9006\u5411\u5206\u6790\uff0c\u5168\u7a0b\u53ea\u8bfb\u91c7\u96c6\uff0c\u672a\u5bf9\u76ee\u6807\u7cfb\u7edf\u505a\u4efb\u4f55\u4fee\u6539\uff1b\u6587\u4e2d\u6240\u6709\u5bc6\u94a5\u3001token\u3001\u8d26\u53f7\u7ea7\u6807\u8bc6\uff08chat_id \/ project_id \/ tenant_id \u7b49\uff09\u5747\u5df2\u8131\u654f\uff1b\u6c99\u7bb1\u5185\u53d1\u73b0\u7684\u9ed8\u8ba4\u5f31\u53e3\u4ee4\uff08VNC\/SSH\uff09\u5c5e\u5e73\u53f0\u4fa7\u914d\u7f6e\uff0c\u4ec5\u4f5c\u5b89\u5168\u53d1\u73b0\u62ab\u9732\uff0c\u8bf7\u52ff\u7528\u4e8e\u8bbf\u95ee\u4efb\u4f55\u4e0d\u5c5e\u4e8e\u81ea\u5df1\u7684\u7cfb\u7edf\u3002docx\/pdf\/xlsx\/kimi-slides \u7b49\u5f15\u64ce\u4e8c\u8fdb\u5236\u4e3a Moonshot \u4e13\u6709\u8bb8\u53ef\uff08\u7981\u518d\u5206\u53d1\/\u9006\u5411\uff09\uff0c\u672c\u6587\u4ec5\u4f5c\u884c\u4e3a\u7ea7\u63cf\u8ff0\u3002\u62a5\u544a\u57fa\u4e8e\u5355\u6b21\u5206\u6790\u7a97\u53e3\uff08\u7ea6 50 \u5206\u949f\u751f\u547d\u5468\u671f\uff09\uff0c\u8f6f\u4ef6\u7248\u672c\u4e0e\u6280\u80fd\u5e93\u5b58\u968f\u955c\u50cf\u66f4\u65b0\u53ef\u80fd\u53d8\u5316\u3002<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u91c7\u96c6\u65f6\u95f4\uff1a2026-08-18\u3002\u6765\u6e90\uff1aSSH \u53ea\u8bfb\u8bbf\u95ee\uff08kimi \u7528\u6237\uff09+ \u6c99\u7bb1\u5185\u5b9e\u6d4b curl\u3002\u6240\u6709\u6587\u4ef6\u8def\u5f84\u4e3a\u6c99\u7bb1\u5185\u8def\u5f84\u3002<\/p>\n\n\n\n<h2 id=\"1-%25e6%2580%25bb%25e4%25bd%2593%25e6%259e%25b6%25e6%259e%2584%25e4%25b8%2580%25e6%259d%25a1-http-%25e2%2586%2592-zmq-%25e2%2586%2592-ipykernel-%25e7%259a%2584%25e9%2593%25be%25e8%25b7%25af\" class=\"wp-block-heading\">1. \u603b\u4f53\u67b6\u6784\uff1a\u4e00\u6761 HTTP \u2192 ZMQ \u2192 ipykernel \u7684\u94fe\u8def<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e91\u7aef kimiagent\uff08\u6c99\u7bb1\u5916\uff09\u6267\u884c\u4ee3\u7801\u7684\u5b8c\u6574\u94fe\u8def\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u4e91\u7aef agent (kimiagent)\n  \u2502  HTTP POST \/kernel\/execute  {\"code\": \"...\", \"timeout\": 30}\n  \u25bc\nkernel-server  :8888  (FastAPI + uvicorn, \/app\/kernel_server.py, PID 74, \u7528\u6237 kimi)\n  \u2502  jupyter_client.KernelManager \/ BlockingKernelClient (ZMQ, HMAC-SHA256 \u7b7e\u540d)\n  \u25bc\nipykernel \u5b50\u8fdb\u7a0b  (\/usr\/local\/bin\/python3 -m ipykernel_launcher -f \/tmp\/tmpXXX.json, PID 180)\n  \u2502  iopub\/shell ZMQ \u6d88\u606f\u6d41\n  \u25bc\nkernel-server \u805a\u5408 stream\/error\/execute_result\/display_data \u2192 JSON \u54cd\u5e94\u56de\u4f20<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u952e\u4e8b\u5b9e\uff1akernel-server \u662f\u6c99\u7bb1\u5185\u552f\u4e00\u9762\u5411\u4e91\u7aef\u6a21\u578b\u7684\u4ee3\u7801\u6267\u884c\u5165\u53e3\u3002<code>\/app\/.agents\/skills\/<\/code> \u4e0b grep <code>8888<\/code> \u65e0\u4efb\u4f55\u4e1a\u52a1\u5f15\u7528\uff08\u547d\u4e2d\u7684\u5168\u662f node_modules \u91cc\u65e0\u5173\u6587\u672c\uff09\uff0c\u8bf4\u660e\u8c03\u7528\u65b9\u5728\u6c99\u7bb1\u5916\u2014\u2014\u4e91\u7aef agent \u76f4\u63a5\u6253\u5bb9\u5668\u7684 <code>0.0.0.0:8888<\/code>\u3002<\/p>\n\n\n\n<h2 id=\"2-kernelserver-%25e8%25bf%259b%25e7%25a8%258b%25e4%25b8%258e%25e5%2590%25af%25e5%258a%25a8%25e6%2596%25b9%25e5%25bc%258f\" class=\"wp-block-heading\">2. kernel-server \u8fdb\u7a0b\u4e0e\u542f\u52a8\u65b9\u5f0f<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>s6 \u670d\u52a1\u5b9a\u4e49\uff1a<code>\/etc\/s6-overlay\/s6-rc.d\/kernel-server\/run<\/code>\uff08type=longrun\uff0c\u65e0 dependencies \u6587\u4ef6\uff09<\/li><li>\u542f\u52a8\u811a\u672c\u5185\u5bb9\u8981\u70b9\uff1a<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\">  export WORKDIR=\"${KERNEL_SERVER_WORKDIR:-\/mnt\/agents}\"\n  export DISPLAY=:99; export XAUTHORITY=\/home\/kimi\/.Xauthority; export HOME=\/home\/kimi\n  mkdir -p ${WORKDIR}; chown -R kimi:kimi ${WORKDIR}; cd ${WORKDIR}\n  exec \/command\/s6-setuidgid kimi python3 \/app\/kernel_server.py --host 0.0.0.0 --port 8888<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5b9e\u9645\u73af\u5883\u53d8\u91cf <code>KERNEL_SERVER_WORKDIR=\/tmp\/kimi-project-kernel<\/code>\uff08\u89c1 <code>\/proc\/74\/environ<\/code>\uff09\uff0c\u6240\u4ee5<strong>\u4ee3\u7801\u6267\u884c cwd \u4e0d\u662f\u5de5\u4f5c\u533a <code>\/mnt\/agents<\/code>\uff0c\u800c\u662f <code>\/tmp\/kimi-project-kernel<\/code><\/strong>\u3002\u5b9e\u6d4b <code>os.getcwd()<\/code> \u8fd4\u56de <code>\/tmp\/kimi-project-kernel<\/code>\uff0c<code>os.getuid()=999<\/code>\uff08kimi\uff09\u3002<\/li><li>\u8fdb\u7a0b\u540c\u65f6\u6ce8\u5165 <code>DISPLAY=:99<\/code>\uff08Xvnc \u865a\u62df\u663e\u793a\uff09\uff0c\u56e0\u6b64 kernel \u91cc\u8dd1\u7684\u4ee3\u7801\u53ef\u4ee5\u76f4\u63a5\u64cd\u4f5c GUI\/\u622a\u56fe\u3002<\/li><li>\u955c\u50cf\/\u6784\u5efa\u4fe1\u606f\uff1a<code>MOONBOX_PROJECT_TEMPLATE_VERSION=project-20260811-2<\/code>\uff0cPython 3.12.12\uff0cpip \u6e90\u6307\u5411 <code>pypi.mirrors.msh.team<\/code> \/ <code>mirrors.cloud.aliyuncs.com<\/code>\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"3-kernelserver-%25e7%259a%2584-http-apiappkernelserverpy%25e7%25ba%25a6-330-%25e8%25a1%258c\" class=\"wp-block-heading\">3. kernel-server \u7684 HTTP API\uff08\/app\/kernel_server.py\uff0c\u7ea6 330 \u884c\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FastAPI \u5e94\u7528\uff0cuvicorn \u8dd1\u5728 <code>0.0.0.0:8888<\/code>\u3002\u7aef\u70b9\u6e05\u5355\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u65b9\u6cd5<\/th><th>\u8def\u5f84<\/th><th>\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td>GET<\/td><td><code>\/<\/code><\/td><td>\u670d\u52a1\u4fe1\u606f<\/td><\/tr><tr><td>GET<\/td><td><code>\/health<\/code><\/td><td>kernel \u521d\u59cb\u5316\u68c0\u67e5\uff08\u672a\u521d\u59cb\u5316 503\uff09<\/td><\/tr><tr><td>GET<\/td><td><code>\/kernel\/status<\/code><\/td><td>alive \/ pid \/ connection_file \/ client_connected<\/td><\/tr><tr><td>GET<\/td><td><code>\/kernel\/connection<\/code><\/td><td>\u8fd4\u56de\u5b8c\u6574 connection_info\uff08<strong>\u542b ZMQ HMAC key \u660e\u6587<\/strong>\uff09<\/td><\/tr><tr><td>GET<\/td><td><code>\/kernel\/connection-file<\/code><\/td><td>\u7b80\u5316\u7248\u8fde\u63a5\u6587\u4ef6\u8def\u5f84<\/td><\/tr><tr><td>GET<\/td><td><code>\/kernel\/debug<\/code><\/td><td>KernelManager \u5185\u90e8\u72b6\u6001 dump\uff08&#8221;\u5f00\u53d1\u7528&#8221;\u4f46\u751f\u4ea7\u5f00\u7740\uff09<\/td><\/tr><tr><td>POST<\/td><td><code>\/kernel\/reset<\/code><\/td><td>\u9500\u6bc1\u5e76\u91cd\u542f kernel<\/td><\/tr><tr><td>POST<\/td><td><code>\/kernel\/interrupt<\/code><\/td><td>SIGINT \u4e2d\u65ad<\/td><\/tr><tr><td>POST<\/td><td><code>\/kernel\/execute<\/code><\/td><td>\u6267\u884c\u4ee3\u7801\uff0c<code>{code, timeout(\u9ed8\u8ba430s), restart(bool)}<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9274\u6743\uff1a\u5b8c\u5168\u6ca1\u6709\u3002<\/strong> \u65e0 token\u3001\u65e0\u7b7e\u540d\u3001\u65e0 IP \u767d\u540d\u5355\uff0cCORS \u914d\u7f6e\u4e3a <code>allow_origins=[\"*\"]<\/code> + <code>allow_credentials=True<\/code>\u3002\u6211\u5728\u6c99\u7bb1\u5185\u4e0d\u5e26\u4efb\u4f55\u51ed\u636e\u76f4\u63a5\u6267\u884c\u6210\u529f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -s -X POST http:\/\/127.0.0.1:8888\/kernel\/execute \\\n    -H 'Content-Type: application\/json' -d '{\"code\":\"print(1+1)\",\"timeout\":10}'\n{\"success\":true,\"output\":\"2\",\"error\":null,\"images\":[]}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b89\u5168\u6027\u5b8c\u5168\u4f9d\u8d56\u7f51\u7edc\u5c42\u9694\u79bb\uff08\u5bb9\u5668\u4e0d\u51fa\u7f51\u5230\u975e\u6388\u6743\u65b9\uff09\u3002\u4efb\u4f55\u4eba\u80fd\u5230 8888 \u5c31\u80fd\u4ee5 kimi \u8eab\u4efd\u6267\u884c\u4efb\u610f\u4ee3\u7801\uff0c\u4e14 <code>\/kernel\/connection<\/code> \u8fd8\u4f1a\u6cc4\u9732 ZMQ HMAC key\uff08\u5b9e\u6d4b\u503c\u4e3a <code>b447fec7-...<\/code>\uff0cUUID \u683c\u5f0f\uff09\uff0c\u62ff\u5230\u540e\u53ef\u7ed5\u8fc7 kernel-server \u76f4\u63a5\u8fde ZMQ \u7aef\u53e3\u6267\u884c\u3002<\/p>\n\n\n\n<h2 id=\"4-ipykernel-%25e7%259a%2584%25e5%2590%25af%25e5%258a%25a8%25e4%25b8%258e%25e7%25ae%25a1%25e7%2590%2586appjupyterkernelpy%25e7%25ba%25a6-470-%25e8%25a1%258c\" class=\"wp-block-heading\">4. ipykernel \u7684\u542f\u52a8\u4e0e\u7ba1\u7406\uff08\/app\/jupyter_kernel.py\uff0c\u7ea6 470 \u884c\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>JupyterKernel<\/code> \u7c7b\u5c01\u88c5 <code>jupyter_client.manager.KernelManager<\/code>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>\u542f\u52a8<\/strong>\uff1a<code>KernelManager(ip=get_host_ip())<\/code> \u2192 <code>start_kernel()<\/code>\uff0cjupyter_client \u81ea\u52a8\u751f\u6210 connection file\uff08\u672c\u6b21\u4e3a <code>\/tmp\/tmpc80xj0x6.json<\/code>\uff09\uff0c\u518d\u8d77 client\u3001<code>start_channels()<\/code>\uff0c\u5faa\u73af <code>wait_for_ready(timeout=30)<\/code>\u3002\u6ce8\u610f\u6784\u9020\u65f6\u4f20\u4e86\u5bb9\u5668 hostname IP\uff0c\u4f46\u5b9e\u9645 connection file \u91cc <code>ip<\/code> \u5b57\u6bb5\u662f <code>127.0.0.1<\/code>\uff085 \u4e2a ZMQ \u7aef\u53e3\u4e3a 127.0.0.1 \u4e0a\u7684\u968f\u673a\u9ad8\u4f4d\u7aef\u53e3\uff1ashell 45059 \/ iopub 45759 \/ stdin 44903 \/ control 49717 \/ hb 57453\uff0c\u4e0e <code>netstat -tln<\/code> \u8f93\u51fa\u4e00\u4e00\u5bf9\u5e94\uff09\u3002<\/li><li><strong>\u521d\u59cb\u5316\u811a\u672c<\/strong>\uff1a\u6bcf\u6b21\u65b0 kernel \u542f\u52a8\u540e\u7f6e <code>_init_script_pending=True<\/code>\uff0c\u5728\u4e0b\u4e00\u6b21 <code>\/kernel\/execute<\/code> \u524d\u5148\u6267\u884c <code>\/app\/ipython.py.init<\/code>\uff1b\u5931\u8d25\u5219\u6574\u4e2a\u8bf7\u6c42 500\u3002init \u811a\u672c\u5185\u5bb9\uff1amatplotlib inline + \u5168\u5957 rcParams\uff08\u4e2d\u6587\u5b57\u4f53\u63a2\u6d4b\uff1a\u626b\u63cf fontManager \u91cc\u540d\u5b57\u542b CJK\/Han\/CN\/TW\/JP \u7684\u5b57\u4f53\u8ffd\u52a0\u5230 font.family\uff09\u3001\u6ce8\u518c <code>ImageShow.IPythonViewer<\/code> \u8ba9 PIL \u56fe\u7247\u76f4\u63a5\u4ee5 PNG \u56de\u4f20\u3002<\/li><li><strong>\u4fdd\u6d3b<\/strong>\uff1a\u6bcf\u6b21 execute \u524d <code>_ensure_kernel_alive()<\/code>\u2014\u2014\u68c0\u67e5 <code>is_alive()<\/code> \u548c <code>kernel_info()<\/code> \u63a2\u6d3b\uff0c\u5931\u8d25\u81ea\u52a8 <code>_start_kernel()<\/code> \u91cd\u542f\u3002<\/li><li><strong>\u5e76\u53d1<\/strong>\uff1akernel_server \u7528\u4e00\u628a\u5168\u5c40 <code>asyncio.Lock<\/code>\uff0c\u6240\u6709 execute\/reset \u4e32\u884c\uff08\u5355 kernel \u6a21\u578b\uff0c\u540c\u4e00\u65f6\u523b\u53ea\u6709\u4e00\u4e2a\u6267\u884c\uff09\u3002<\/li><li><strong>\u4e2d\u65ad<\/strong>\uff1a\u53cc\u4fdd\u9669\u2014\u2014\u5148\u6309 PID \u53d1 SIGINT\uff08<code>_get_kernel_pid()<\/code> \u6709 4 \u7ea7 fallback\uff1aprovisioner.process.pid \u2192 km.kernel.pid \u2192 \u6309 kernel_id \u626b psutil \u8fdb\u7a0b \u2192 \u6309 connection file \u540d\u626b\u8fdb\u7a0b\uff09\uff0c\u518d\u5c1d\u8bd5 client.interrupt()\u3002<\/li><li><strong>\u8d85\u65f6<\/strong>\uff1aexecute \u8d85\u8fc7 timeout \u540e\u81ea\u52a8 interrupt\uff0c\u7b49\u5f85 kernel \u56de idle\uff0c\u8fd4\u56de <code>Execution timed out after N seconds<\/code>\u3002\u5f02\u5e38\u8def\u5f84\u8fd8\u4f1a\u81ea\u52a8\u91cd\u542f kernel\u3002<\/li><li><strong>\u83b7\u53d6 PID \u7684\u56db\u7ea7 fallback<\/strong> \u662f\u4e2a\u7ec6\u8282\u4eae\u70b9\uff1a\u517c\u5bb9 jupyter-client \u65b0\u65e7\u7248\u672c\uff0c\u5bf9 Hermes \u7ba1\u7406\u5b50\u8fdb\u7a0b\u6709\u53c2\u8003\u4ef7\u503c\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"5-%25e6%2589%25a7%25e8%25a1%258c%25e7%25bb%2593%25e6%259e%259c%25e7%259a%2584%25e5%259b%259e%25e4%25bc%25a0%25e5%258d%258f%25e8%25ae%25ae\" class=\"wp-block-heading\">5. \u6267\u884c\u7ed3\u679c\u7684\u56de\u4f20\u534f\u8bae<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">kernel-server \u53ea\u6d88\u8d39 iopub \u901a\u9053\uff0c\u6309 <code>msg_type<\/code> \u5206\u6d41\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>stream<\/code> \u2192 \u539f\u6837\u62fc\u63a5 stdout\/stderr \u6587\u672c<\/li><li><code>error<\/code> \u2192 traceback \u62fc\u63a5\u8fdb <code>error<\/code> \u5b57\u6bb5<\/li><li><code>execute_result<\/code> \u2192 \u53d6 <code>text\/plain<\/code> \u8ffd\u52a0\u5230 output\uff1b\u6709 <code>image\/png<\/code> \u6536\u8fdb images<\/li><li><code>display_data<\/code> \u2192 \u4f18\u5148\u6536 <code>image\/png<\/code>\uff0c\u5426\u5219 <code>text\/plain<\/code><\/li><li>\u7ec8\u6b62\u6761\u4ef6\uff1a\u6536\u5230\u672c msg_id \u7684 <code>status: idle<\/code><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u54cd\u5e94 JSON\uff1a<code>{success, output(str), error, images[list[str]]}<\/code>\u2014\u2014<strong>\u56fe\u7247\u662f base64 PNG \u6570\u7ec4\u76f4\u63a5\u5185\u8054\u5728 HTTP \u54cd\u5e94\u91cc<\/strong>\uff0c\u524d\u7aef\/agent \u62ff\u5230\u5373\u53ef\u6e32\u67d3\u3002\u6ca1\u6709\u5355\u72ec\u7684\u6d41\u5f0f\u63a5\u53e3\uff0c\u662f\u4e00\u6b21\u6027\u540c\u6b65\u8fd4\u56de\uff08SSE\/WebSocket \u6d41\u5f0f\u7531\u4e91\u7aef agent \u4fa7\u81ea\u5df1\u5904\u7406\u6216\u6ca1\u6709\uff09\u3002<\/p>\n\n\n\n<h2 id=\"6-%25e5%25ae%2589%25e5%2585%25a8%25e9%2599%2590%25e5%2588%25b6%25e4%25b8%258e%25e6%258b%25a6%25e6%2588%25aa%25e9%2580%25bb%25e8%25be%2591%25e9%2587%258d%25e7%2582%25b9%25e5%2587%25a0%25e4%25b9%258e%25e6%25b2%25a1%25e6%259c%2589\" class=\"wp-block-heading\">6. \u5b89\u5168\u9650\u5236\u4e0e\u62e6\u622a\u903b\u8f91\uff08\u91cd\u70b9\uff1a\u51e0\u4e4e\u6ca1\u6709\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">kernel-server \/ jupyter_kernel \u4e24\u5c42<strong>\u6ca1\u6709\u4efb\u4f55\u4ee3\u7801\u5ba1\u67e5\u3001\u547d\u4ee4\u9ed1\u540d\u5355\u3001\u7f51\u7edc\/\u6587\u4ef6\u7cfb\u7edf\u62e6\u622a<\/strong>\u3002\u5df2\u9a8c\u8bc1\u7684\u9650\u5236\u53ea\u6709\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u6267\u884c\u8d85\u65f6\uff08\u9ed8\u8ba4 30s\uff0c\u8c03\u7528\u65b9\u53ef\u8c03\u5927\uff09+ \u8d85\u65f6\u81ea\u52a8 SIGINT<\/li><li>\u5168\u5c40\u4e32\u884c\u9501\uff08\u5355 kernel\uff09<\/li><li>\u4ee5\u975e root \u7528\u6237 kimi\uff08uid 999\uff09\u8fd0\u884c<\/li><li>ZMQ \u901a\u9053\u672c\u8eab\u7684 HMAC-SHA256 \u7b7e\u540d\uff08\u9632\u7684\u662f\u4e71\u8fde\uff0c\u4e0d\u662f\u6743\u9650\u63a7\u5236\uff09<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5373\uff1a\u5b89\u5168\u6a21\u578b = &#8220;\u5bb9\u5668\u5373\u6c99\u7bb1&#8221;\uff0c\u9694\u79bb\u8fb9\u754c\u5728\u5bb9\u5668\/\u7f51\u7edc\u5c42\uff08\u53ea\u6709 portal \u7f51\u5173\u5bf9\u5916\uff09\uff0c\u4e0d\u5728\u8fd0\u884c\u65f6\u5185\u3002\u62e6\u622a\u7c7b\u903b\u8f91\uff08browser-guard \u7ba1\u7684\u662f\u6d4f\u89c8\u5668\u5bfc\u822a\uff0c\u4e0d\u5728\u672c\u8282\u8303\u56f4\uff09\u4e0e\u4ee3\u7801\u6267\u884c\u65e0\u5173\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/app\/utils.py<\/code>\uff08\u7ea6 50 \u884c\uff09\u53ea\u662f\u4e09\u4e2a\u5c0f\u5de5\u5177\uff1a<code>get_screensize()<\/code>\uff08\u8c03 xrandr \u62ff Xvnc \u5206\u8fa8\u7387\uff09\u3001<code>run_command()<\/code>\u3001<code>run_command_background()<\/code>\u2014\u2014\u4f9b kernel \u5185\u4ee3\u7801 import \u7528\uff0c\u8fdb\u4e00\u6b65\u5370\u8bc1&#8221;GUI + shell \u80fd\u529b\u76f4\u63a5\u66b4\u9732\u7ed9\u6a21\u578b\u4ee3\u7801&#8221;\u7684\u8bbe\u8ba1\u53d6\u5411\u3002<\/p>\n\n\n\n<h2 id=\"7-%25e7%25ab%25af%25e5%258f%25a3%25e5%25bd%2592%25e5%25b1%259enetstatss-%25e5%25ae%259e%25e6%25b5%258b\" class=\"wp-block-heading\">7. \u7aef\u53e3\u5f52\u5c5e\uff08netstat\/ss \u5b9e\u6d4b\uff09<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u7aef\u53e3<\/th><th>\u7ed1\u5b9a<\/th><th>\u8fdb\u7a0b<\/th><\/tr><\/thead><tbody><tr><td>8888<\/td><td>0.0.0.0<\/td><td>kernel_server.py (PID 74, kimi) \u2190 <strong>\u672c\u8282\u4e3b\u89d2<\/strong><\/td><\/tr><tr><td>9222<\/td><td>127.0.0.1<\/td><td>Chromium CDP<\/td><\/tr><tr><td>9223<\/td><td>0.0.0.0<\/td><td>project-cdp-proxy.py (PID 64\uff0cCDP \u4ee3\u7406)<\/td><\/tr><tr><td>6080<\/td><td>0.0.0.0<\/td><td>Xvnc\/kasmvnc websocket (<code>-websocketPort 6080<\/code>)<\/td><\/tr><tr><td>18080<\/td><td>0.0.0.0<\/td><td><code>python3 -m http.server --directory \/tmp\/project-probe<\/code>\uff08PID 17, root\uff09<\/td><\/tr><tr><td>8080 \/ 32001<\/td><td>tcp6 :::<\/td><td>Go \u670d\u52a1\uff08portal PID 65 \/ envd PID 77\uff09\uff0c\u6839\u8def\u5f84\u8fd4\u56de &#8220;404 page not found&#8221;\uff08Go \u98ce\u683c\uff09<\/td><\/tr><tr><td>45059\/45759\/44903\/49717\/57453<\/td><td>127.0.0.1<\/td><td>ipykernel \u7684 5 \u4e2a ZMQ \u7aef\u53e3<\/td><\/tr><tr><td>22<\/td><td>0.0.0.0<\/td><td>sshd<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\uff1akernel-server \u65e5\u5fd7\u8d70 stdout\uff08<code>logging.basicConfig<\/code>\uff0c<code>S6_LOGGING=0<\/code>\uff09\uff0c<code>\/app\/logs\/<\/code> \u76ee\u5f55\u4e3a\u7a7a\u2014\u2014\u6ca1\u6709\u843d\u76d8\u65e5\u5fd7\uff0c\u6392\u67e5\u53ea\u80fd\u9760 s6 \u6355\u83b7\u6216 \/proc\u3002<\/p>\n\n\n\n<h2 id=\"8-%25e6%2595%258f%25e6%2584%259f%25e4%25bf%25a1%25e6%2581%25af%25e8%25ae%25b0%25e5%25bd%2595%25e5%25b7%25b2%25e8%2584%25b1%25e6%2595%258f\" class=\"wp-block-heading\">8. \u654f\u611f\u4fe1\u606f\u8bb0\u5f55\uff08\u5df2\u8131\u654f\uff09<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>ZMQ HMAC key\uff1a<code>\/tmp\/tmpc80xj0x6.json<\/code> \u5185 <code>key<\/code> \u5b57\u6bb5\uff0cUUID \u683c\u5f0f <code>b447fec7...<\/code>\uff0c\u4e14\u53ef\u901a\u8fc7\u65e0\u9274\u6743\u7684 <code>GET \/kernel\/connection<\/code> \u8fdc\u7a0b\u8bfb\u53d6 \u2014\u2014 \u8bbe\u8ba1\u4e0a\u7684\u5f31\u70b9\u3002<\/li><li><code>SSH_PASSWORD=sshpassword<\/code> \u660e\u6587\u51fa\u73b0\u5728 kernel-server \u8fdb\u7a0b\u73af\u5883\u53d8\u91cf\uff08\/proc\/74\/environ\uff09\u2014\u2014\u5360\u4f4d\u5f31\u5bc6\u7801\u3002<\/li><li>pip \u5185\u7f51\u6e90\u5730\u5740 <code>pypi.mirrors.msh.team<\/code>\u3001<code>kimi-api-sandbox.msh.team<\/code>\uff08portal \u7f51\u5173\u5730\u5740\uff09\u3002<\/li><\/ul>\n\n\n\n<h2 id=\"9-%25e5%25af%25b9-hermes-%25e5%258f%25af%25e7%25a7%25bb%25e6%25a4%258d%25e7%259a%2584%25e7%25bb%2593%25e8%25ae%25ba\" class=\"wp-block-heading\">9. \u5bf9 Hermes \u53ef\u79fb\u690d\u7684\u7ed3\u8bba<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>\u6574\u4f53\u6a21\u5f0f\uff08FastAPI \u5305 KernelManager\u3001HTTP \u540c\u6b65\u805a\u5408 iopub\u3001base64 \u56fe\u7247\u5185\u8054\u56de\u4f20\uff09\u7b80\u5355\u53ef\u9760\uff0c\u53ef\u76f4\u63a5\u501f\u9274\uff1bjupyer_kernel.py 470 \u884c\u5373\u8986\u76d6\u542f\u52a8\/\u4fdd\u6d3b\/\u4e2d\u65ad\/\u8d85\u65f6\/\u91cd\u7f6e\u5168\u751f\u547d\u5468\u671f\u3002<\/li><li>Kimi \u9009\u62e9\u4e86&#8221;\u96f6\u9274\u6743 + \u5bb9\u5668\u7f51\u7edc\u9694\u79bb&#8221;\uff1bHermes \u82e5\u90e8\u7f72\u5f62\u6001\u4e0d\u540c\uff08\u591a\u79df\u6237\/\u66b4\u9732\u7aef\u53e3\uff09\uff0c8888 \u8fd9\u7c7b\u7aef\u70b9\u5fc5\u987b\u52a0 token\uff0c\u4e14\u4e0d\u5e94\u63d0\u4f9b <code>\/kernel\/connection<\/code>\u3001<code>\/kernel\/debug<\/code> \u8fd9\u79cd\u6cc4\u9732\u8fde\u63a5\u5bc6\u94a5\u7684\u8c03\u8bd5\u7aef\u70b9\u3002<\/li><li>init \u811a\u672c\u673a\u5236\uff08\u6bcf\u6b21 reset \u540e\u81ea\u52a8\u91cd\u653e matplotlib\/\u5b57\u4f53\/PIL viewer \u914d\u7f6e\uff09\u662f\u8ba9&#8221;\u6a21\u578b\u753b\u56fe\u2192\u56de\u4f20\u56fe\u7247&#8221;\u4f53\u9a8c\u7a33\u5b9a\u7684\u5173\u952e\u7ec6\u8282\uff0c\u503c\u5f97\u7167\u642c\u3002<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u2190 \u8fd4\u56de\u4e3b\u62a5\u544a\uff1aKimi Agent\uff08\u4e91\u7aef\u6c99\u7bb1\uff09\u6280\u672f\u62a5\u544a \uff5c GitHub \u539f\u6587 \u5408\u89c4\u4e0e\u98ce\u9669\u58f0\u660e\uff1a\u672c\u62a5\u544a\u4e3a\u5b89\u5168 &hellip; <a href=\"https:\/\/tongchun.website\/index.php\/kimiagent-02-runtime\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201c02-runtime \u2014 Kimi \u6c99\u7bb1\u4ee3\u7801\u6267\u884c\u8fd0\u884c\u65f6\uff08kernel-server \/ ipykernel\uff09\u201d<\/span><\/a><\/p>\n","protected":false},"author":55404,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"wpai_generated_summary":"","wpai_meta_description":"","footnotes":""},"class_list":["post-1868","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/users\/55404"}],"replies":[{"embeddable":true,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/comments?post=1868"}],"version-history":[{"count":1,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1868\/revisions"}],"predecessor-version":[{"id":1888,"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/pages\/1868\/revisions\/1888"}],"wp:attachment":[{"href":"https:\/\/tongchun.website\/index.php\/wp-json\/wp\/v2\/media?parent=1868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}