基于OpenCode与MCP协议实现AI Agent工具智能分配与团队协作
1. 项目概述从“工具闲置”到“智能分配”的进化如果你是一名开发者或者团队的技术负责人大概率遇到过这样的场景团队里引入了各种强大的工具——代码生成器、API测试平台、数据库管理客户端、性能监控脚本但用起来总是磕磕绊绊。张三习惯用A工具写SQL李四却用B工具做接口调试王五自己写了个小脚本处理日志但别人都不知道怎么用。结果就是工具买了不少许可证费用没少花但效率提升有限知识无法沉淀工具本身也成了“闲置资产”。这正是我们团队在引入AI Agent浪潮初期面临的真实困境。直到我们遇到了OpenCode和它的多Agent工具管理方案局面才彻底扭转。简单来说OpenCode不是一个单一的AI编程助手而是一个基于MCPModel Context Protocol协议的、可扩展的智能工具编排平台。它核心解决的不是“怎么写代码”而是“怎么让合适的工具在合适的时间被合适的任务自动调用”。我们实践的目标就是将散落各处的、孤立的“工具闲置”状态升级为系统化的、按需所取的“智能分配”工作流。这不仅仅是技术集成更是一次开发范式和团队协作模式的升级。2. 核心理念与架构拆解为什么是OpenCode和MCP在深入实操前必须理解我们选择OpenCode和MCP协议背后的逻辑。市面上AI编程插件很多为何独选它答案在于其“开放性”和“协议化”的设计哲学。2.1 MCP协议工具生态的“通用插座”你可以把MCPModel Context Protocol想象成电子设备里的“USB-C”接口。在过去每个AI助手如Cursor、Claude等想要连接一个外部工具比如查询数据库、调用天气API都需要针对这个工具开发专用的“驱动程序”或插件。这导致了大量重复劳动且工具和AI被紧密耦合。MCP协议的出现定义了一套标准化的“插头”和“插座”规范。任何工具只要按照MCP协议实现一个MCP Server就能像USB设备一样插到任何支持MCP协议的MCP Client如OpenCode、Cursor、Claude Desktop上立即被识别和使用。这意味着工具开发者只需写一次MCP Server工具就能在所有兼容MCP的AI环境中使用。团队可以封装内部工具如部署脚本、审批流程查询为MCP Server安全地集成到AI工作流中。使用者无需关心工具在哪、怎么调用AI Agent会根据当前任务上下文自动推荐并调用最合适的工具。我们选择OpenCode正是因为它不仅是一个优秀的MCP Client更在其之上构建了强大的多Agent管理和任务调度能力这是实现“智能分配”的关键。2.2 OpenCode的多Agent架构从“单兵”到“军团”传统的AI编程助手往往是“一个AI打天下”所有问题都丢给同一个模型。但不同任务有不同专精需求代码生成可能擅长但让它分析复杂的日志或执行多步骤的部署流程就可能力不从心。OpenCode引入了多Agent概念。你可以配置多个具有不同专长和工具集的Agent。例如代码专家Agent专注于代码生成、重构、解释绑定代码库搜索、语法检查等工具。运维助手Agent擅长部署、监控、日志分析绑定K8s API、日志查询、性能监控等MCP工具。测试专员Agent专注测试用例生成、API测试绑定Postman、Jira、测试覆盖率报告等工具。OpenCode的核心引擎扮演着“调度中心”的角色。当你提出一个需求如“帮我修复这个API的bug并部署到测试环境”调度中心会分解任务先让“代码专家”诊断和修复代码再自动将部署子任务交给“运维助手”去执行。这就是“智能分配”的雏形。3. 环境搭建与核心配置实战理解了理念我们进入实战。以下配置基于我们团队的生产实践你可以直接复现。3.1 OpenCode安装与基础配置OpenCode的安装非常灵活支持VS Code插件、独立桌面应用等多种方式。我们团队选择的是OpenCode Desktop独立应用因为它不依赖特定编辑器可以作为团队共享的AI工作站。安装步骤下载访问OpenCode官网根据你的操作系统Windows/macOS/Linux下载最新版本的安装包。安装像安装普通软件一样完成安装。首次启动时需要进行基础配置。模型配置在设置中添加你的AI模型API密钥如OpenAI GPT、Claude、DeepSeek等。OpenCode本身不提供模型而是作为调度中心去调用这些模型。建议至少配置一个主力代码模型如GPT-4和一个性价比高的轻量模型如Claude Haiku用于不同的任务分级处理。基础Agent创建在“Agents”标签页点击“新建”。这里你会看到一个关键配置项System Prompt系统指令。这是定义Agent性格和能力的关键。注意System Prompt的编写质量直接决定Agent的“专业度”。不要只写“你是一个编程助手”。要像给新员工写岗位说明书一样清晰。例如给“代码专家Agent”的Prompt可以这样写 “你是一个资深后端Java工程师特别擅长Spring Boot和数据库优化。你的职责是处理所有与代码生成、重构、调试、解释相关的请求。你必须严格遵守以下规则1. 生成的代码必须包含必要的异常处理和日志记录2. 优先考虑性能和可读性3. 在给出方案前先分析现有代码上下文和可能的风险。你的回答应专业、简洁、直接。”3.2 MCP Server的集成连接你的工具库这是将“闲置工具”接入智能平台的核心步骤。OpenCode内置了一个“MCP市场”可以一键添加许多热门工具如文件系统、Git、网页搜索等。但对于团队内部工具我们需要自定义集成。以集成一个内部“项目状态查询”工具为例假设我们有一个内部HTTP APIGET http://internal-api/project/{id}/status用于获取项目部署状态。创建MCP Server定义文件在你的工作目录下创建一个JSON文件例如project-status-mcp.json。MCP Server可以通过标准输入输出stdio或HTTP与Client通信。我们以简单的stdio方式为例。{ mcpServers: { project-status-tool: { command: node, args: [./server.js], // 指向你的MCP Server实现脚本 env: { API_BASE_URL: http://internal-api } } } }实现MCP Server脚本server.js你需要用任何语言Node.js/Python/Go等编写一个符合MCP协议的脚本。以下是Node.js的简化示例#!/usr/bin/env node const { Server } require(modelcontextprotocol/sdk/server); const { StdioServerTransport } require(modelcontextprotocol/sdk/server/stdio); const axios require(axios); const server new Server( { name: project-status-tool, version: 1.0.0, }, { capabilities: { tools: {}, // 声明本Server提供工具 }, } ); // 定义一个名为 get_project_status 的工具 server.setRequestHandler(tools/call, async (request) { if (request.params.name get_project_status) { const projectId request.params.arguments?.projectId; if (!projectId) { throw new Error(Missing projectId argument); } try { // 调用内部API const response await axios.get(${process.env.API_BASE_URL}/project/${projectId}/status); return { content: [ { type: text, text: 项目 ${projectId} 的当前状态为${response.data.status} 最后更新时间${response.data.lastUpdated}, }, ], }; } catch (error) { return { content: [ { type: text, text: 查询项目 ${projectId} 状态失败${error.message}, }, ], }; } } throw new Error(Unknown tool: ${request.params.name}); }); // 启动Server监听stdio const transport new StdioServerTransport(); server.connect(transport).catch(console.error);在OpenCode中加载自定义MCP Server打开OpenCode设置找到“MCP Servers”或“Advanced Settings”。将上面创建的project-status-mcp.json文件的路径配置进去或者直接在配置编辑器中添加对应的JSON块。重启OpenCode它就会自动启动你定义的Node.js脚本并将get_project_status工具注册到平台。为Agent分配工具进入你之前创建的“运维助手Agent”的编辑页面。在“可用工具”列表中你现在应该能看到project-status-tool.get_project_status。勾选它这个工具就正式授权给了“运维助手Agent”。当该Agent被调度时它就可以在需要时调用这个内部查询工具了。实操心得初次搭建MCP Server可能会觉得有点复杂但一旦跑通一个后面就是复制粘贴改逻辑。关键在于理解MCP协议是一次“握手”和“工具列表同步”的过程。Server启动后向Client宣告“我这里有这些工具名称、描述、参数”Client将其加入工具箱。当用户请求触发时Client会通过同样的通信通道调用对应工具。建议先从简单的、无状态的查询类工具开始实践。4. 智能分配策略与工作流设计有了多个Agent和一堆工具如何实现“智能分配”这依赖于OpenCode的工作流Workflow和路由策略Routing Policy功能。4.1 基于意图识别的任务路由OpenCode允许你为每个Agent设置“触发关键词”或“意图描述”。这不是简单的关键词匹配而是结合了当前对话上下文和任务描述的语义理解。配置示例代码专家Agent设置触发意图为“代码”、“编写”、“修复”、“重构”、“解释”、“优化”、“函数”、“类”、“bug”、“error”。运维助手Agent设置触发意图为“部署”、“发布”、“重启”、“日志”、“监控”、“状态”、“服务器”、“环境”、“上线”、“回滚”。测试专员Agent设置触发意图为“测试”、“用例”、“单元测试”、“集成测试”、“API测试”、“覆盖率”、“断言”、“Mock”。当你输入“查看一下订单服务最近一小时的错误日志看看有没有数据库连接超时的报错”时OpenCode的调度中心会分析句子“查看...日志” - 匹配到“日志”关键词权重倾向“运维助手”。“错误”、“数据库连接超时” - 这些是具体的运维诊断问题进一步强化了“运维助手”的匹配度。最终这个任务会被自动路由给“运维助手Agent”处理该Agent会调用它已绑定的“日志查询MCP工具”来执行任务。4.2 复杂工作流的链式调用对于“修复bug并部署”这类复合任务我们需要设计工作流。OpenCode提供了可视化和YAML定义两种方式。一个简化的部署工作流YAML定义name: bugfix-and-deploy-workflow description: 接收一个Git Issue ID自动完成代码修复、测试、合并、部署。 steps: - name: analyze_issue agent: code-specialist prompt: | 请分析Git Issue #{{issue_id}}理解需要修复的问题。给出具体的代码文件定位和修复思路。 tools: [git-tool, code-search-tool] - name: implement_fix agent: code-specialist prompt: | 根据上一步的分析在分支 fix/issue-{{issue_id}} 上实现代码修复。确保代码风格一致并通过基础语法检查。 tools: [git-tool, code-editor-tool] depends_on: [analyze_issue] - name: run_tests agent: test-specialist prompt: | 为上述修改运行相关的单元测试和集成测试并生成测试报告。 tools: [test-runner-tool, report-tool] depends_on: [implement_fix] - name: deploy_to_staging agent: ops-assistant prompt: | 如果测试通过将 fix/issue-{{issue_id}} 分支合并到 staging 分支并触发测试环境的CI/CD流水线进行部署。部署后检查服务健康状态。 tools: [git-tool, ci-cd-tool, project-status-tool] depends_on: [run_tests] condition: ${run_tests.result} passed在这个工作流中任务被自动分解、排序并分配给最专业的Agent去执行。每个步骤的结果可以作为后续步骤的输入或判断条件如condition。这就实现了从“人工串联工具”到“智能流程自动化”的飞跃。注意事项工作流设计初期不宜过于复杂。建议从单个、明确的场景开始比如“自动生成数据库变更的迁移脚本”。先跑通一个简单流程再逐步增加步骤和判断逻辑。同时务必为关键步骤如合并、部署设置人工审批节点或确认提示避免全自动操作带来的风险。5. 团队协作与知识沉淀实践工具智能分配的最终价值要体现在团队效能提升上。OpenCode的方案在这方面也提供了支持。5.1 共享Agent与工具配置团队管理员可以创建和配置一套“标准Agent模板”如“Java后端开发标准助手”、“前端React专家”然后分享给整个团队。新成员加入时无需自己从头研究如何配置Prompt和工具直接使用团队优化好的模板即可极大降低了上手成本也保证了团队内部协作的一致性。5.2 对话历史与解决方案库OpenCode的对话历史可以按项目或标签进行组织。当一个复杂问题被某个Agent成功解决后例如通过特定组合的工具调用定位了一个性能瓶颈可以将整个对话线程标记为“解决方案”并添加关键词标签如“性能优化”、“数据库死锁”。之后当任何团队成员遇到类似问题时他不仅可以直接询问Agent还可以在团队的“解决方案库”中搜索历史记录快速找到经过验证的解决思路和工具使用范例。这相当于把个人的经验性知识转化为了团队可检索、可复用的结构化知识资产。5.3 权限与安全管控对于集成内部敏感工具的MCP Server如访问生产数据库、执行服务器命令安全至关重要。环境变量隔离如上述示例将API密钥、访问地址等敏感信息通过env配置而不是硬编码在脚本中。Agent工具权限最小化只为Agent分配其完成任务所必需的最少工具权限。例如“代码专家Agent”不需要也不应该获得“生产部署”工具的权限。网络隔离运行OpenCode和MCP Server的机器应处于可控的网络环境中特别是执行命令类的Server要做好沙箱隔离。6. 常见问题与效能优化实录在近半年的实践中我们踩过不少坑也总结出一些提升效能的技巧。6.1 常见问题排查表问题现象可能原因排查步骤与解决方案OpenCode无法启动自定义MCP Server1. 命令路径或参数错误。2. 脚本执行权限不足。3. Node.js/Python等运行时环境缺失。1. 在终端手动执行command和args中的命令看能否正常运行。2. 检查脚本文件是否有可执行权限chmod x server.js。3. 确认系统已安装正确版本的运行时且PATH环境变量包含其路径。Agent不调用预期的工具1. 工具未成功分配给该Agent。2. Agent的System Prompt未引导其使用工具。3. 用户请求的描述未触发工具调用逻辑。1. 进入Agent编辑页面确认工具列表中已勾选。2. 在System Prompt中明确指令如“当你需要查询项目状态时请使用get_project_status工具”。3. 尝试更直接地提问如“请使用项目状态工具查一下ID为123的项目”。工作流在某一步卡住或失败1. 上一步骤的输出不符合下一步骤的输入预期。2. 步骤依赖depends_on设置错误或循环依赖。3. 工具调用超时或返回错误。1. 检查每个步骤的输入输出格式必要时在Prompt中指定输出格式如“请以JSON格式输出分析结果”。2. 可视化检查工作流图的依赖关系是否成环。3. 查看OpenCode的详细日志定位具体是哪个工具调用出错然后单独测试该工具。智能路由不准确任务分给了错误的Agent1. Agent的意图关键词设置重叠或过于宽泛。2. 用户问题描述模糊。1. 精细化Agent的意图描述使其更具排他性。例如“运维助手”的意图可以加上“不包括代码逻辑修改”。2. 鼓励用户在提问时提供更明确的上下文或由调度中心设计一个简单的澄清问答。6.2 效能优化技巧Agent专业化细分不要试图创建一个“全能Agent”。根据团队角色前端、后端、测试、运维和常见任务类型代码开发、问题排查、数据查询创建多个高度专业化的Agent。一个专注的Agent其System Prompt可以写得更精确工具集更精简执行效率更高。工具描述的优化在定义MCP工具时description字段非常重要。OpenCode的调度中心会利用这个描述来判断工具用途。确保描述清晰、包含关键动词和名词例如“get_project_status根据项目ID查询其当前的部署状态和健康度指标。”这比简单的“查询项目状态”要好得多。冷启动与预热对于复杂的、启动较慢的MCP Server例如需要加载大模型的工具可以考虑实现Server的“预热”机制或者在OpenCode配置中设置较长的超时时间避免首次调用失败。成本与性能平衡将轻量级、高频次的任务如代码补全、语法检查分配给使用廉价、快速模型的Agent将需要深度思考、创造性的任务如架构设计、复杂算法分配给使用高性能、高成本模型的Agent。在OpenCode的Agent配置中可以为每个Agent单独指定使用的模型实现成本精细化管控。从“工具闲置”到“智能分配”我们团队的实践表明这不仅仅是一次技术工具的升级更是一种思维模式的转变。它要求我们将离散的工具视为可编排的“服务”将重复性的操作固化为“工作流”将个人的经验沉淀为团队的“知识库”。OpenCode和MCP协议为我们提供了实现这一愿景的坚实框架。当然这条路没有终点随着更多工具被MCP化随着工作流设计得越来越精妙我们距离真正智能、流畅的人机协作开发体验也将越来越近。

相关新闻

业务与 AI 解耦:Java+Python 跨语言调用的 4 种企业级集成方案

业务与 AI 解耦:Java+Python 跨语言调用的 4 种企业级集成方案

双栈落地真正的难点,往往不在模型本身,而在 Java 业务和 Python AI 怎么接上。我见过两类典型翻车:一类想用 Python 全包企业级应用,结果扛不住高并发和事务;另一类让 Python 脚本直连业务库,模型一升级&am…

2026/10/2 4:26:53 阅读更多 →
防御性编程实战:从0.5行数据崩溃案例解析数据完整性保障

防御性编程实战:从0.5行数据崩溃案例解析数据完整性保障

在实际开发中,我们常常会遇到一些看似微小、却足以导致整个系统崩溃的“边界”问题。其中,一个极具代表性的场景就是:程序在处理数据时,因为一行“半行”或格式异常的数据,引发了连锁反应,最终导致服务不可…

2026/10/8 19:33:04 阅读更多 →
DeepSeek-V4 Flash:大模型高效推理的技术突破与应用前景

DeepSeek-V4 Flash:大模型高效推理的技术突破与应用前景

1. 从DeepSeek V4的喧嚣,到Flash的静默革命最近几天,AI圈子里最热闹的话题,莫过于DeepSeek V4的正式发布。各种评测、对比、性能榜单满天飞,大家都在讨论它又刷新了多少个SOTA,在哪些榜单上把GPT-4o、Claude-3.5 Sonne…

2026/10/7 9:17:22 阅读更多 →

最新新闻

图像压缩实战:从频率统计到Huffman编解码器完整实现

图像压缩实战:从频率统计到Huffman编解码器完整实现

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

2026/10/14 1:34:09 阅读更多 →
Word/WPS接入DeepSeek R1:VBA集成实战与办公AI协作者构建

Word/WPS接入DeepSeek R1:VBA集成实战与办公AI协作者构建

简介:本资源是一份面向办公自动化场景的AI集成实战指南,专为希望提升Word与WPS文档处理效率的专业人士及AI工具尝鲜者设计,解决传统办公软件缺乏智能文本生成、润色与理解能力的痛点。教程系统覆盖DeepSeek R1 API密钥申请规范、Word宏配置全…

2026/10/14 1:34:09 阅读更多 →
Proteus 8.17 安装避坑完整指南:版本选型、激活汉化与仿真验证

Proteus 8.17 安装避坑完整指南:版本选型、激活汉化与仿真验证

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

2026/10/14 1:34:09 阅读更多 →
Java并发volatile深度解析:可见性、重排机制与双重检查锁

Java并发volatile深度解析:可见性、重排机制与双重检查锁

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

2026/10/14 1:34:09 阅读更多 →
Stata矩阵计算入门:从matrix命令到计量经济学实战

Stata矩阵计算入门:从matrix命令到计量经济学实战

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

2026/10/14 1:34:09 阅读更多 →
C#高精度毫秒定时器:突破系统时钟限制的两种实现与工程避坑

C#高精度毫秒定时器:突破系统时钟限制的两种实现与工程避坑

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

2026/10/14 1:33:09 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →