<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[htsclch的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/htsclch</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; htsclch]]></copyright><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（11）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207913</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207913</guid><author>htsclch</author><pubDate>Tue, 24 Mar 2026 08:38:16 +0800</pubDate><description><![CDATA[数据是如何流动的消息历史的重要性：让 LLM 看到完整上下文ReAct 循环的工作方式。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（10）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207885</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207885</guid><author>htsclch</author><pubDate>Mon, 23 Mar 2026 08:40:41 +0800</pubDate><description><![CDATA[本文介绍了一个可扩展的Skill系统架构实现。该系统采用模块化设计，每个Skill包含描述文件(SKILL.md)和功能实现(index.ts)。核心组件SkillLoader负责动态加载技能目录下的模块，解析YAML格式的元数据，并通过文件路径动态导入工具实现。系统支持热插拔功能，允许运行时启用/禁用技能模块。示例展示了计算器技能的实现方式，包含工具定义和执行逻辑。该架构遵循约定优于配置原则，实现了灵活的功能扩展能力。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（9）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207852</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207852</guid><author>htsclch</author><pubDate>Mon, 23 Mar 2026 08:40:10 +0800</pubDate><description><![CDATA[本文介绍了配置管理和命令行接口的实现方案。配置系统采用优先级机制（环境变量&gt;配置文件&gt;默认值），使用zod进行类型验证，默认工作目录为~/.turboclaw。CLI提供四个主要命令：init初始化工作区、start启动网关、send发送消息、status查看状态。系统支持文件系统、Shell和内存工具集成，通过Agent处理用户消息并返回响应。配置管理和CLI的结合为系统提供了灵活的操作接口和可扩展性。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（8）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207802</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207802</guid><author>htsclch</author><pubDate>Sat, 21 Mar 2026 11:10:32 +0800</pubDate><description><![CDATA[摘要 Gateway是系统的核心控制中心，负责协调所有组件并管理生命周期。作为&quot;大脑&quot;，它主要功能包括初始化组件、会话管理、消息路由以及协调Agent、Tools等模块。其架构包含MemoryStore、ToolRegistry、Agent和多个Channels，初始化顺序严格遵循Memory→Tools→Agent→Channels。关键特性包括基于channel+clientID的会话管理、依赖注入配置方式，以及完善的错误处理机制。通过统一的消息处理接口，Gateway能够有效协调各]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（7）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207784</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207784</guid><author>htsclch</author><pubDate>Sat, 21 Mar 2026 11:10:10 +0800</pubDate><description><![CDATA[本文介绍了两种用户交互通道的实现：Terminal命令行和WebSocket网络接口。TerminalChannel提供本地命令行交互界面，支持用户输入和AI回复；WebSocketChannel则通过WebSocketServer实现远程连接，支持多客户端通信。两者都遵循统一的Channel接口，通过依赖注入方式处理消息，其中WebSocket还使用clientId标识不同客户端。代码实现了通道的启动、停止、消息发送等功能，并提供工厂方法创建不同类型的通道实例。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（6）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207770</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207770</guid><author>htsclch</author><pubDate>Fri, 20 Mar 2026 08:46:31 +0800</pubDate><description><![CDATA[本文介绍了实现Agent长期记忆系统的设计方案。系统支持存储用户偏好、待办事项等多种信息类型，并实现跨会话保存。核心功能包括：1) 使用Markdown格式存储记忆条目，便于人工查看编辑；2) 基于关键词和标签的检索机制；3) 提供记忆添加和查询工具接口。代码实现了MemoryStore类来管理记忆条目，包含添加、查询等基本操作，并以文件形式持久化存储。系统设计注重实用性和可扩展性，无需依赖复杂数据库即可实现基础记忆功能。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（5）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207733</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207733</guid><author>htsclch</author><pubDate>Fri, 20 Mar 2026 08:45:54 +0800</pubDate><description><![CDATA[AI Agent核心机制：ReAct循环解析 摘要：ReAct循环是AI Agent的核心运行机制，通过&quot;思考(Reasoning)→行动(Acting)→观察(Observing)&quot;的循环模式实现智能决策。文章通过厨师做菜的类比解释了ReAct的工作原理，并展示了TypeScript实现代码的关键部分。实现中包含了状态管理（idle→thinking→acting）、递归深度防御机制（防止无限循环）以及工具调用与结果处理流程。核心代码演示了如何通过LLM分析用户请求、调用适当工具并处理]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（4）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207624</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207624</guid><author>htsclch</author><pubDate>Thu, 19 Mar 2026 08:36:18 +0800</pubDate><description><![CDATA[摘要 本文介绍了如何构建统一的LLM接口来连接不同大模型API（如OpenAI、DeepSeek等）。主要内容包括： 问题背景：不同LLM提供商API格式存在差异（如OpenAI与Anthropic格式不同），导致调用方式不统一。 解决方案：采用适配器模式设计统一接口，通过LLMProvider抽象层隔离底层实现差异。 代码实现： 提供OpenAI兼容格式的Provider实现（支持OpenAI/DeepSeek等） 实现Anthropic格式的Provider（需要特殊头信息） 两种Provider都实现]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（3）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207716</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207716</guid><author>htsclch</author><pubDate>Thu, 19 Mar 2026 08:35:35 +0800</pubDate><description><![CDATA[工具系统：为Agent赋能执行能力 本文介绍了Agent工具系统的设计原理和实现方法，让AI不仅能思考还能执行实际任务。核心内容： 工具的必要性：类比人类大脑需要手脚配合，LLM作为大脑需要工具系统才能完成实际任务（如文件操作） 注册表设计： 采用中央注册表统一管理所有工具 实现动态扩展和解耦 提供工具查询和格式转换功能 安全实现： 内置文件系统工具 通过路径解析和安全检查防止目录遍历攻击 限制操作在指定工作目录内 该系统使Agent具备了从认知到执行的能力闭环，源码已在GitHub开源。]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（2）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207526</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207526</guid><author>htsclch</author><pubDate>Wed, 18 Mar 2026 15:10:16 +0800</pubDate><description><![CDATA[TurboClaw 类型系统详解：作为项目基础架构的&quot;建筑图纸&quot;。系统定义了六类核心类型：1)消息类型(Message/ToolCall)，构建基础数据单元；2)Agent类型(状态/配置/思考结果)，实现AI核心逻辑；3)工具类型(参数/定义)，扩展Agent能力；4)通道类型(配置/接口)，处理用户交互；5)Gateway类型(配置/会话)，作为系统控制中心；6)LLM接口类型。这些类型定义采用TypeScript接口规范，通过清晰的类型约束确保系统各组件协同工作，类比建筑图纸指导施]]></description><category></category></item><item><title><![CDATA[1000行代码实现极简版openclaw(附源码)（1）]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/159207328</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/159207328</guid><author>htsclch</author><pubDate>Wed, 18 Mar 2026 15:09:46 +0800</pubDate><description><![CDATA[TurboClaw 是一个极简的AI Agent框架，使大语言模型具备工具调用、记忆存储和持续对话能力。其架构包含Gateway（控制中心）、Agent（决策核心）、LLM（推理引擎）、Tools（操作执行）、Memory（信息存储）、Channels（交互界面）和Session（对话管理）七大组件。数据流示例展示了从用户输入&quot;创建文件&quot;到Agent通过ReAct循环调用write_file工具完成请求的全过程。该框架让LLM突破纯对话限制，实现实际任务执行。]]></description><category></category></item><item><title><![CDATA[requestIdleCallback和requestAnimationFrame]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/147812317</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/147812317</guid><author>htsclch</author><pubDate>Fri, 09 May 2025 09:49:42 +0800</pubDate><description><![CDATA[这是浏览器提供的另一个方法，用来处理不紧急的任务。它会告诉浏览器：“等你现在没事干（没有用户输入、动画等）的时候，再执行我的代码”。避免低优先级任务卡住主线程，影响用户体验。这是浏览器提供的一个方法，专门用来做动画或高频更新的视觉效果。它会告诉浏览器：“在下一次屏幕刷新绘制画面时，请先执行我的代码”。这样你的动画会和屏幕刷新同步，避免卡顿。像数据上报、预加载内容等任务不需要立刻完成，趁浏览器空闲时处理，可以提升页面响应速度。做动画，时间可能不精准，导致丢帧卡顿。会自动匹配屏幕刷新节奏，保证流畅。]]></description><category></category></item><item><title><![CDATA[深入理解thunk函数]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/109692041</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/109692041</guid><author>htsclch</author><pubDate>Sat, 14 Nov 2020 17:05:05 +0800</pubDate><description><![CDATA[一.起源

传值调用or传名调用


var x = 1;
function f(m){
  return m * 2;     
}
f(x + 5)
// 一种意见是"传值调用"（call by value），即在进入函数体之前，就计算 x + 5 的值（等于6），再将这个值传入函数 f 。C语言就采用这种策略。
// 另一种意见是"传名调用"（call by name），即直接将表达式 x + 5 传入函数体，只在用到它的时候求值。Hskell语言采用这种策略。

传值调用和传名调用，哪一种比较好？回]]></description><category></category></item><item><title><![CDATA[js手写toUpperCase和toLoweCase]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/109317071</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/109317071</guid><author>htsclch</author><pubDate>Tue, 27 Oct 2020 18:07:40 +0800</pubDate><description><![CDATA[function toUpperCaseLch(str) {
  let strArr = str.split("");
  let max = "z".charCodeAt();
  let min = "a".charCodeAt();
  let resultArr = [];
  strArr.forEach(item =&gt; {
    let curr = item.charCodeAt();
    if(curr &lt;= max &amp;&amp; curr &gt;= min).]]></description><category></category></item><item><title><![CDATA[js加载 拒绝js阻塞—defer、async作用和区别分析]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/109310834</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/109310834</guid><author>htsclch</author><pubDate>Tue, 27 Oct 2020 14:52:37 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[深拷贝]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/108325954</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/108325954</guid><author>htsclch</author><pubDate>Mon, 31 Aug 2020 17:43:17 +0800</pubDate><description><![CDATA[1.递归


function deepCopy(a) {
  let cloned = Array.isArray(a)? [] : {};
  if(a &amp;&amp; typeof a === "object") {
    for (let i in a) {
      if(a.hasOwnProperty(i)) {
        if(a[i] &amp;&amp; typeof a[i] === "object") {
          cloned[i] = deepCopy(]]></description><category></category></item><item><title><![CDATA[js驼峰和中划线连字符相互转化的最佳实践]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/107430853</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/107430853</guid><author>htsclch</author><pubDate>Sat, 18 Jul 2020 16:34:21 +0800</pubDate><description><![CDATA[1.驼峰转连字符


var s = "thisIsTest";
 s = s.replace(/([A-Z])/g,"-$1").toLowerCase();

2.连字符转驼峰


function toHump(name) {
  return name.replace(/\-(\w)/g, function(all, letter){
    console.log(all) //"_T"
    console.log(letter) //"T"
    return letter.toUp...]]></description><category></category></item><item><title><![CDATA[vue项目几个比较好的实践(路由模块化，打包dll优化，vuex)]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/107427836</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/107427836</guid><author>htsclch</author><pubDate>Sat, 18 Jul 2020 15:58:47 +0800</pubDate><description><![CDATA[一.路由的模块化和统一自动加载

团队之间协作开发，为了防止对统一路由的修改，可以采用路由的模块化自动统一加载的方法，使用webpack的require.context来实现，项目的views目录结构如下：



每个页面设置一个router的配置文件，内容如下：


const IndexLayout = () =&gt; import("@/views/index.vue");
setRoutersPath(routers) {
    var arryPath = [];
    routers.k.]]></description><category></category></item><item><title><![CDATA[JavaScript的执行机制(异步，内存回收，性能监控)]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/107424532</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/107424532</guid><author>htsclch</author><pubDate>Sat, 18 Jul 2020 11:41:24 +0800</pubDate><description><![CDATA[一. 异步任务

微任务： Promise，process.nextTick

宏任务：整体代码script，setTimeout，setInterval


setTimeout(()=&gt;{
  console.log("1")
})
var p = new Promise((resolve, reject) =&gt; {
  console.log("2")
  resolve()
})
p.then(() =&gt; {
  console.log("3")
})
console.log(".]]></description><category></category></item><item><title><![CDATA[centos彻底删除mysql]]></title><link>https://blog.youkuaiyun.com/htsclch/article/details/104841876</link><guid>https://blog.youkuaiyun.com/htsclch/article/details/104841876</guid><author>htsclch</author><pubDate>Fri, 13 Mar 2020 15:22:00 +0800</pubDate><description><![CDATA[centos7彻底卸载mysql和通过yum安装mysql
原创innerpeacez 最后发布于2018-05-10 21:46:38 阅读数 33352 收藏
展开
彻底卸载mysql
查看是否有安装的mysql
rpm -qa | grep -i mysql // 查看命令1
yum list install mysql* // 查看命令2


卸载mysql安装包
yum remove ...]]></description><category></category></item></channel></rss>