Gemini cli 源码分析之工具篇:ReadFile 工具从入口到落盘的完整链路拆解
1. 从一次“读不到文件”的报错说起ReadFile 工具到底在做什么如果你正在读 Gemini cli 的源码大概率会先被它的工具层绕晕tools.ts里一堆抽象基类read-file.ts里又套了 Invocation、Schema、遥测三套逻辑光看 import 就劝退。我最初想搞清楚的问题特别朴素——当模型说“帮我读一下 config.json”这个请求到底是怎么从工具入口一路走到磁盘、再把内容塞回上下文的这就是本篇要拆的 Gemini cli 源码分析主线ReadFile 工具从入口到落盘的完整链路。它不是一个“调用 fs.readFile 就完事”的函数而是一条包含参数校验、路径解析、工作区边界检查、分页截断、遥测上报的流水线。搞懂这条链路你再看 WriteFile、SearchText 这些工具会发现它们几乎是同一套骨架换了个执行体。ReadFile 工具适合谁读三类人一是想给 Gemini cli 写自定义工具的开发者你需要知道基类要求你实现哪些钩子二是做 AI Agent 工具层设计的工程师ReadFile 是“只读工具”的典型样本安全边界怎么划、大文件怎么截断都在这里三是单纯想读懂 CLI 工具层源码的人这条链路足够典型读透一个等于读透一类。先给结论性的阅读地图入口在ReadFileTool的createInvocation执行在ReadFileToolInvocation.execute落盘读取委托给processSingleFileContent安全校验集中在validateToolParamValues遥测在logFileOperation。下面按这条顺序逐个拆每一步都给可复制的定位路径和关键函数清单最后演示一次本地运行验证读取行为。需要说明的是源码分析最怕“只看不跑”。我会在第三节给出可复制的配置片段让你把 Gemini cli 接到一个稳定的模型端点上这样你在读execute时能真实触发一次读取观察截断提示和遥测日志而不是对着代码空想。这也是我读源码的习惯先让它跑起来再顺着日志反推调用栈。2. 读源码前的前置准备把 Gemini cli 接到稳定端点并定位工具目录在动手翻read-file.ts之前建议先把运行环境搭好。原因很实际Gemini cli 的工具层大量依赖Config注入而Config里的模型端点、工作区目录、文件过滤选项都会影响 ReadFile 的行为。如果你只是静态读代码很容易忽略“路径解析依赖 getTargetDir”这种细节跑起来之后一次读取就能暴露这些依赖。前置准备分两步定位源码目录配置模型端点。第一步定位工具目录。Gemini cli 的工具实现通常集中在packages/core/src/tools/下ReadFile 对应read-file.ts基类在tools.ts文件处理在../utils/fileUtils.ts。你可以用下面的命令快速确认结构# 在 Gemini cli 仓库根目录执行 find . -name read-file.ts -not -path */node_modules/* find . -name tools.ts -not -path */node_modules/* find . -name fileUtils.ts -not -path */node_modules/*拿到路径后先别急着逐行读用grep把关键符号列出来建立索引# 列出 ReadFile 相关的关键符号 grep -n class ReadFileTool\|class ReadFileToolInvocation\|createInvocation\|validateToolParamValues\|processSingleFileContent \ packages/core/src/tools/read-file.ts这一步能帮你快速建立“入口—执行—校验—落盘”的符号地图后面读代码时不会迷路。第二步配置模型端点。Gemini cli 需要一个可用的模型服务来驱动工具调用。这里我用 TaoToken 作为接入端点它的 API 地址是https://taotoken.net/api兼容常见的对话与工具调用协议。你需要在环境变量或配置文件中填入 Base URL 和 API Key。以环境变量为例export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_API_KEY你的APIKey如果你用的是 Gemini cli 的 settings 配置可以写成 JSON 片段路径按你本地实际配置文件为准通常是项目根目录下的.gemini/settings.json{ model: { baseUrl: https://taotoken.net/api, apiKey: 你的APIKey, modelId: gemini-2.5-pro } }注意这里的三件套必须齐全Base URL、API Key、Model ID。少任何一个工具调用都会在初始化阶段失败而不是在 ReadFile 执行时报错——这点很容易误判后面排障章节会细说。配置完成后先跑一次最简单的对话确认端点通gemini --prompt 回复 ok如果返回正常说明模型端点没问题接下来读 ReadFile 源码时你就能真实触发一次文件读取。API Key 可以在 TaoToken 的 API Keys 页面创建接入细节参考官方文档即可。前置准备做到这里就够了。核心是源码目录定位清楚模型端点跑通这样你读execute时能对照真实行为而不是纯静态推理。3. 可复制配置与关键函数清单ReadFile 从入口到落盘的链路拆解这一节是全文的技术核心。我会按调用顺序把 ReadFile 工具从入口到落盘的链路拆成五段每段给出可复制的定位命令和关键函数清单。你可以边读边在本地对照。3.1 入口层ReadFileTool 与 createInvocationReadFile 工具的入口是ReadFileTool类它继承自BaseDeclarativeTool。这个基类定义了工具的通用行为框架名称、描述、参数 Schema、以及创建执行实例的工厂方法。关键函数是createInvocationprotected createInvocation( params: ReadFileToolParams, messageBus?: MessageBus, _toolName?: string, _toolDisplayName?: string, ): ToolInvocationReadFileToolParams, ToolResult { return new ReadFileToolInvocation( this.config, params, messageBus, _toolName, _toolDisplayName, ); }这里体现了两个设计点。第一工具定义与执行分离ReadFileTool只负责“声明这个工具长什么样”真正的读取逻辑在ReadFileToolInvocation里。第二依赖注入config从构造函数传入执行实例拿到的是同一个配置对象保证工作区目录、文件过滤选项一致。参数接口ReadFileToolParams很简洁只有三个字段export interface ReadFileToolParams { file_path: string; offset?: number; limit?: number; }file_path必填offset和limit可选用于分页读取大文件。这个设计的好处是职责单一工具只关心“读哪个文件的哪一段”不掺和别的逻辑。3.2 校验层validateToolParamValues 的多层检查在执行之前validateToolParamValues会做四层校验。这是 ReadFile 安全性的关键也是读源码时最容易被跳过、但最不该跳过的一段。第一层基础参数校验file_path去空格后不能为空。第二层工作区边界检查解析后的绝对路径必须落在工作区目录或项目临时目录内。第三层数值范围校验offset不能为负limit必须为正。第四层文件过滤检查如果路径命中 ignore 规则直接拒绝。工作区边界检查的代码大致是这样const isWithinTempDir resolvedPath.startsWith(resolvedProjectTempDir path.sep) || resolvedPath resolvedProjectTempDir; if ( !workspaceContext.isPathWithinWorkspace(resolvedPath) !isWithinTempDir ) { const directories workspaceContext.getDirectories(); return File path must be within one of the workspace directories: ${directories.join(, )} or within the project temp directory: ${projectTempDir}; }这段逻辑的价值在于防目录遍历。如果模型被诱导去读../../etc/passwdpath.resolve会把它解析成工作区外的绝对路径边界检查直接拦下。注意isWithinTempDir用的是startsWith(resolvedProjectTempDir path.sep)加path.sep是为了防止/tmp/project-evil这种前缀伪装。3.3 执行层ReadFileToolInvocation.execute 的路径解析与分页进入execute后第一件事是路径解析this.resolvedPath path.resolve( this.config.getTargetDir(), this.params.file_path, );getTargetDir()返回工作区根目录path.resolve把相对路径转成绝对路径。这一步决定了后续所有文件操作的实际目标。接着调用processSingleFileContent完成真正的落盘读取。这个函数在fileUtils.ts里负责判断文件类型、读取内容、处理截断。返回结果里如果isTruncated为真说明文件太大只读了一部分。这时execute会构造一段对模型友好的提示if (result.isTruncated) { const [start, end] result.linesShown!; const total result.originalLineCount!; const nextOffset this.params.offset ? this.params.offset end - start 1 : end; llmContent IMPORTANT: The file content has been truncated. Status: Showing lines ${start}-${end} of ${total} total lines. Action: To read more of the file, you can use the offset and limit parameters in a subsequent read_file call. For example, to read the next section of the file, use offset: ${nextOffset}. --- FILE CONTENT (truncated) --- ${result.llmContent}; }这段提示的设计很讲究它不只告诉模型“被截断了”还给出下一步的具体参数nextOffset。模型拿到这个提示下一轮就能自动续读不需要人干预。这是 ReadFile 分页机制能闭环的关键。3.4 落盘层processSingleFileContent 与 MIME 识别processSingleFileContent是真正碰磁盘的地方。它做三件事识别 MIME 类型、读取内容、按行截断。MIME 识别通过getSpecificMimeType完成用于区分文本、图片、二进制等不同处理策略。文本文件走行读取图片可能走 base64 编码二进制则直接拒绝或特殊处理。截断逻辑按行计算如果文件行数超过默认上限只返回前 N 行并记录linesShown和originalLineCount。这两个字段回传给execute用于构造上面那段续读提示。3.5 遥测层logFileOperation 的多维上报读取完成后execute会调用logFileOperation上报一次文件操作事件。上报字段包括工具名、操作类型READ、行数、MIME 类型、文件扩展名、编程语言。编程语言通过getProgrammingLanguage推断用于后续统计。const lines typeof result.llmContent string ? result.llmContent.split(\n).length : undefined; const mimetype getSpecificMimeType(this.resolvedPath); const programming_language getProgrammingLanguage({ file_path: this.resolvedPath, }); logFileOperation( this.config, new FileOperationEvent( READ_FILE_TOOL_NAME, FileOperation.READ, lines, mimetype, path.extname(this.resolvedPath), programming_language, ), );遥测层是只读的不影响读取结果但它对理解工具行为很有帮助你可以在日志里看到每次读取的行数、类型、语言反推模型到底读了什么。把五段串起来完整链路是createInvocation创建执行实例 →validateToolParamValues四层校验 →execute解析路径 →processSingleFileContent落盘读取 → 截断判断与续读提示 →logFileOperation上报。这条链路你可以在本地用一次读取验证下一节给具体操作。4. 本地运行验证一次 ReadFile 读取行为的完整观察读完链路必须跑一次才算真懂。这一节演示如何用 Gemini cli 触发一次 ReadFile并观察读取行为、截断提示和遥测日志。先准备一个测试文件故意造一个超过默认行数上限的大文件这样能同时验证正常读取和截断逻辑mkdir -p /tmp/gemini-readfile-demo cd /tmp/gemini-readfile-demo seq 1 500 big.txt echo {name:demo,version:1.0.0} config.jsonbig.txt有 500 行config.json是单行小文件。接下来在 Gemini cli 里发起读取请求。假设你已经按第二节配好了端点直接运行gemini --prompt 读取 config.json 的内容并告诉我 name 字段的值预期结果是模型返回demo。这一步验证的是小文件全量读取路径validateToolParamValues通过processSingleFileContent读取完整内容isTruncated为假直接返回。再读大文件gemini --prompt 读取 big.txt 的前 100 行这时模型会调用 ReadFile传入file_path: big.txt、limit: 100。观察返回内容你应该能看到前 100 行且没有截断提示因为limit显式指定了读取范围。最后测截断路径不传limitgemini --prompt 读取 big.txt 的全部内容如果文件超过默认上限返回内容里会出现IMPORTANT: The file content has been truncated.这段提示并给出nextOffset。你可以让模型继续读gemini --prompt 继续读取 big.txt 的下一段模型会根据上一轮的nextOffset自动传入offset续读下一段。这就是分页闭环的实际效果。如果你想直接观察遥测日志可以在启动时打开调试输出。不同版本的日志开关不同常见的是设置环境变量export DEBUGgemini:telemetry gemini --prompt 读取 config.json日志里会打印FileOperationEvent包含行数、MIME 类型、扩展名、编程语言。对照第三节的遥测代码你能看到每个字段的实际值。验证过程中有两个观察点值得留意。第一路径解析如果你传入../config.json而它落在工作区外会直接被validateToolParamValues拒绝报错信息里会列出允许的工作区目录。第二文件过滤如果工作区配了 ignore 规则命中规则的文件会被shouldIgnoreFile拦下报错提示“ignored by configured ignore patterns”。跑完这三组读取你对 ReadFile 链路的理解就从“读代码”变成“看行为”了。下一节整理常见报错都是我在实际接入和调试时踩过的。5. 常见报错排查401、local proxy failed 与 reading choices 的定位思路读源码和跑验证的过程中报错是常态。这一节按报错类型整理排查思路覆盖 401、local proxy failed、reading choices、OAuth 这几类高频问题。注意这些报错大多不在 ReadFile 本身而在它依赖的模型端点和配置层所以排查时要先分清“是工具层的问题还是接入层的问题”。第一类401 Unauthorized。典型表现是工具调用还没开始就失败日志里出现 401。原因通常是 API Key 缺失、过期或拼写错误。排查步骤先确认环境变量或 settings 里的apiKey是否填对再确认 Base URL 是否指向https://taotoken.net/api。如果用的是 settings JSON检查三件套是否齐全{ model: { baseUrl: https://taotoken.net/api, apiKey: 你的APIKey, modelId: gemini-2.5-pro } }Base URL、API Key、Model ID 缺一不可。很多人只填了 Key 忘了 Model ID结果报错信息看起来像鉴权失败实际是模型未指定。API Key 可以在 TaoToken 的 API Keys 页面重新生成接入文档里有完整的字段说明。第二类local proxy failed。这个报错通常出现在网络层提示本地代理连接失败。排查方向是检查你的运行环境是否有残留的代理配置比如HTTP_PROXY、HTTPS_PROXY环境变量指向了一个不可用的地址。清理这些变量后重试unset HTTP_PROXY HTTPS_PROXY ALL_PROXY如果你在容器或 CI 环境里跑检查容器的网络策略是否允许访问外部端点。这类问题的核心是“请求根本没发出去”和 ReadFile 的代码逻辑无关。第三类reading choices 相关报错。典型表现是解析模型响应时失败日志里出现reading choices或类似字段访问错误。原因是模型返回的响应结构不符合预期可能是端点返回了错误对象而非标准对话结构。排查步骤先用一个最简单的请求确认端点返回格式curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer 你的APIKey \ -H Content-Type: application/json \ -d {model:gemini-2.5-pro,messages:[{role:user,content:ok}]}如果返回结构里没有choices字段说明端点或模型 ID 不匹配。对照官方文档确认模型 ID 写法。第四类OAuth 相关报错。如果你用的是 OAuth 方式接入报错通常出现在 token 刷新阶段。排查方向是检查 token 是否过期、回调地址是否配置正确。这类问题建议直接看接入文档里的 OAuth 章节按步骤重新走一遍授权流程。排查的通用原则先分层再定位。接入层报错401、proxy、OAuth看配置和网络工具层报错路径越界、文件被忽略看validateToolParamValues的返回信息解析层报错reading choices看端点响应结构。分清楚层次排查效率会高很多。6. 把 ReadFile 当作工具层设计的样本后续阅读与接入建议ReadFile 这条链路读透之后你会发现 Gemini cli 的工具层有一套稳定的骨架声明式工具定义 执行实例 多层校验 遥测上报。WriteFile、SearchText、RunCommand 基本都是这个模式差别只在执行体和校验规则。所以后续读其他工具时可以套用同一张阅读地图先找createInvocation再找validateToolParamValues然后看execute的落盘逻辑最后看遥测字段。如果你想自己写一个自定义工具ReadFile 是最好的模板。继承BaseDeclarativeTool定义参数接口和 JSON Schema实现createInvocation返回你的执行实例在execute里完成实际逻辑别忘了在validateToolParamValues里做边界检查。安全边界这块ReadFile 的工作区校验和临时目录白名单值得直接借鉴。接入层面如果你要把 Gemini cli 接到自己的模型端点记住三件套Base URL、API Key、Model ID。Base URL 用https://taotoken.net/apiKey 在 API Keys 页面创建Model ID 按官方文档填。配置写进 settings JSON 或环境变量都行关键是三件套齐全。跑通之后你可以用第四节的验证方法真实触发一次 ReadFile观察截断和遥测行为。读源码这件事最怕停在“看懂了”的层面。我的建议是每读一个工具就跑一次对应的调用对照日志和返回内容验证你的理解。ReadFile 的截断提示、路径校验、遥测字段都是跑一次就能记住的细节。等你把 ReadFile、WriteFile、SearchText 都跑一遍Gemini cli 的工具层设计对你来说就不再是黑盒了。

相关新闻

5 分钟跑通 ArtCraft:一条脚本启动 AI 图像生成桌面应用

5 分钟跑通 ArtCraft:一条脚本启动 AI 图像生成桌面应用

5 分钟跑通 ArtCraft:一条脚本启动 AI 图像生成桌面应用 【免费下载链接】artcraft ArtCraft is an intentional crafting engine for artists, designers, and filmmakers 项目地址: https://gitcode.com/GitHub_Trending/ar/artcraft ArtCraft 是一个面向艺…

2026/10/13 2:15:26 阅读更多 →
AI Agent 架构设计:上下文窗口压缩(OpenClaw、Claude Code、Hermes Agent 对比)——用 TaoToken 统一 Key 跑通三家实测

AI Agent 架构设计:上下文窗口压缩(OpenClaw、Claude Code、Hermes Agent 对比)——用 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 2:15:26 阅读更多 →
Claude Code 最全使用指南:CLAUDE.md、rules、skills、memory 一次讲清,TaoToken 统一 Key 接入

Claude Code 最全使用指南:CLAUDE.md、rules、skills、memory 一次讲清,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 2:15:26 阅读更多 →

最新新闻

Mathesar 0.5.0 版本详解:表单构建器、记录查看体验与安装流程的全面升级

Mathesar 0.5.0 版本详解:表单构建器、记录查看体验与安装流程的全面升级

数据库后端前端协作 【免费下载链接】mathesar An intuitive spreadsheet-like interface that lets users of all technical skill levels view, edit, query, and collaborate on Postgres data directly. 100% open source and self hosted, with native Postgres access co…

2026/10/13 2:56:40 阅读更多 →
把 79 个数据工具塞进一个 Python 脚本,再用 n8n 排成日更流水线:TaoToken 统一 Key 接入实践

把 79 个数据工具塞进一个 Python 脚本,再用 n8n 排成日更流水线: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 2:56:40 阅读更多 →
OpenSpiel 中的 Hive 棋实现:面向 AlphaZero 的六边形棋盘建模、UHP 协议与动作空间设计

OpenSpiel 中的 Hive 棋实现:面向 AlphaZero 的六边形棋盘建模、UHP 协议与动作空间设计

人工智能强化学习深度学习 【免费下载链接】open_spiel OpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games. 项目地址: https://gitcode.com/gh_mirrors/op/open_spiel 点击…

2026/10/13 2:56:40 阅读更多 →
Ask Dr. Andrew Huberman 系统提示词深度解析:TheBigPromptLibrary 中神经科学人物模拟 GPT 的指令设计

Ask Dr. Andrew Huberman 系统提示词深度解析:TheBigPromptLibrary 中神经科学人物模拟 GPT 的指令设计

提示工程AI 安全治理 【免费下载链接】TheBigPromptLibrary A collection of prompts, system prompts and LLM instructions 项目地址: https://gitcode.com/gh_mirrors/th/TheBigPromptLibrary 点击查看 免费下载 本篇技术指南围绕 TheBigPromptLibrary 仓库中收…

2026/10/13 2:56:40 阅读更多 →
C#反编译实战:从dll/exe还原可编译源码的完整流程与避坑

C#反编译实战:从dll/exe还原可编译源码的完整流程与避坑

简介:这份C#反编译工具包面向需要查看、分析和理解.NET程序集内部结构的开发者,适用于代码逆向、调试排错和技术学习等场景。压缩包共16个文件,大小2.19MB,以dll、exe、txt、rtf等类型为主,其中包含RedGate Reflector及…

2026/10/13 2:56:40 阅读更多 →
Bresenham画圆算法:整数微分与八分对称的嵌入式图形实现

Bresenham画圆算法:整数微分与八分对称的嵌入式图形实现

/* 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 2:55:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/12 0:16:38 阅读更多 →
影刀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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →