ArtCraft 共享 API 契约层 artcraft_api_defs:服务器与客户端共用的 HTTP 类型定义规范
人工智能AI 应用媒体生成桌面应用【免费下载链接】artcraftArtCraft is an intentional crafting engine for artists, designers, and filmmakers项目地址https://gitcode.com/GitHub_Trending/ar/artcraft点击查看免费下载artcraft_api_defs是 ArtCraft 仓库中专门承载 HTTP API 共享类型定义的 crate其职责是让服务器端文档中记为storyteller_web与各类客户端尤其是 artcraft_client使用同一套 wire 类型完成序列化与反序列化避免两端各自维护一套易漂移的 DTO。本文以该 crate 的规范文档 AGENTS.md 为骨架结合仓库源码逐一拆解其目录组织、Request/Response/Path/Query 四条类型约定、PathInfo后缀规则、孤儿规则Orphan Rule边界与最小依赖治理读者读完后能够直接依据本文在 ArtCraft 中新增一个 API 端点类型并理解共享类型被artcraft_client消费的完整链路。一、定位为什么需要独立的共享类型 crate在 ArtCraft 的工程布局中artcraft_api_defs 处于 API 层的中枢位置它同时被服务器端storyteller_web与客户端 crate 依赖而不是把请求/响应类型塞进任何一侧。这样做的收益体现在三个方面单一事实来源同一份struct既用于服务端反序列化请求、序列化响应也用于客户端序列化请求、反序列化响应字段命名、可选性、枚举取值天然一致版本演进可控类型变更必须发生在共享层两端同步升级不会出现服务端已改、客户端仍发旧字段的隐性漂移与框架解耦该 crate 刻意不依赖 actix-web详见下文依赖治理一节因此类型定义可以被任何 HTTP 客户端栈复用。从根 Cargo.toml 的 workspace members 可以看到crates/api_clients/artcraft/artcraft_api_defs是仓库的一等成员并被声明为可被各 crate 通过artcraft_api_defs.workspace true引用的内部依赖artcraft_client/Cargo.toml 即如此引用。二、目录结构按业务功能feature组织lib.rs 的模块声明直接反映了文档所述的Organized by feature原则。整个 crate 目前按功能域划分了 24 个顶层模块users登录、改密码、改邮箱、改用户名、会话信息与登录质询users/mod.rsmedia_file媒体文件的删除、按 job 列举、按会话/类型列举、项目文件上传2D 项目、mood board、3D 场景、视频时间线等jobs会话任务列表moderation风控与运营侧类型覆盖告警、调试日志、Top 消费用户、钱包与账本、用户 Stripe 数据等generate按生成类型拆分的请求/响应例如cost_estimate/、image/、video/、object/、splat/等子目录omni_api与omni_gen面向第三方/统一入口的 Omni API 与 Omni Gen 生成、成本与任务状态类型其余功能域analytics、api_keys、characters、credits、folders、internal、mcp_sessions、prompts、stripe_artcraft、subscriptions、tags、user_referral_codes、video_info、web_referrals、utils、common。common是一个特殊功能域只存放跨功能复用的响应类型详见第四节。这种按功能、再按子功能的层级组织让一个端点的全部类型请求、响应、路径参数、查询参数、枚举都收拢在同一文件里查找与评审都极为高效。三、四条核心类型约定让 wire 形状可预测AGENTS.md 用四条规则规定了每种类型的 trait 组合与命名源码中处处可见其落地3.1 请求类型#[derive(Deserialize, ToSchema)]请求体只负责接收因此只派生反序列化与 OpenAPI 模式生成。典型示例是 users/login.rs 中的登录请求#[derive(Deserialize, ToSchema)] pub struct LoginRequest { pub username_or_email: String, pub password: String, }ToSchema来自utoipa用于生成 OpenAPI 文档Deserialize使服务端可以从 JSON 请求体直接构造该类型。3.2 响应类型#[derive(Serialize, ToSchema)]响应只负责发送因此派生序列化。同一个登录端点的成功响应体现了这一点同时展示了共享层如何承载业务语义注释——signed_session的字段注释解释了它的设计动机绕过 Cookie、适配禁用跨域 Cookie 的浏览器#[derive(Serialize, ToSchema)] pub struct LoginSuccessResponse { pub success: bool, /// A signed session that can be sent as a header, bypassing cookies. /// This is useful for API clients that dont support cookies or Google /// browsers killing cross-domain cookies. pub signed_session: String, }此外同一个文件里的LoginErrorType枚举AccountNeedsPassword、InvalidCredentials、ServerError展示了另一条隐含约定错误分类的枚举值也可以放在共享层只要它们不需要actix-web的ResponseError实现见第五节。3.3 路径参数Deserialize ToSchema且以PathInfo为后缀URL 路径中的参数类型以PathInfo结尾这是共享层最具辨识度的命名约定。media_file/delete_media_file.rs 给出了教科书式示例/// For the URL PathInfo #[derive(Serialize, Deserialize, ToSchema)] pub struct DeleteMediaFilePathInfo { pub token: MediaFileToken, }注意这里同时派生Serialize与Deserialize——路径参数既要由服务端从路径中反序列化出来也要能序列化例如客户端在拼接 URL 或做调试输出时需要。token字段使用了 tokens crate 中的MediaFileToken这也是共享层大量复用内部 schema crate 的证据。顺着PathInfo后缀可以快速在代码库中定位所有带路径参数的端点。3.4 查询参数#[derive(Deserialize, IntoParams)]查询字符串参数类型单独使用IntoParams同样是 utoipa 的 trait用于把结构体展开为 OpenAPI 的 query 参数且通常不需要ToSchema。jobs/list_session_jobs.rs 是文档约定的直接落地并注释了参数的逗号分隔取值语义#[derive(Deserialize, ToSchema, IntoParams)] pub struct ListSessionJobsQueryParams { /// NB: This can be one (or more comma-separated values) from JobStatusPlus. /// ?include_statespending or ?include_statespending,started,complete_success (etc.) pub include_states: OptionString, /// The opposite of include_states, this filters out states from view. pub exclude_states: OptionString, }另一个更纯粹的查询参数示例是 media_file/list/by_type/list_session_common.rs它只派生Deserialize, IntoParams承载游标分页所需的四个参数sort_ascending、page_size、cursor、cursor_is_reversed注释明确Pagination only — the media class is fixed by the endpoint。3.5 常量约定URL 路径以const形式与类型同文件源码中还呈现出一条 AGENTS.md 未显式写出、但普遍遵守的约定端点 URL 路径作为pub const ..._URL_PATH与类型放在同一文件。例如 jobs/list_session_jobs.rs 的LIST_SESSION_JOBS_URL_PATH: str /v1/jobs/session、media_file/list/by_type/list_session_mesh_media_files.rs 的LIST_SESSION_MESH_MEDIA_FILES_URL_PATH以及 analytics/log_active_user.rs 中按客户端版本区分的LOG_ACTIVE_USER_V1_PATH与LOG_ACTIVE_USER_V2_PATH。路径常量与类型定义同处一个文件客户端只需use该文件即可同时获得路径与类型见第七节不会出现路径字符串散落各处的维护问题。四、跨功能共享响应类型common/responses文档将common单列为功能域之一。它的实际内容是 common/responses/mod.rs 导出的七类被多个功能域复用的响应形状类型文件用途MediaLinks/VideoPreviewsmedia_links.rs媒体文件的 CDN 链接、缩略图模板与视频预览PaginationCursorspagination_cursors.rs无限滚动式游标分页JobDetailsLivePortraitRequest/JobDetailsLipsyncRequestjob_details.rs直播人像与口型同步任务的请求细节MediaFileCoverImageDetailsmedia_file_cover_image_details.rs封面图细节CoverImageLinkscover_image_links.rs封面图链接SimpleEntityStatssimple_entity_stats.rs实体统计SimpleGenericJsonSuccesssimple_generic_json_success.rs通用 JSON 成功响应UserDetailsLightuser_details_light.rs轻量用户信息以游标分页为例pagination_cursors.rs 的注释揭示了设计动机——不暴露总页数从而避免投资者与竞品通过接口推断数据库记录规模同时说明游标是不透明的通常加密的句柄#[derive(Serialize, Deserialize, ToSchema, Debug)] pub struct PaginationCursors { /// The next cursor. /// This is an opaque (typically even encrypted) handle. pub maybe_next: OptionString, /// The previous cursor. /// This is an opaque (typically even encrypted) handle. pub maybe_previous: OptionString, /// Details whether were walking forward or backward. pub cursor_is_reversed: bool, }MediaLinks则展示了 URL 类型直接进入 wire 结构cdn_url: Url来自urlcratemaybe_thumbnail_template用{WIDTH}占位符让客户端自行拼出不同尺寸的缩略图视频文件另有maybe_video_previews: OptionVideoPreviews内含静态帧、动图及各自的缩略图模板。这些共享类型被具体端点复用例如 jobs/list_session_jobs.rs 的ListSessionJobsItem就嵌入了MediaLinks、JobDetailsLivePortraitRequest、JobDetailsLipsyncRequest并组合了DateTimeUtcchrono与多个tokens类型list_session_mesh_media_files.rs 则把SessionMediaFileInfo与PaginationCursors组合成网格媒体文件列表响应。五、孤儿规则Orphan Rule共享层的边界在哪里AGENTS.md 明确划定了共享层的职责边界需要ResponseError实现actix-web的类型不能放在本 crate。原因是 Rust 的孤儿规则——impl ResponseError for MyType要求 trait 或类型至少有一个定义在本地 crate而ResponseError属于 actix-web共享层又禁止依赖 actix-web因此这类实现只能放在服务器端storyteller_web。这条规则的实际效果是错误响应类型留在服务端、纯数据类型下沉到共享层。仓库源码中的多处注释印证了同一原则在更细粒度上的应用omni_api/omni_upload_video.rs 指出上传接口的请求体是multipart/form-data因为 multipart 表单类型绑定于 Web 框架所以请求类型在storyteller_web中与 handler 一起声明共享层只放成功响应类型folders/common.rs 指出folder 的列表项形状因嵌入MediaFileCoverImageDetails等依赖请求上下文MediaDomainServerEnvironment的类型也保留在storyteller_web共享层只提供不依赖上下文的FolderInfo与FolderThumbnail。因此判断一个类型该不该进共享层可以套用两条检验标准它是否依赖 actix-web 或请求上下文MediaDomain、ServerEnvironment、multipart 绑定等——是则留在服务端它是否同时被服务端与客户端读写——是则应下沉到共享层。从源码结构看folders/common.rs还展示了共享层在被服务端使用时的另一重职责为FolderInfo这类跨端点复用的形状提供单一定义单文件夹 GET、创建响应、列表行、子文件夹列表行共用一个结构并保持与MediaLinks类似的视频预览镜像结构独立演进FolderThumbnailVideoPreviews的注释明确Mirrors the shape ofMediaLinks video previews, but is its own type。六、依赖治理刻意保持的最小依赖面Cargo.toml 完整呈现了 AGENTS.md 所述的依赖清单且是刻意精简的# Internal enums.workspace true tokens.workspace true # External chrono.workspace true url.workspace true # Serialization serde.workspace true serde_derive.workspace true serde_json.workspace true utoipa.workspace true [dev-dependencies] anyhow.workspace true要点解读外部依赖仅五个serde/serde_derive序列化、utoipaOpenAPI 模式、chronoDateTimeUtc时间戳、urlUrl类型的 CDN 链接serde_json主要用于测试与序列化工具内部 schema 依赖两个enums 与 tokens。enums提供跨端共享的枚举例如 common_video_model.rs 中#[serde(rename_all snake_case)]的CommonVideoModel被 omni_api/generate_requests/omni_api_video_generate_request.rs 直接引用为请求字段model: OptionCommonVideoModeltokens提供MediaFileToken、UserToken、FolderToken、ApiKeyToken、InferenceJobToken、BatchGenerationToken、PromptToken等强类型标识符没有 actix-web 依赖这是第五节的孤儿规则在依赖层面的对应——共享层保持纯类型 纯序列化的定位所有 Web 框架绑定都留在服务端开发依赖仅anyhow共享层自身测试极少引入重型依赖进一步印证其薄的特质。enumscrate 的测试也保证了这些共享枚举的序列化契约稳定common_video_model.rs内置了test_serialization、test_deserialization、test_round_trip等测试如assert_serialization(CommonVideoModel::Kling21Pro, kling_2p1_pro)确保 wire 上的字符串取值与枚举变体一一对应、双向往返无损。七、客户端消费链路artcraft_client 如何复用共享类型共享类型最终要被真实客户端使用才产生价值。artcraft_client 是消费方之一其 jobs/list_session_jobs.rs 展示了标准用法use artcraft_api_defs::jobs::list_session_jobs::{ListSessionJobsSuccessResponse, LIST_SESSION_JOBS_URL_PATH};客户端从共享层一次性引入响应类型 URL 路径常量再结合本地定义的请求状态枚举States::All / Include / Exclude拼出查询串最终通过basic_json_get_request发起请求并把响应反序列化为共享的ListSessionJobsSuccessResponsepub async fn list_session_jobs( api_host: ApiHost, maybe_creds: OptionStorytellerCredentialSet, job_states: States, ) - ResultListSessionJobsSuccessResponse, StorytellerError { let url match job_states { States::All LIST_SESSION_JOBS_URL_PATH.to_string(), States::Include(states) format!({}?include_states{}, LIST_SESSION_JOBS_URL_PATH, states_string(states)), States::Exclude(states) format!({}?exclude_states{}, LIST_SESSION_JOBS_URL_PATH, states_string(states)), }; Ok(basic_json_get_request(api_host, url, maybe_creds).await?) }客户端只负责如何请求认证、Host、HTTP 动词、查询串拼接而请求/响应长什么样完全由共享层裁决。这与服务端反序列化同一组请求类型形成闭环——两端各自use artcraft_api_defs::...即可保证契约一致这正是该 crate 存在的全部意义。八、实践小结新增一个端点类型时的检查清单综合 AGENTS.md 的约定与仓库源码的实际落地在artcraft_api_defs中新增端点类型时可依次自检目录放入对应 feature 子目录若为新功能则创建新mod.rs并在 lib.rs 注册请求体#[derive(Deserialize, ToSchema)]字段按需加Option与 serde 属性如skip_serializing_if见 analytics/log_active_user.rs响应体#[derive(Serialize, ToSchema)]可复用的形状优先引用common::responses路径参数#[derive(Serialize, Deserialize, ToSchema)]并以PathInfo后缀命名查询参数#[derive(Deserialize, IntoParams)]路径常量pub const XXX_URL_PATH与类型同文件边界检查若类型需要ResponseError、multipart 表单或请求上下文MediaDomain/ServerEnvironment则留在storyteller_web而非共享层依赖检查只用 serde / utoipa / chrono / url 与enums、tokens不得引入 actix-web。以上约定配合 AGENTS.md 与同目录的 CLAUDE.md内容与 AGENTS.md 完全一致构成了 ArtCraft 共享 API 契约层的完整开发规范也是后续参与该仓库 API 层开发时的首要阅读材料。赞分享人工智能AI 应用媒体生成桌面应用【免费下载链接】artcraftArtCraft is an intentional crafting engine for artists, designers, and filmmakers项目地址https://gitcode.com/GitHub_Trending/ar/artcraft点击查看免费下载相关推荐Gitpod 协议层深度解析gitpod-protocol 共享类型定义与跨服务通信契约Gitpod 协议层深度解析gitpod protocol 共享类型定义与跨服务通信契约 Gitpod Protocol components/gitpod开发工具后端云原生Civitai 的 civitai/buzz 包Buzz 服务类型化 HTTP 客户端与共享货币化规则解析Civitai 的 civitai/buzz 包Buzz 服务类型化 HTTP 客户端与共享货币化规则解析 导读 civitai/buzz 是 Civit后端前端AI 应用Cherry Studio 共享数据类型层src/shared/data完全指南Data API、Cache、Preference 与 BootConfig 的类型契约Cherry Studio 共享数据类型层src/shared/data完全指南Data API、Cache、Preference 与 BootConfi人工智能大模型AI 应用交互助手本地部署上一篇Apache Beam Twitter 流式接入实战Splittable DoFn、单例连接管理与按时间/条数终止的无界管道示例下一篇你的菜单栏是否已成为效率黑洞用Ice重新定义macOS界面管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OB_Template 课程笔记模板 CourseNote V2 解析:用 Obsidian 核心插件搭建“记录—提炼—行动“学习工作流

OB_Template 课程笔记模板 CourseNote V2 解析:用 Obsidian 核心插件搭建“记录—提炼—行动“学习工作流

文档 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/ob/OB_Template 点击查看 免费下载 本篇技术指南以开…

2026/10/15 2:54:29 阅读更多 →
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字

C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字

问题描述班级里举办了一场糖葫芦派对,每位同学都拿到了一串糖葫芦,每串糖葫芦上插着数量不同的山楂果(用整数表示)。已知班级中除了一个同学的糖葫芦串上的山楂果数量是独一无二的外,其他所有同学的糖葫芦串上的山楂果…

2026/10/15 2:54:29 阅读更多 →
基于 Docker 构建 syncthing-android 应用:从 Builder 镜像到 APK 产物的完整实践指南

基于 Docker 构建 syncthing-android 应用:从 Builder 镜像到 APK 产物的完整实践指南

移动开发数据同步 【免费下载链接】syncthing-android Wrapper of syncthing for Android. 项目地址: https://gitcode.com/gh_mirrors/sy/syncthing-android 点击查看 免费下载 导读:syncthing-android 是 Syncthing 的 Android 封装版,其核…

2026/10/15 2:53:29 阅读更多 →

最新新闻

Java接入个人微信API:消息回调进客服系统的正确姿势

Java接入个人微信API:消息回调进客服系统的正确姿势

Java 团队接个人微信,通常第一反应是:Spring Boot 写个 Controller,接收回调,然后直接在方法里写业务。 本地调试挺顺,一上生产就出现:接口超时、消息重复、Tomcat 线程打满。 问题不在 Java,而…

2026/10/15 3:33:41 阅读更多 →
YOLO26算法室内工作环境手部手势目标检测+训练好的模型+8212张数据集+pyqt可视化界面

YOLO26算法室内工作环境手部手势目标检测+训练好的模型+8212张数据集+pyqt可视化界面

YOLO26算法室内工作环境手部手势目标检测训练好的模型8212张数据集pyqt可视化界面 这套数据共 8212 张图。用 YOLO26 训了 100 轮,mAP50 0.7315,mAP50-95 0.6002。Precision 0.7335、Recall 0.7532。下面按数据构成 → 训练曲线 → 预测效果的顺序过一遍…

2026/10/15 3:33:41 阅读更多 →
仓颉编程语言 I/O 节点流完全指南:标准流与文件流的实战解析

仓颉编程语言 I/O 节点流完全指南:标准流与文件流的实战解析

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/15 3:33:41 阅读更多 →
LAMMPS bond_style mm3 键伸缩势详解:YAFF 包的 MM3 非谐势实现、参数配置与实战应用

LAMMPS bond_style mm3 键伸缩势详解:YAFF 包的 MM3 非谐势实现、参数配置与实战应用

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 导读 bond_style mm3 是 LAMMPS 中用于描述键伸缩运动的非谐势模型&…

2026/10/15 3:33:41 阅读更多 →
Flutter Engine Windows 无障碍实现解析:MSAA 与 UI Automation 在 AXPlatformNodeWin 中的落地

Flutter Engine Windows 无障碍实现解析:MSAA 与 UI Automation 在 AXPlatformNodeWin 中的落地

跨平台前端移动开发OpenHarmony 【免费下载链接】flutter_flutter 本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于…

2026/10/15 3:33:41 阅读更多 →
Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

Natron ErodeSmooth 节点完全指南:归一化功率加权腐蚀/膨胀滤镜的参数解析与源码级解读

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/15 3:32:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →