<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Auto | Twinkle</title><link>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/</link><atom:link href="https://modelscope.github.io/twinkle-web/zh/docs/components/auto/index.xml" rel="self" type="application/rss+xml"/><description>Auto</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-Hans</language><image><url>https://modelscope.github.io/twinkle-web/media/logo_hu_fedc6a0bfe689b18.png</url><title>Auto</title><link>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/</link></image><item><title>Auto-Research</title><link>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/auto-research/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/auto-research/</guid><description>&lt;p&gt;Twinkle Auto 是一个基于终端的智能训练助手，支持通过&lt;strong&gt;自然语言控制、监控和调试 ML 训练&lt;/strong&gt;。它将聊天驱动的 AI 代理与自动化健康监控器相结合，能够自主检测并修复训练故障。&lt;/p&gt;
&lt;h2 id="架构概览"&gt;架构概览&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ TwinkleAuto (asyncio 聊天循环) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 核心组件: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AgentLoop ─── LLM 工具调用循环 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ TrainingMonitor ─── 定期健康检查与自动修复 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ LocalConnection ─── 基于文件系统的通信层 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ SkillManager ─── 异步插件加载 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装与启动"&gt;安装与启动&lt;/h2&gt;
&lt;p&gt;Auto 是 &lt;code&gt;twinkle-client&lt;/code&gt; 包的一部分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install twinkle-client
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="命令行用法"&gt;命令行用法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 基本启动（使用默认本地 Ollama 端点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;twinkle-auto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定 LLM 后端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;twinkle-auto --llm-base-url http://localhost:11434/v1 --llm-model qwen3.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 连接到已有训练运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;twinkle-auto --run-id my-grpo-run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用远程 API（如 OpenAI 兼容接口）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;twinkle-auto --llm-base-url https://api.example.com/v1 --llm-api-key sk-xxx --llm-model gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启用调试日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;twinkle-auto --verbose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可作为 Python 模块运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -m twinkle_client.auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cli-参数"&gt;CLI 参数&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;环境变量&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--run-id&lt;/code&gt;, &lt;code&gt;-r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_AUTO_RUN_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;连接到已有训练运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--llm-base-url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_LLM_BASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://localhost:11434/v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM API 基础 URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--llm-model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_LLM_MODEL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen3.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM 模型名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--llm-api-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_LLM_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;not-needed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM API 密钥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--verbose&lt;/code&gt;, &lt;code&gt;-v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TWINKLE_AUTO_VERBOSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;启用 DEBUG 日志&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--version&lt;/code&gt;, &lt;code&gt;-V&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;显示版本并退出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="聊天代理"&gt;聊天代理&lt;/h2&gt;
&lt;p&gt;Auto 的核心是一个 &lt;strong&gt;LLM 驱动的工具调用代理&lt;/strong&gt;（&lt;code&gt;AgentLoop&lt;/code&gt;），通过 OpenAI 兼容 API 处理自然语言命令。代理维护对话历史并自动修剪（保留最近 50 条消息），每次交互最多支持 10 轮工具调用。&lt;/p&gt;
&lt;h3 id="你可以这样说"&gt;你可以这样说&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;训练生命周期：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;列出我的训练运行&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;用 Qwen3.5-4B 在 gsm8k 上启动一个新的 GRPO 训练&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;暂停当前运行&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;恢复训练&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;停止训练&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;服务器管理：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;启动服务器，使用 Qwen3.5-4B 和一个 2 卡的 Qwen3.5-72B 采样器&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;关闭服务器&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;有多少 GPU 可用？&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;监控与分析：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;训练进展如何？&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;显示 reward 相关的指标&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;放大到 step 100-200&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;重置图表视图&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;搜索：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;搜索数学数据集&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;ldquo;在 ModelScope 上查找 Qwen 模型&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="可用工具"&gt;可用工具&lt;/h3&gt;
&lt;p&gt;代理内置 13 个工具：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_training_runs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列出所有训练运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_training_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取详细状态和最近指标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start_server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;启动 Ray 集群 + Twinkle Server（幂等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shutdown_server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;关闭服务器并释放 GPU 资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start_training&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建并启动新的训练运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;切换监控到另一个运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pause_training&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;暂停训练（SIGKILL，服务器保留状态）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resume_training&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通过重新启动客户端脚本恢复训练&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stop_training&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;停止训练（SIGTERM，保存检查点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_script&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;更新训练脚本（带版本归档）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_supported_models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询服务器支持的模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_datasets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在 ModelScope 搜索数据集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在 ModelScope 搜索模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zoom_metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;调整指标图表视图范围&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select_metrics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;选择显示哪些指标（最多 4 个）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_cluster_info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取 GPU/集群资源信息&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="服务器启动"&gt;服务器启动&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;start_server&lt;/code&gt; 工具自动化一个多步骤流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GPU 检测&lt;/strong&gt; — &lt;code&gt;nvidia-smi&lt;/code&gt; 硬件扫描&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU 分配&lt;/strong&gt; — 在训练模型和采样器之间分配 GPU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置生成&lt;/strong&gt; — 自动创建 &lt;code&gt;server_config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ray 集群启动&lt;/strong&gt; — 多节点 GPU 分区，隔离 &lt;code&gt;CUDA_VISIBLE_DEVICES&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务器启动&lt;/strong&gt; — 作为后台进程启动 Twinkle Server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康检查&lt;/strong&gt; — 轮询 &lt;code&gt;/api/v1/healthz&lt;/code&gt; 直到就绪&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;支持多模型拓扑：1 个训练模型 + N 个采样器/教师模型。&lt;/p&gt;
&lt;h3 id="skills-系统"&gt;Skills 系统&lt;/h3&gt;
&lt;p&gt;Auto 支持从三个来源加载可扩展的技能插件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内置技能&lt;/strong&gt; — 包含在 &lt;code&gt;twinkle_client/skills/bundled/&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户本地技能&lt;/strong&gt; — &lt;code&gt;~/.cache/twinkle/auto/skills/local/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区技能&lt;/strong&gt; — 从 ModelScope 获取（尽力而为，10 秒超时）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;技能在启动后异步加载并注入代理的系统提示词中。代理在技能加载完成前即可使用。&lt;/p&gt;
&lt;h2 id="训练监控器自动修复"&gt;训练监控器（自动修复）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;TrainingMonitor&lt;/code&gt; 是一个后台服务，每 &lt;strong&gt;30 秒&lt;/strong&gt;运行一次，收集当前训练运行的所有可用信号，并提交给 LLM 进行分析。&lt;/p&gt;
&lt;h3 id="收集的信号"&gt;收集的信号&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进程状态&lt;/strong&gt;：alive / dead / unknown&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;output.log 尾部&lt;/strong&gt;：最后 1500 个字符（优先提取 traceback）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指标&lt;/strong&gt;：最近条目 + 前半段 vs 后半段趋势分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;停滞时长&lt;/strong&gt;：自最后一次产生指标以来的秒数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前 train.py&lt;/strong&gt;：完整脚本源码（用于精确修复）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="决策框架"&gt;决策框架&lt;/h3&gt;
&lt;p&gt;LLM 将每次检查分类为三种操作之一：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;决策&lt;/th&gt;
&lt;th&gt;触发条件&lt;/th&gt;
&lt;th&gt;执行动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LGTM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;训练正常推进&lt;/td&gt;
&lt;td&gt;无操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WARNING&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Loss 平台期、reward hacking、KL 爆炸等&lt;/td&gt;
&lt;td&gt;向用户报告观察结果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FIX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;脚本崩溃、进程死亡并有 traceback&lt;/td&gt;
&lt;td&gt;自动修复并重启&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="自动修复流程"&gt;自动修复流程&lt;/h3&gt;
&lt;p&gt;当需要 FIX 时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LLM 输出诊断 + 完整修复脚本&lt;/li&gt;
&lt;li&gt;监控器将旧 &lt;code&gt;train.py&lt;/code&gt; 归档为 &lt;code&gt;train_v{N}.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将修复脚本写为新的 &lt;code&gt;train.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;resume_training&lt;/code&gt; 重新启动训练&lt;/li&gt;
&lt;li&gt;重置停滞追踪&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;安全保障：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个运行最多 &lt;strong&gt;3 次自动修复尝试&lt;/strong&gt;（防止无限重试循环）&lt;/li&gt;
&lt;li&gt;修复尝试按 &lt;code&gt;run_id&lt;/code&gt; 追踪&lt;/li&gt;
&lt;li&gt;快照去重避免对未变化状态的重复分析&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="基于文件的连接层"&gt;基于文件的连接层&lt;/h2&gt;
&lt;p&gt;Auto 通过本地文件系统与训练进程通信：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.cache/twinkle/{run_id}/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── meta.json — 运行元数据（model_id、config、status、pid）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── metrics.jsonl — 每步一个 JSON 对象（增量）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── output.log — 训练的 stdout+stderr 合并输出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── train.py — 当前活动训练脚本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── train_v{N}.py — 归档的历史脚本版本
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="训练控制模型"&gt;训练控制模型&lt;/h3&gt;
&lt;p&gt;在 Server 模式下，Twinkle Server 将所有模型/优化器状态保留在 GPU 内存中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;暂停&lt;/strong&gt; = 杀死客户端进程 (SIGKILL) — 服务器状态保留&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;恢复&lt;/strong&gt; = 重新启动客户端脚本 — 无缝继续训练&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;停止&lt;/strong&gt; = SIGTERM — 触发检查点保存后退出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭服务器&lt;/strong&gt; = 释放 GPU 资源，&lt;strong&gt;销毁&lt;/strong&gt;模型状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="trainingruntime脚本集成"&gt;TrainingRuntime（脚本集成）&lt;/h2&gt;
&lt;p&gt;训练脚本使用 &lt;code&gt;TrainingRuntime&lt;/code&gt; 与 Auto 集成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twinkle_client.auto.runtime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TrainingRuntime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrainingRuntime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my-grpo-run&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Qwen/Qwen3.5-4B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1e-5&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_graceful_shutdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataloader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataloader&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ... 训练逻辑 ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grad_norm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Completed step &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;, loss=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="核心方法"&gt;核心方法&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start(model_id, config, script_path)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;初始化运行目录和元数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;log_metrics(**kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;向 &lt;code&gt;metrics.jsonl&lt;/code&gt; 写入指标条目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;log(message)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;打印日志消息（被捕获为 &lt;code&gt;output.log&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_resume_info()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取 &lt;code&gt;last_step&lt;/code&gt; 用于从检查点恢复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;finish(status)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标记训练完成，关闭文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;register_graceful_shutdown(model, dataloader)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;注册 SIGTERM 处理器以保存检查点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="断点续训支持"&gt;断点续训支持&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TrainingRuntime&lt;/code&gt; 自动将训练进度保存到 &lt;code&gt;meta.json&lt;/code&gt;（每 5 秒节流写入一次）。脚本可以使用 &lt;code&gt;get_resume_info()&lt;/code&gt; 从上次保存的步数恢复：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrainingRuntime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my-run&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_resume_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;global_step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;last_step&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;global_step&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skip_consumed_samples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;global_step&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;BATCH_SIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;从 step &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;global_step&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; 恢复训练&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="优雅关停"&gt;优雅关停&lt;/h3&gt;
&lt;p&gt;调用 &lt;code&gt;register_graceful_shutdown()&lt;/code&gt; 后，会安装一个 SIGTERM 处理器：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;保存模型检查点（LoRA 权重 + 优化器状态）&lt;/li&gt;
&lt;li&gt;保存数据加载器位置（&lt;code&gt;consumed_train_samples&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;记录检查点路径&lt;/li&gt;
&lt;li&gt;标记训练为 &lt;code&gt;stopped&lt;/code&gt; 并退出&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="日志记录"&gt;日志记录&lt;/h2&gt;
&lt;p&gt;所有日志写入 &lt;code&gt;./auto.log&lt;/code&gt;（当前工作目录）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5MB 时轮转，保留 3 个备份&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无控制台输出&lt;/strong&gt; — 所有输出写入日志文件&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;--verbose&lt;/code&gt; 启用 DEBUG 级别日志&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SkillProvider 技能系统</title><link>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/skillprovider/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://modelscope.github.io/twinkle-web/zh/docs/components/auto/skillprovider/</guid><description>&lt;p&gt;技能系统允许 Twinkle Auto 智能体从外部来源（Git 仓库、API、本地文件）动态加载专业知识，并注入到 LLM 的系统提示词中。&lt;/p&gt;
&lt;h2 id="架构"&gt;架构&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类&lt;/th&gt;
&lt;th&gt;角色&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;持有单个技能名称、内容和来源的数据类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SkillProvider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;从数据源获取技能的抽象基类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SkillManager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;编排多个 Provider，聚合技能用于提示词注入&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="skill-数据类"&gt;Skill 数据类&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@dataclasses.dataclass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="c1"&gt;# 简短标识符（通常为文件名去除扩展名）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="c1"&gt;# 完整的 Markdown 内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="c1"&gt;# Provider 名称 + 相对路径，用于可追溯性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="创建自定义-provider"&gt;创建自定义 Provider&lt;/h2&gt;
&lt;p&gt;继承 &lt;code&gt;SkillProvider&lt;/code&gt; 并实现 &lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;fetch()&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twinkle_client.skills.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillProvider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MySkillProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SkillProvider&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;my-skills&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 将技能文件下载/克隆到 self.cache_dir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 例如：git clone、API 下载、文件拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认的 &lt;code&gt;load_skills()&lt;/code&gt; 会扫描 &lt;code&gt;self.cache_dir&lt;/code&gt; 中的 &lt;code&gt;.md&lt;/code&gt; 文件（跳过 README、LICENSE 等），返回 &lt;code&gt;Skill&lt;/code&gt; 对象。&lt;/p&gt;
&lt;h2 id="skillmanager"&gt;SkillManager&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twinkle_client.skills.manager&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SkillManager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkillManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;another_provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 拉取并加载所有技能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;skills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 格式化为 LLM 系统提示词注入内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;prompt_section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format_for_prompt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="关键方法"&gt;关键方法&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;register(provider)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;添加技能 Provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;load_all()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从所有 Provider 拉取并加载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format_for_prompt()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;将技能渲染为系统提示词格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_skill_names()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列出已加载技能名称&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="缓存目录"&gt;缓存目录&lt;/h2&gt;
&lt;p&gt;默认缓存在 &lt;code&gt;~/.cache/twinkle/auto/skills/&amp;lt;provider_name&amp;gt;/&lt;/code&gt;。可通过向 Provider 构造函数传入 &lt;code&gt;cache_dir&lt;/code&gt; 参数覆盖。&lt;/p&gt;</description></item></channel></rss>