自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 资源 (1)
  • 收藏
  • 关注

原创 1000行代码实现极简版openclaw(附源码)(11)

数据是如何流动的消息历史的重要性:让 LLM 看到完整上下文ReAct 循环的工作方式。

2026-03-24 08:38:16 73

原创 1000行代码实现极简版openclaw(附源码)(10)

本文介绍了一个可扩展的Skill系统架构实现。该系统采用模块化设计,每个Skill包含描述文件(SKILL.md)和功能实现(index.ts)。核心组件SkillLoader负责动态加载技能目录下的模块,解析YAML格式的元数据,并通过文件路径动态导入工具实现。系统支持热插拔功能,允许运行时启用/禁用技能模块。示例展示了计算器技能的实现方式,包含工具定义和执行逻辑。该架构遵循约定优于配置原则,实现了灵活的功能扩展能力。

2026-03-23 08:40:41 68

原创 1000行代码实现极简版openclaw(附源码)(9)

本文介绍了配置管理和命令行接口的实现方案。配置系统采用优先级机制(环境变量>配置文件>默认值),使用zod进行类型验证,默认工作目录为~/.turboclaw。CLI提供四个主要命令:init初始化工作区、start启动网关、send发送消息、status查看状态。系统支持文件系统、Shell和内存工具集成,通过Agent处理用户消息并返回响应。配置管理和CLI的结合为系统提供了灵活的操作接口和可扩展性。

2026-03-23 08:40:10 222

原创 1000行代码实现极简版openclaw(附源码)(8)

摘要 Gateway是系统的核心控制中心,负责协调所有组件并管理生命周期。作为"大脑",它主要功能包括初始化组件、会话管理、消息路由以及协调Agent、Tools等模块。其架构包含MemoryStore、ToolRegistry、Agent和多个Channels,初始化顺序严格遵循Memory→Tools→Agent→Channels。关键特性包括基于channel+clientID的会话管理、依赖注入配置方式,以及完善的错误处理机制。通过统一的消息处理接口,Gateway能够有效协调各

2026-03-21 11:10:32 73

原创 1000行代码实现极简版openclaw(附源码)(7)

本文介绍了两种用户交互通道的实现:Terminal命令行和WebSocket网络接口。TerminalChannel提供本地命令行交互界面,支持用户输入和AI回复;WebSocketChannel则通过WebSocketServer实现远程连接,支持多客户端通信。两者都遵循统一的Channel接口,通过依赖注入方式处理消息,其中WebSocket还使用clientId标识不同客户端。代码实现了通道的启动、停止、消息发送等功能,并提供工厂方法创建不同类型的通道实例。

2026-03-21 11:10:10 56

原创 1000行代码实现极简版openclaw(附源码)(6)

本文介绍了实现Agent长期记忆系统的设计方案。系统支持存储用户偏好、待办事项等多种信息类型,并实现跨会话保存。核心功能包括:1) 使用Markdown格式存储记忆条目,便于人工查看编辑;2) 基于关键词和标签的检索机制;3) 提供记忆添加和查询工具接口。代码实现了MemoryStore类来管理记忆条目,包含添加、查询等基本操作,并以文件形式持久化存储。系统设计注重实用性和可扩展性,无需依赖复杂数据库即可实现基础记忆功能。

2026-03-20 08:46:31 60

原创 1000行代码实现极简版openclaw(附源码)(5)

AI Agent核心机制:ReAct循环解析 摘要:ReAct循环是AI Agent的核心运行机制,通过"思考(Reasoning)→行动(Acting)→观察(Observing)"的循环模式实现智能决策。文章通过厨师做菜的类比解释了ReAct的工作原理,并展示了TypeScript实现代码的关键部分。实现中包含了状态管理(idle→thinking→acting)、递归深度防御机制(防止无限循环)以及工具调用与结果处理流程。核心代码演示了如何通过LLM分析用户请求、调用适当工具并处理

2026-03-20 08:45:54 548

原创 1000行代码实现极简版openclaw(附源码)(4)

摘要 本文介绍了如何构建统一的LLM接口来连接不同大模型API(如OpenAI、DeepSeek等)。主要内容包括: 问题背景:不同LLM提供商API格式存在差异(如OpenAI与Anthropic格式不同),导致调用方式不统一。 解决方案:采用适配器模式设计统一接口,通过LLMProvider抽象层隔离底层实现差异。 代码实现: 提供OpenAI兼容格式的Provider实现(支持OpenAI/DeepSeek等) 实现Anthropic格式的Provider(需要特殊头信息) 两种Provider都实现

2026-03-19 08:36:18 648

原创 1000行代码实现极简版openclaw(附源码)(3)

工具系统:为Agent赋能执行能力 本文介绍了Agent工具系统的设计原理和实现方法,让AI不仅能思考还能执行实际任务。核心内容: 工具的必要性:类比人类大脑需要手脚配合,LLM作为大脑需要工具系统才能完成实际任务(如文件操作) 注册表设计: 采用中央注册表统一管理所有工具 实现动态扩展和解耦 提供工具查询和格式转换功能 安全实现: 内置文件系统工具 通过路径解析和安全检查防止目录遍历攻击 限制操作在指定工作目录内 该系统使Agent具备了从认知到执行的能力闭环,源码已在GitHub开源。

2026-03-19 08:35:35 1149

原创 1000行代码实现极简版openclaw(附源码)(2)

TurboClaw 类型系统详解:作为项目基础架构的"建筑图纸"。系统定义了六类核心类型:1)消息类型(Message/ToolCall),构建基础数据单元;2)Agent类型(状态/配置/思考结果),实现AI核心逻辑;3)工具类型(参数/定义),扩展Agent能力;4)通道类型(配置/接口),处理用户交互;5)Gateway类型(配置/会话),作为系统控制中心;6)LLM接口类型。这些类型定义采用TypeScript接口规范,通过清晰的类型约束确保系统各组件协同工作,类比建筑图纸指导施

2026-03-18 15:10:16 605

原创 1000行代码实现极简版openclaw(附源码)(1)

TurboClaw 是一个极简的AI Agent框架,使大语言模型具备工具调用、记忆存储和持续对话能力。其架构包含Gateway(控制中心)、Agent(决策核心)、LLM(推理引擎)、Tools(操作执行)、Memory(信息存储)、Channels(交互界面)和Session(对话管理)七大组件。数据流示例展示了从用户输入"创建文件"到Agent通过ReAct循环调用write_file工具完成请求的全过程。该框架让LLM突破纯对话限制,实现实际任务执行。

2026-03-18 15:09:46 544

原创 requestIdleCallback和requestAnimationFrame

这是浏览器提供的另一个方法,用来处理不紧急的任务。它会告诉浏览器:“等你现在没事干(没有用户输入、动画等)的时候,再执行我的代码”。避免低优先级任务卡住主线程,影响用户体验。这是浏览器提供的一个方法,专门用来做动画或高频更新的视觉效果。它会告诉浏览器:“在下一次屏幕刷新绘制画面时,请先执行我的代码”。这样你的动画会和屏幕刷新同步,避免卡顿。像数据上报、预加载内容等任务不需要立刻完成,趁浏览器空闲时处理,可以提升页面响应速度。做动画,时间可能不精准,导致丢帧卡顿。会自动匹配屏幕刷新节奏,保证流畅。

2025-05-09 09:49:42 493 1

转载 深入理解thunk函数

一.起源传值调用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语言采用这种策略。传值调用和传名调用,哪一种比较好?回

2020-11-14 17:05:05 1626

原创 js手写toUpperCase和toLoweCase

function toUpperCaseLch(str) { let strArr = str.split(""); let max = "z".charCodeAt(); let min = "a".charCodeAt(); let resultArr = []; strArr.forEach(item => { let curr = item.charCodeAt(); if(curr <= max && curr >= min).

2020-10-27 18:07:40 429

转载 js加载 拒绝js阻塞—defer、async作用和区别分析

2020-10-27 14:52:37 197

原创 深拷贝

1.递归function deepCopy(a) { let cloned = Array.isArray(a)? [] : {}; if(a && typeof a === "object") { for (let i in a) { if(a.hasOwnProperty(i)) { if(a[i] && typeof a[i] === "object") { cloned[i] = deepCopy(

2020-08-31 17:43:17 187

原创 js驼峰和中划线连字符相互转化的最佳实践

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...

2020-07-18 16:34:21 2929

原创 vue项目几个比较好的实践(路由模块化,打包dll优化,vuex)

一.路由的模块化和统一自动加载团队之间协作开发,为了防止对统一路由的修改,可以采用路由的模块化自动统一加载的方法,使用webpack的require.context来实现,项目的views目录结构如下:每个页面设置一个router的配置文件,内容如下:const IndexLayout = () => import("@/views/index.vue");setRoutersPath(routers) { var arryPath = []; routers.k.

2020-07-18 15:58:47 567

原创 JavaScript的执行机制(异步,内存回收,性能监控)

一. 异步任务微任务: Promise,process.nextTick宏任务:整体代码script,setTimeout,setIntervalsetTimeout(()=>{ console.log("1")})var p = new Promise((resolve, reject) => { console.log("2") resolve()})p.then(() => { console.log("3")})console.log(".

2020-07-18 11:41:24 313

转载 centos彻底删除mysql

centos7彻底卸载mysql和通过yum安装mysql原创innerpeacez 最后发布于2018-05-10 21:46:38 阅读数 33352 收藏展开彻底卸载mysql查看是否有安装的mysqlrpm -qa | grep -i mysql // 查看命令1yum list install mysql* // 查看命令2卸载mysql安装包yum remove ...

2020-03-13 15:22:00 182

原创 精通ES6系列三(Promise 对象)

1.Promise 的概念(参考http://es6.ruanyifeng.com/#docs/promise#Promise-%E7%9A%84%E5%90%AB%E4%B9%89)Promise是一种异步编程解决方案,所谓Promise,它可以理解为一个容器,里面包含未来才要结束的事件(通常是指异步事件)。Promise对象的状态不受外界影响,只有三种状态 pending(进行中)、ful...

2019-08-09 15:32:26 532

原创 精通ES6系列二(Generator函数)

1.简单概念Generator函数是ES6提供的一种异步编程解决方案,可以理解为一种状态机,内部包含多个状态。执行Generator函数会返回一个遍历器(iterator),通过next方法去获取状态机里面的值。形式上,Generator函数是一个普通函数,但是有两个特征,一是function后面有一个*,二是函数体内部通过yield表达式,定义不同的内部状态。function* sim...

2019-08-09 09:56:32 235

原创 精通ES6系列一(遍历器iterator)

1.Iterator的概念和作用 iterator的主要目的是为了给JS中的集合如Array、Map、Set或者自定义的一些集合等提供一种统一的、方便的访问和遍历机制。它其实是一个接口,任何数据结构只要部署了iterator接口就可以进行遍历,ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费。Iterator 的遍历过程是这...

2019-08-08 16:19:40 259

原创 JS基础知识查漏补缺二(函数)

1.函数的定义两种方式定义函数:function func(x){}let func = function(x){};两种方式完全等价,第二种相当于先声明了一个匿名函数,然后将引用赋值给func。JS会默认给每一行加一个分号,所以写return的时候要注意,不能这么写:function func(x){ return {'some code'} }2....

2019-08-06 20:00:35 204

原创 JS基础知识查漏补缺一(数据类型)

数据类型分类 详细类型 原始类型 数字(Number) 字符串(String) 布尔型(Boolean) null undefined 引用类型 对象(object) 函数(Function)特殊的引用 数组(Array) 1.null和undefined的区别 null表示一个对象不存在,即“没有对象”;und...

2019-08-05 19:36:22 286

原创 JavaScript prototype的深入理解

所有在js中定义的函数中,都会包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性, 也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。1.函数的作用域function demo(){ var a=0; //私有变量 var privat...

2019-06-07 06:06:28 198

原创 JS继承属性/本地属性和对象的遍历

1、in 运算符varobj = {name:'jack'};alert('name'inobj);// --> truealert('toString'inobj);// --> true2、hasOwnProperty方法varobj = {name:'jack'};obj.hasOwnProperty('name');// --> t...

2019-06-05 11:30:28 679

原创 react的生命周期及react16的一些新特性

react16之前旧的生命周期Mounting(加载阶段:涉及6个钩子函数)constructor()加载的时候调用一次,可以初始化stategetDefaultProps()设置默认的props,也可以用dufaultProps设置组件的默认属性。getInitialState()初始化state,可以直接在constructor中定义this.sta...

2019-06-04 18:04:11 4518

nuxt-学习nuxt-学习nuxt-学习nuxt-学习

nuxt-学习nuxt-学习nuxt-学习nuxt-学习

2023-12-30

电商小程序.rar

微信小程序demo - 电商小程序 提供了电商小程序的完整代码,直接可以运行,仅供参考

2019-09-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除