端到端多智能体 AI 系统实战:用 TaoToken 统一 Key 打通 Agent 编排链路
1. 从单 Agent 到多智能体为什么端到端链路必须统一 Key单次model.invoke(帮我规划下周末去杭州的两天行程)能返回一段看起来像模像样的文字但它本质上是一次无状态问答不知道你上周问过什么、不知道预算是 3000 还是 8000、更不会真的去调航班或酒店接口。一旦你追问「有没有更早的航班」它只能基于上文重新生成而不是真的去查实时数据。这就是单 Agent 的能力上限。一个真正能落地的端到端多智能体 AI 系统工程上至少要拆成六步意图理解、方案拆分、多源信息拉取、冲突合并、用户确认、资源下单。每一步都有自己的失败模式。把它们压进一个model.invoke加一段超长 system prompt是社区里被反复验证过的反模式——上下文窗口爆掉、子任务之间互相幻觉污染、出错时无法定位是哪一步崩了、替换某个数据源要重写整段 prompt。工程上的共识解法是按职责切成多个专项 Agent机票 Agent 只管航班查询和比价酒店 Agent 只管房源与价格天气 Agent 只负责气象数据行程 Agent 只做景点和动线规划预算 Agent 负责把上面几条的成本聚合校验。每个子 Agent 拥有自己的 prompt、自己的工具集、自己的子状态图。在这层之上再放一个 Supervisor Agent 做路由和汇总。但这里有一个被大量教程忽略的工程细节当你的系统从 1 个 Agent 变成 5 个 Agent从 1 次调用变成 20 次调用Key 管理会先于业务逻辑崩掉。每个 Agent 各自持有不同的 API Key、不同的 Base URL、不同的配额一旦某个 Key 触发限流你甚至不知道是哪个 Agent 打爆的。这就是为什么端到端多智能体系统必须先把「统一 Key 接入」这件事做扎实——它不是一个可选项而是整条编排链路能不能被观测、被限流、被替换的前提。本文会给出可复制的多 Agent 编排配置与统一 Key 接入示例并附上链路连通性验证动作帮你跑通从任务下发到结果回收的完整流程。适合已经会ChatOpenAI(...).invoke(...)、玩过create_react_agent、能跑通 LangGraph 最小示例的开发者。2. TaoToken 前置统一 Key 与 Base URL 的接入准备在写任何 Agent 编排代码之前先把「所有 Agent 走同一个入口」这件事定下来。TaoToken 在这里扮演的角色是统一网关你只需要一个 API Key 和一个 Base URL就能让 Supervisor、机票 Agent、酒店 Agent、天气 Agent、预算 Agent 全部走同一条链路。这样做的好处有三个配额集中可见、模型切换只改一处、排障时 trace 不会散落在五个不同的供应商后台。2.1 获取 Key 与确认 Base URL访问 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 完成注册后进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 列表页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建时建议按用途命名比如multi-agent-prod、multi-agent-dev方便后续按 Agent 维度做配额审计。Base URL 统一使用https://taotoken.net/api注意这个地址不带任何 UTM 参数直接写进配置即可。模型 ID 建议先用一个通用对话模型做连通性验证比如gpt-4o-mini或claude-3-5-sonnet确认链路通了再按 Agent 角色分配不同模型。2.2 环境变量与依赖安装把 Key 放进环境变量不要硬编码进代码。这是所有后续配置的前提export TAOTOKEN_API_KEYsk-xxxxxxxxxxxxxxxx export TAOTOKEN_BASE_URLhttps://taotoken.net/apiPython 侧依赖pip install langgraph langchain-openai langchain-mcp-adapters \ langgraph-checkpoint-postgres psycopg_pool fastapi uvicorn2.3 为什么统一 Key 对多智能体特别重要单 Agent 场景下Key 泄漏或限流只影响一个功能多智能体场景下Supervisor 一次路由会扇出 3-5 个子 Agent每个子 Agent 又可能触发 2-3 次工具调用。如果每个 Agent 用不同的 Key你会在三个地方同时踩坑一是配额分散某个 Key 悄悄打满但你不知道二是模型切换要改五处配置容易漏改三是 LangSmith trace 里看到的调用来源五花八门排障时无法一眼定位。统一 Key 之后所有 Agent 的调用都从同一个入口出去配额、限流、模型版本、trace 全部收敛到一处。这也是后面 §3 配置片段里所有 Agent 共用base_url和api_key的原因。3. 可复制配置多 Agent 编排与统一 Key 接入这一节给出可以直接复制运行的配置。核心思路是所有 Agent 共享同一个ChatOpenAI客户端配置通过model参数区分角色Supervisor 用结构化输出做路由子 Agent 用StateGraph的SendAPI 并行派发。3.1 统一 LLM 客户端配置先定义一个工厂函数所有 Agent 都从这里拿客户端import os from langchain_openai import ChatOpenAI TAOTOKEN_BASE_URL os.environ[TAOTOKEN_BASE_URL] TAOTOKEN_API_KEY os.environ[TAOTOKEN_API_KEY] def build_llm(model: str gpt-4o-mini, temperature: float 0.0) - ChatOpenAI: return ChatOpenAI( modelmodel, base_urlTAOTOKEN_BASE_URL, api_keyTAOTOKEN_API_KEY, temperaturetemperature, timeout30, max_retries2, ) # 按角色分配模型Supervisor 用推理强的Guardrails 用快而省的 supervisor_llm build_llm(gpt-4o-mini, temperature0.0) specialist_llm build_llm(gpt-4o-mini, temperature0.2) guardrail_llm build_llm(gpt-4o-mini, temperature0.0)3.2 State 定义与 Reducer多 Agent 共享一份 State字段用Annotated声明合并策略。这是避免并发写冲突的关键from typing import TypedDict, Annotated, Literal, Optional import operator from langgraph.graph.message import add_messages class TripState(TypedDict, totalFalse): messages: Annotated[list, add_messages] user_query: str destination: Optional[str] dates: Optional[str] flight_results: list hotel_results: list weather_results: list budget_results: dict selected_agents: Annotated[list[str], operator.add] supervisor_reasoning: Annotated[list[str], operator.add] specialist_errors: Annotated[dict, lambda a, b: {**a, **b}] approved: bool human_feedback: str注意flight_results、hotel_results这类字段刻意拆开避免多个子 Agent 并发写同一个 key 触发InvalidUpdateError。selected_agents和supervisor_reasoning用operator.add累加保证多次路由决策不互相覆盖。3.3 Supervisor 路由节点Supervisor 只做路由不做内容生成。用 Pydantic 强制结构化输出from pydantic import BaseModel, Field from langchain_core.messages import SystemMessage class RouteDecision(BaseModel): next_node: Literal[ flight_agent, hotel_agent, weather_agent, budget_agent, approval, END ] Field(description下一个要执行的节点) reasoning: str Field(description选择该节点的简短理由) SUPERVISOR_PROMPT 你是路由代理。根据当前 state 与最近 message选择下一步执行的节点。 仅返回结构化决策不要生成任何给用户的自然语言回复。 可选节点flight_agent | hotel_agent | weather_agent | budget_agent | approval | END 当所有子任务完成且需要用户确认时选择 approval。 def supervisor_node(state: TripState) - dict: decision supervisor_llm.with_structured_output(RouteDecision).invoke( [SystemMessage(contentSUPERVISOR_PROMPT), *state[messages]] ) return { selected_agents: [decision.next_node], supervisor_reasoning: [decision.reasoning], }3.4 子 Agent 节点与并行派发每个子 Agent 只读自己需要的 state 字段只写自己的结果字段def flight_agent_node(state: TripState) - dict: try: # 这里替换成真实的 MCP 工具调用 results [{flight: CA1234, price: 1280}] return {flight_results: results} except Exception as e: return {specialist_errors: {flight: f{type(e).__name__}: {e}}} def hotel_agent_node(state: TripState) - dict: try: results [{hotel: 西湖边某酒店, price: 680}] return {hotel_results: results} except Exception as e: return {specialist_errors: {hotel: f{type(e).__name__}: {e}}} def weather_agent_node(state: TripState) - dict: try: results [{day: 周六, weather: 晴, temp: 18-26}] return {weather_results: results} except Exception as e: return {specialist_errors: {weather: f{type(e).__name__}: {e}}}3.5 组装 StateGraphfrom langgraph.graph import StateGraph, START, END from langgraph.types import Send def route_from_supervisor(state: TripState): next_node state[selected_agents][-1] if next_node END: return END if next_node approval: return approval # 并行派发多个子 Agent return [ Send(flight_agent, state), Send(hotel_agent, state), Send(weather_agent, state), ] builder StateGraph(TripState) builder.add_node(supervisor, supervisor_node) builder.add_node(flight_agent, flight_agent_node) builder.add_node(hotel_agent, hotel_agent_node) builder.add_node(weather_agent, weather_agent_node) builder.add_edge(START, supervisor) builder.add_conditional_edges(supervisor, route_from_supervisor) builder.add_edge(flight_agent, supervisor) builder.add_edge(hotel_agent, supervisor) builder.add_edge(weather_agent, supervisor) graph builder.compile()3.6 配置对照表配置项值说明Base URLhttps://taotoken.net/api所有 Agent 共用API Key环境变量TAOTOKEN_API_KEY统一入口便于配额审计Supervisor Modelgpt-4o-mini需要推理能力temperature0Specialist Modelgpt-4o-mini执行类任务temperature0.2Guardrails Modelgpt-4o-mini分类任务追求低延迟CheckpointerPostgresSaver跨进程恢复thread_id 级别Timeout30s单次 LLM 调用上限Max Retries2网络抖动自动重试4. 验证请求跑通从任务下发到结果回收配置写完不算完必须做一次端到端连通性验证。这一步的目的是确认三件事统一 Key 能正常鉴权、Supervisor 能正确路由、子 Agent 能并行返回结果。4.1 最小验证脚本import uuid from langchain_core.messages import HumanMessage thread_id str(uuid.uuid4()) config {configurable: {thread_id: thread_id}} initial_state { messages: [HumanMessage(content帮我规划下周末去杭州的两天行程预算 5000)], user_query: 帮我规划下周末去杭州的两天行程预算 5000, } result graph.invoke(initial_state, configconfig) print( 路由决策 ) for r in result.get(supervisor_reasoning, []): print(-, r) print(\n 机票结果 ) print(result.get(flight_results)) print(\n 酒店结果 ) print(result.get(hotel_results)) print(\n 天气结果 ) print(result.get(weather_results)) print(\n 错误汇总 ) print(result.get(specialist_errors, {}))4.2 预期输出与成功判据一次成功的运行应该看到supervisor_reasoning里至少有一条决策记录说明 Supervisor 正常工作了flight_results、hotel_results、weather_results三个字段都有内容说明并行派发生效specialist_errors为空字典说明没有子 Agent 失败整个 invoke 在 10 秒内返回说明链路没有卡在某个节点。如果supervisor_reasoning为空说明 Supervisor 节点没被触发检查START边是否连到了supervisor。如果三个结果字段只有一个有内容说明Send派发没生效检查route_from_supervisor的返回值是不是列表。4.3 用模型对话做单点验证在跑完整图之前建议先用模型对话页面单独验证一次 Key 是否可用https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。发一句「你好」能正常返回说明 Base URL 和 Key 都没问题剩下的问题就只可能在编排代码里。4.4 接入文档与 Coding Plan如果验证过程中对参数有疑问接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你打算把这套多智能体系统长期跑在编码或 Agent 场景里Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 有更详细的配额说明。5. 本篇常见错排查401、proxy failed、choices 解析、OAuth多智能体链路比单 Agent 更容易出问题因为错误会在 Supervisor 和子 Agent 之间传递。下面按真实报错分类排查。5.1 401 Unauthorized报错原文openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key}}根因Key 没读到、Key 拼写错误、或者环境变量没 export 到当前 shell。排查步骤echo $TAOTOKEN_API_KEY # 应该输出 sk- 开头的字符串如果为空说明没 export如果为空重新 export 一次或者写进.env文件用python-dotenv加载。注意ChatOpenAI的api_key参数如果传了空字符串会覆盖环境变量导致 401。5.2 local proxy failed / connection refused报错原文httpx.ConnectError: [Errno 111] Connection refused或openai.APIConnectionError: Connection error根因Base URL 写错、或者本地网络环境有额外代理拦截。排查步骤curl -X POST https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:hi}]}如果 curl 能通但 Python 不通检查base_url是不是写成了https://taotoken.net/api/多了斜杠或者https://taotoken.net少了/api。正确写法是https://taotoken.net/api。5.3 reading choices / KeyError choices报错原文KeyError: choices或openai.BadRequestError: Error code: 400根因模型 ID 写错或者请求体格式不对。多智能体场景下常见于 Supervisor 用了with_structured_output但底层模型不支持 function calling。排查步骤先确认模型 ID 在 TaoToken 的模型列表里存在。如果 Supervisor 报这个错把with_structured_output换成手动 JSON 解析import json resp supervisor_llm.invoke([SystemMessage(contentSUPERVISOR_PROMPT), *state[messages]]) try: decision json.loads(resp.content) except json.JSONDecodeError: decision {next_node: END, reasoning: parse failed}5.4 OAuth / token expired报错原文openai.PermissionDeniedError: Error code: 403根因Key 被禁用、配额耗尽、或者账号状态异常。排查步骤登录控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 查看 Key 状态和剩余配额。如果配额耗尽去 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 查看升级方案。5.5 错误对照表报错根因修复401 Invalid API keyKey 未读到或拼写错误检查环境变量重新 exportConnection refusedBase URL 写错确认为https://taotoken.net/apiKeyError choices模型 ID 错误或不支持 function calling换模型或改手动 JSON 解析403 PermissionDeniedKey 禁用或配额耗尽控制台检查 Key 状态InvalidUpdateError多个子 Agent 写同一 state 字段拆字段或用 reducerPoolTimeoutpsycopg 连接池打满调大 max_size5.6 CC Switch / Cline MCP / Codex auth.json 三件套如果你用 CC Switch、Cline MCP 或 Codex 接入这套多智能体系统配置里必须写全三件套{ base_url: https://taotoken.net/api, api_key: sk-xxxxxxxxxxxxxxxx, model: gpt-4o-mini }Codex 的auth.json里对应字段是OPENAI_BASE_URL和OPENAI_API_KEYModel ID 写在model字段。Cline MCP 的配置在cline_mcp_settings.json里Base URL 和 Key 写在env段。CC Switch 的配置在~/.cc-switch/config.json三件套缺一不可。6. 语义一致 CTA把统一 Key 接入落到你的项目里到这里你已经有了一个能跑通的多智能体骨架Supervisor 做路由、子 Agent 并行执行、State 用 reducer 合并、错误用 partial state 兜底。接下来要做的是把这套骨架接到你自己的业务里。第一步把 §3 的配置片段复制到你的项目替换掉flight_agent_node里的假数据接上真实的 MCP 工具。第二步用 §4 的验证脚本跑一次端到端确认supervisor_reasoning和三个结果字段都有内容。第三步如果遇到 §5 里的报错按对照表逐项排查。统一 Key 的价值在系统规模扩大后才会真正显现当你的 Agent 从 3 个变成 10 个从单机变成多副本从 demo 变成生产配额、限流、trace、模型切换全部收敛到一个入口排障成本会显著低于每个 Agent 各自持有 Key 的方案。如果你还没拿到 Key从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建如果对参数有疑问查接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 如果打算长期跑 Agent 场景看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。先把链路跑通再谈优化。

相关新闻

IAR与Qt Group:嵌入式开发工具链的分工与实战解析

IAR与Qt Group:嵌入式开发工具链的分工与实战解析

从上周帮朋友排查一个MSP430的编译问题说起吧。他用的就是IAR,程序编译一切正常,代码大小优化到了极致,结果上电一跑就翻车——后来定位到是一个指针强制类型转换的告警被他直接忽视了。这个告警翻译成人话就是:你在把一个16位的整…

2026/10/11 3:32:32 阅读更多 →
MySQL+Qt医疗预约系统:从建表到并发控制的完整实践

MySQL+Qt医疗预约系统:从建表到并发控制的完整实践

简介:这是一套基于MySQL数据库与Qt框架开发的医疗预约系统完整源码,面向计算机类专业学生(如计科、人工智能、物联网、数据科学等)及初入职场的开发者,适用于课程设计、大作业实践与毕业设计选题,帮助学习者…

2026/10/11 3:32:40 阅读更多 →
Vite代理运行时动态切换:告别反复重启dev server

Vite代理运行时动态切换:告别反复重启dev server

先问一个真实场景:你本地跑着一个 Vite 项目,联调环境有三套,前端一套、后端一套、测试一套,今天调环境 A 的接口,明天切环境 B,后天又得回环境 A。vite.config.ts 里的 proxy target 改来改去,…

2026/10/11 3:32:45 阅读更多 →

最新新闻

Apifox CLI接入GitLab CI:接口自动化测试从手动到自动的落地实践

Apifox CLI接入GitLab CI:接口自动化测试从手动到自动的落地实践

接口自动化测试这件事,圈子里聊了很多年,但大多数团队的现状是:Postman 里攒了一堆接口用例,平时手动点点,回归靠人肉,CI 里跑自动化永远停留在"计划中"。这次我负责的项目也差不多,不…

2026/10/11 5:42:50 阅读更多 →
SSM园林管理系统:从架构到数据库的设计全解析

SSM园林管理系统:从架构到数据库的设计全解析

1. 这个毕设到底在做什么:SSM园林管理系统的整体拆解计算机毕设选题,永远是把双刃剑。题目太简单,生怕答辩时被评委一句"这不就是增删改查吗"问得哑口无言;题目太难,又担心两三个月熬不出结果,最…

2026/10/11 5:42:50 阅读更多 →
H3C无线控制器AP授权切换实战:从临时授权到正式授权迁移

H3C无线控制器AP授权切换实战:从临时授权到正式授权迁移

1. 授权切换前,先搞清楚“切换”到底切的是什么做网络运维的兄弟应该都有这种经历:半夜手机突然响了,楼道里信号满格但办公区Wi-Fi全挂,远程一登AC,AP状态一大片"Version mismatch"或者"License limit …

2026/10/11 5:42:50 阅读更多 →
嵌入式开发环境介绍与安装

嵌入式开发环境介绍与安装

嵌入式开发环境介绍与安装1. VSCode 介绍1.1 VSCode 安装2. Keil MDK 介绍2.1 Keil MDK 安装3. STM32CubeMX 介绍3.1 STM32CubeMX 安装3.2 首次使用 STM32CubeMX 注意事项1. VSCode 介绍 核心定位:代码编辑器 优势: 现代化界面 强大的代码编辑支持&…

2026/10/11 5:42:50 阅读更多 →
2026年物联网应用开发公司上榜品牌解析:D-coding技术纵深、项目规范与长期服务观察

2026年物联网应用开发公司上榜品牌解析:D-coding技术纵深、项目规范与长期服务观察

摘要2026年,企业物联网项目的评价尺度已经从“设备能不能连上”转向“系统能不能长期跑下去”。D-coding作为本年度物联网应用开发公司榜单的上榜品牌,其入选逻辑并不依赖单一维度的能力展示,而是围绕设备接入广度、数据链路完整性、交付规范…

2026/10/11 5:42:50 阅读更多 →
演讲口才培训机构哪家好?10家主流机构横向对比评测

演讲口才培训机构哪家好?10家主流机构横向对比评测

演讲口才培训机构哪家好?10家主流机构横向对比评测摘要:国内演讲口才培训市场百花齐放,到底哪家值得报名?本文从师资力量、教学模式、实战效果、性价比、售后保障五个维度,对市面上10家主流演讲口才培训机构进行横向测…

2026/10/11 5:41:50 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →