AIO Sandbox MCP 集成实战:通过单一端点聚合浏览器、文件、终端与文档服务的 Agent 工具接入指南
AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载AIO SandboxAll-in-One Sandbox for AI Agents在单个 Docker 容器内集成了 Browser、Shell、File、MCP 与 VSCode Server其中内置的MCP Hub为 AI Agent 提供了统一入口Agent 只需连接一个端点即可调用浏览器自动化、文件操作、Shell 命令与文档转换等全部能力。本文以官方文档 MCP 集成指南 为主体结合 Python SDK 与 JS SDK 的源码实现带你完成从连接、工具调用、错误处理到安全加固的完整接入。什么是 MCP HubMCPModel Context Protocol模型上下文协议是 AI Agent 与外部工具、服务进行交互的标准化协议。AIO Sandbox 内置了一个预配置的 MCP Hub将多个实用 MCP 服务器聚合到一起通过单个端点对外提供统一访问能力——这意味着 Agent 不需要为每种能力单独维护一套连接与鉴权逻辑只需面向一个端点即可。从 SDK 源码可以印证这种聚合设计Python SDK 的 MCP 客户端提供了list_mcp_tools、execute_mcp_tool、list_mcp_servers三个核心方法见 sdk/python/agent_sandbox/mcp/client.py分别对应按服务器列出工具执行指定服务器上的工具列出所有已配置服务器而原始请求层sdk/python/agent_sandbox/mcp/raw_client.py揭示了背后的 REST 路由GET v1/mcp/servers—— 列出配置的 MCP 服务器支持include_hidden参数GET v1/mcp/{server_name}/tools—— 列出指定服务器的全部工具POST v1/mcp/{server_name}/tools/{tool_name}—— 执行指定工具也就是说MCP Hub 既对外暴露/mcp协议端点也通过v1/mcp/*REST API 提供等价的编程访问能力两类入口服务于不同的集成场景。内置 MCP 服务器MCP Hub 默认聚合了四类服务器全部包含在/mcp端点下服务器功能典型用例Browser ServerWeb 浏览、页面交互、截图捕获Web 抓取、表单填写、内容提取File Server文件系统操作、搜索、内容处理代码生成、文件处理、数据管理Terminal ServerShell 命令执行、进程管理构建自动化、系统管理、开发工作流Markitdown Server文档转换、Markdown 处理文档生成、内容转换四类服务器恰好覆盖了 AI Agent 在沙箱环境中的高频需求浏览器负责看与操作网页文件负责读写与检索数据终端负责执行命令与运行程序Markitdown 负责把各类文档转换为 Agent 最容易消费的 Markdown。访问 MCP 服务HTTP 端点MCP Hub 的 HTTP 入口为GET http://localhost:8080/mcp该端点基于Streamable HTTP 协议支持实时通信——Agent 可以流式接收工具执行过程中的中间输出而不是等全部完成后再一次性返回。此外根据官方示例website/docs/en/examples/agent.mdMCP Hub 同时支持 WebSocket 方式连接ws://localhost:8080/mcp可通过 JSON-RPC 消息执行servers/list、tools/list、tools/call等方法适合需要长连接、双向通信的 Agent 框架。Python 连接示例以下示例通过httpx直接向 MCP Hub 发起tools/call调用让浏览器导航到指定 URLimport httpx import json async def query_mcp_hub(): async with httpx.AsyncClient() as client: response await client.post( http://localhost:8080/mcp, json{ method: tools/call, params: { name: browser_navigate, arguments: { url: https://example.com } } } ) return response.json()JavaScript 示例前端或 Node.js 侧同样可以用fetch完成工具调用async function callMCPTool(toolName, args) { const response await fetch(http://localhost:8080/mcp, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ method: tools/call, params: { name: toolName, arguments: args } }) }); return await response.json(); } // 使用示例 const result await callMCPTool(file_read, { path: /tmp/example.txt });通过官方 SDK 访问推荐直接拼接 JSON-RPC 消息容易出错官方 SDK 已经封装好了完整调用链。Python 侧使用方式如下对应 sdk/python/agent_sandbox/mcp/client.pyfrom agent_sandbox import Sandbox client Sandbox(base_urlhttp://localhost:8080) # 列出所有已配置的 MCP 服务器 servers client.mcp.list_mcp_servers() # 列出某个服务器的全部工具 tools client.mcp.list_mcp_tools(server_namebrowser) # 执行指定工具 result client.mcp.execute_mcp_tool( server_namefile, tool_namewrite, request{path: /tmp/hello.txt, content: hello}, )JS/TypeScript 侧提供等价能力sdk/js/src/api/resources/mcp/client/Client.tsawait client.mcp.listMcpServers({ include_hidden: true }); await client.mcp.listMcpTools(browser); await client.mcp.executeMcpTool(file, write, { path: /tmp/hello.txt, content: hello, });值得注意的是SDK 将工具执行封装为POST v1/mcp/{server_name}/tools/{tool_name}参数以request字典透传服务端负责参数校验非法请求返回 422这比手工维护tools/call的 JSON-RPC 消息更安全、更省心。工具分类MCP Hub 对外暴露的工具按能力划分为四类可直接作为 Agent 的 function calling 工具清单浏览器工具工具说明browser_navigate导航到指定 URLbrowser_click点击页面元素browser_type在输入框输入文本browser_screenshot捕获页面截图browser_extract提取页面内容文件工具工具说明file_read读取文件内容file_write写入文件file_list列出目录内容file_search搜索文件内容file_replace替换文件中的文本终端工具工具说明terminal_execute运行 Shell 命令terminal_session管理终端会话terminal_kill终止进程sandbox_execute_bash运行 Bash 管道命令支持truncate参数默认会截断超长输出设为truncate: false时返回完整输出详见 Bash 管道指南文档工具工具说明markitdown_convert将文档转换为 Markdownmarkitdown_extract从文档中提取内容Agent 集成模式基础 Agent 封装将 MCP 调用封装成 Agent 的一个方法是最直接的集成模式。下面的MCPAgent把工具调用收敛到call_tool并给出一个浏览网页 → 截图 → 提取内容 → 写入文件的完整业务示例import asyncio from openai import AsyncOpenAI class MCPAgent: def __init__(self, sandbox_urlhttp://localhost:8080): self.sandbox_url sandbox_url self.client AsyncOpenAI() async def call_tool(self, tool_name, **kwargs): 通过沙盒调用 MCP 工具 async with httpx.AsyncClient() as client: response await client.post( f{self.sandbox_url}/mcp, json{ method: tools/call, params: { name: tool_name, arguments: kwargs } } ) return response.json() async def browse_and_analyze(self, url): 示例浏览页面并分析内容 # 导航到页面 await self.call_tool(browser_navigate, urlurl) # 截图 screenshot await self.call_tool(browser_screenshot) # 提取内容 content await self.call_tool(browser_extract) # 保存内容到文件 await self.call_tool(file_write, path/tmp/content.txt, contentcontent[text]) return { screenshot: screenshot, content: content, saved_to: /tmp/content.txt }browse_and_analyze展示了一个典型的多工具编排浏览器工具负责采集文件工具负责持久化两者经由同一个 MCP Hub 串联Agent 无需感知底层实现差异。WebSocket 长连接模式对于需要保持会话、实时接收通知的 Agent 框架官方示例website/docs/en/examples/agent.md演示了 WebSocket 方式连接ws://localhost:8080/mcp后通过 JSON-RPC 消息分别发送servers/list、tools/list、tools/call附带server、name、arguments参数即可完成服务器发现、工具发现与工具调用适合低延迟、双向交互的集成场景。错误处理常见错误Agent 调用工具时必须对网络、协议、工具本身三类错误分别处理。robust_mcp_call给出了完整的防御式封装async def robust_mcp_call(tool_name, **kwargs): 带有适当错误处理的 MCP 调用 try: response await client.post( http://localhost:8080/mcp, json{ method: tools/call, params: { name: tool_name, arguments: kwargs } }, timeout30.0 ) if response.status_code ! 200: raise Exception(fMCP 调用失败{response.status_code}) result response.json() if error in result: raise Exception(f工具错误{result[error]}) return result except httpx.TimeoutException: raise Exception(MCP 调用超时) except httpx.ConnectError: raise Exception(无法连接到 MCP Hub) except Exception as e: raise Exception(fMCP 调用失败{str(e)})要点有三超时控制timeout30.0防止长时间挂起、HTTP 状态码检查非 200 直接抛错、响应体错误检查协议层成功但工具执行失败时错误会出现在result[error]中。重试逻辑瞬时故障如网络抖动可通过带抖动的指数退避重试来吸收import asyncio import random async def retry_mcp_call(tool_name, max_retries3, **kwargs): 带有指数退避重试的 MCP 调用 for attempt in range(max_retries): try: return await robust_mcp_call(tool_name, **kwargs) except Exception as e: if attempt max_retries - 1: raise e # 带抖动的指数退避 delay (2 ** attempt) random.uniform(0, 1) await asyncio.sleep(delay)2 ** attempt random.uniform(0, 1)在指数退避的基础上加入随机抖动避免多个 Agent 同时重试造成重试风暴默认最多重试 3 次最后一次失败时直接抛出原始异常。性能优化连接池与并发调用复用httpx.AsyncClient并配置连接池可以显著降低 TCP/TLS 握手开销配合asyncio.gather可批量并发执行多个工具调用import httpx class OptimizedMCPClient: def __init__(self, sandbox_url, max_connections10): self.sandbox_url sandbox_url self.client httpx.AsyncClient( limitshttpx.Limits(max_connectionsmax_connections), timeouthttpx.Timeout(30.0) ) async def call_tool_batch(self, calls): 并发执行多个 MCP 调用 tasks [] for tool_name, kwargs in calls: task self.call_tool(tool_name, **kwargs) tasks.append(task) return await asyncio.gather(*tasks, return_exceptionsTrue) async def close(self): await self.client.aclose()return_exceptionsTrue保证一个调用失败不会拖垮整批任务——失败项会作为异常对象返回由调用方逐项甄别。结果缓存对于file_read、browser_extract这类幂等、结果短期内不变的工具调用可以按工具名 参数生成缓存键并设置 TTL避免重复执行昂贵的操作from functools import lru_cache import hashlib class CachedMCPClient: def __init__(self): self._cache {} def _cache_key(self, tool_name, **kwargs): 为工具调用生成缓存键 content f{tool_name}:{sorted(kwargs.items())} return hashlib.md5(content.encode()).hexdigest() async def cached_call_tool(self, tool_name, ttl300, **kwargs): 带缓存的工具调用 cache_key self._cache_key(tool_name, **kwargs) # 检查缓存 if cache_key in self._cache: cached_result, timestamp self._cache[cache_key] if time.time() - timestamp ttl: return cached_result # 实际调用 result await self.call_tool(tool_name, **kwargs) # 缓存结果 self._cache[cache_key] (result, time.time()) return result_cache_key对参数做排序后拼接再取 MD5保证相同参数无论传入顺序生成一致的键TTL 默认 300 秒过期后自动重新调用。注意缓存只应应用于确定性的只读工具绝不要对file_write、terminal_execute等有副作用的调用启用缓存。安全考虑安全工具执行MCP Hub 聚合了终端、文件等高权限工具Agent 侧应当建立自己的工具白名单 受限工具二次校验机制ALLOWED_TOOLS [ browser_navigate, browser_extract, browser_screenshot, file_read, file_write, file_list, markitdown_convert ] RESTRICTED_TOOLS [ terminal_execute, # 需要验证 file_delete, # 需要确认 ] async def safe_tool_call(tool_name, **kwargs): 带验证的安全执行 MCP 工具 if tool_name not in ALLOWED_TOOLS: if tool_name in RESTRICTED_TOOLS: # 需要额外验证 if not await validate_restricted_call(tool_name, **kwargs): raise Exception(f受限工具调用不允许{tool_name}) else: raise Exception(f未知工具{tool_name}) return await call_tool(tool_name, **kwargs) async def validate_restricted_call(tool_name, **kwargs): 验证受限工具调用 if tool_name terminal_execute: command kwargs.get(command, ) # 阻止危险命令 dangerous_patterns [rm -rf, dd if, mkfs, /dev/] return not any(pattern in command for pattern in dangerous_patterns) return False策略分三层白名单内工具直接放行terminal_execute、file_delete等高风险工具先做参数级校验如拦截rm -rf、dd if、mkfs、 /dev/等危险模式再执行白名单与受限列表之外的工具一律拒绝。这在官方文档明确列为推荐实践website/docs/en/guide/basic/mcp.md是从能用到敢用的关键一步。监控与调试记录 MCP 调用给工具调用加上耗时与结果日志是排查 Agent 行为的基础设施import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) async def logged_mcp_call(tool_name, **kwargs): 带全面日志记录的 MCP 调用 start_time time.time() logger.info(fMCP 调用开始{tool_name} 参数 {kwargs}) try: result await call_tool(tool_name, **kwargs) duration time.time() - start_time logger.info(fMCP 调用完成{tool_name} 耗时 {duration:.2f}秒) return result except Exception as e: duration time.time() - start_time logger.error(fMCP 调用失败{tool_name} 耗时 {duration:.2f}秒 - {str(e)}) raise日志同时覆盖入参、耗时、成败三要素配合logger.error保留异常现场便于复现与回溯。调试期还可以借助 MCP 生态自带的 Inspector 工具连接http://localhost:8080/mcp传输类型选 Streamable HTTP在图形界面中查看各服务器暴露的工具清单、参数定义并直接执行工具观察返回结果与代码侧日志互相印证。延伸阅读Browser 集成指南 —— 浏览器自动化能力的完整说明Skills 指南 —— 注册与查询可复用的 Agent 工具包AIO CLI 指南 —— 在沙箱内部直接调用 MCP 工具Agent 集成示例 —— 基于 MCP 与 REST API 的真实 Agent 工作流API 参考文档 —— 完整的 REST API 说明赞分享AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载相关推荐Firecrawl Python SDK 实战指南从单页抓取到研究论文检索的完整开发手册Firecrawl Python SDK 实战指南从单页抓取到研究论文检索的完整开发手册 Firecrawl Python SDK 是 Firecrawl 网AI Agent后端MCP 服务浏览器控制Agent 评测AIO Sandbox 全解析面向 AI Agent 的单容器浏览器、终端、文件与 MCP 一体化沙箱环境AIO Sandbox 全解析面向 AI Agent 的单容器浏览器、终端、文件与 MCP 一体化沙箱环境 AIO Sandbox 是 GitHub 加速计划AI Agent后端MCP 服务浏览器控制Agent 评测Presenton 开源 AI 演示文稿生成器与 API从 Docker 部署、多模型接入到 PPTX 生成接口的完整实战指南Presenton 开源 AI 演示文稿生成器与 API从 Docker 部署、多模型接入到 PPTX 生成接口的完整实战指南 Presenton 是一款 AAI Agent后端MCP 服务浏览器控制Agent 评测上一篇Seraphine英雄联盟玩家的终极智能助手3分钟开启高效游戏体验下一篇AG Kit 触控交互心理学touch-psychology.md 全解——从 Fitts 定律、拇指热区到触感反馈与自动化触控审计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

flask-admin 辅助模块(flask_admin.helpers)源码级解析:视图上下文、表单校验与 Jinja2 渲染工具

flask-admin 辅助模块(flask_admin.helpers)源码级解析:视图上下文、表单校验与 Jinja2 渲染工具

后端 【免费下载链接】flask-admin Simple and extensible administrative interface framework for Flask 项目地址: https://gitcode.com/gh_mirrors/fl/flask-admin 点击查看 免费下载 本文围绕 Flask Admin 项目(Simple and extensible administrat…

2026/10/11 10:59:15 阅读更多 →
express-validator 入门实战:用 Express 中间件完成请求参数校验与错误报告

express-validator 入门实战:用 Express 中间件完成请求参数校验与错误报告

后端 【免费下载链接】express-validator An express.js middleware for validator.js. 项目地址: https://gitcode.com/gh_mirrors/ex/express-validator 点击查看 免费下载 express-validator 是一组面向 Express 的中间件集合,它在 validator.js 提供…

2026/10/11 15:04:45 阅读更多 →
Tauri 2 + React 桌面端开发:从 CLI 到 GUI 的进化

Tauri 2 + React 桌面端开发:从 CLI 到 GUI 的进化

摘要:终端界面虽然高效,但不是所有开发者都喜欢黑屏白字。cc-haha 的桌面端基于 Tauri 2 和 React 构建,将 AI 编程助手的能力封装到一个现代化的图形界面中。本文深入解析三层架构设计、WebSocket 实时通信、12 个 Zustand Store 的状态管理…

2026/10/11 10:59:15 阅读更多 →

最新新闻

Tesseract OCR中文识别实战:安装、调优与避坑指南

Tesseract OCR中文识别实战:安装、调优与避坑指南

简介:Tesseract OCR 安装包与中文语言包面向需要在本地完成图片文字识别的开发者、测试人员及自动化办公用户,尤其适合用 Python 调用 OCR 引擎处理中文文档、票据或截图的人群。压缩包共 723 个文件,约 36.01MB,以 C 源码&#x…

2026/10/12 17:54:23 阅读更多 →
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算:用 TaoToken 统一 Key 看清 JSONL 会话与用量账本

深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算:用 TaoToken 统一 Key 看清 JSONL 会话与用量账本

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 17:54:23 阅读更多 →
ResNet特征提取+SVM分类:乳腺癌病理图像检测实战

ResNet特征提取+SVM分类:乳腺癌病理图像检测实战

简介:这份资源面向医学影像分析与深度学习入门者,提供一套将ResNet深度残差网络与SVM支持向量机结合的乳腺癌检测完整方案,可用于辅助诊断、课程设计或算法复现练习。压缩包共25个文件,约7.1MB,包含Python脚本、模型权…

2026/10/12 17:54:23 阅读更多 →
2026年七款AI编程工具横评:TaoToken统一Key接入Cursor与Windsurf实测

2026年七款AI编程工具横评:TaoToken统一Key接入Cursor与Windsurf实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 17:54:22 阅读更多 →
Unity 鼠标图标更换实战:用 TaoToken 统一管理 Cursor 资源与 Script 配置

Unity 鼠标图标更换实战:用 TaoToken 统一管理 Cursor 资源与 Script 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 17:54:22 阅读更多 →
DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

简介:这是一套将DeepSeek大模型接入微信聊天的完整工程实现,适合具备基础Python技能、希望为个人微信账号提供智能对话能力的开发者。项目从模型加载、消息收发到前端交互均有配套代码,支持文本对话、Web界面操作,并附带文档上传与…

2026/10/12 17:53:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →