在 Pi Agent 的工具系统中,工具的抽象和执行机制是整个架构的核心。本文系统梳理工具定义的三层类型、调用时的五步管道、并行执行策略,以及错误处理的特殊设计。 一、三层类型:为什么”一个工具”要分三层来定义? 在 Pi Agent 里,一个完整的工具定义被拆成了三层,目的是让不同层职责清晰、扩展性强: 第一层:Tool(一张”名片”) 这是最基础的一层,只定义工具的基本信息: - toolNa
在 Pi Agent 的工具系统中,Operations 抽象 是核心设计之一。它把工具的执行逻辑与具体文件系统实现解耦,让 Agent 可以在本地、SSH、Docker 等不同环境中灵活切换。 本文主要分享工具架构的核心设计思路,包括抽象接口、依赖注入、闭包固定实例,以及 Workspace 切换机制。 为什么不直接使用 Node.js fs? 很多人第一反应是直接调用 : 这种写法存在几个明显
Kimi K3 的技术博客里,有一个很容易被忽略、但很关键的细节: K3 对「思考历史」极度敏感。harness 如果没有完整传回之前的 thinking 内容,生成质量会严重不稳定。 原文大致写了两个触发条件: 1. harness 没有完整回传历史 thinking 内容 2. 会话中途从别的模型切换到 K3 博客对原因也做了解释。大多数 reasoning 模型,比如 Claude 的 ex
AIO BIO NIO区别? BIO(同步阻塞 I/O) BIO 是传统的 I/O 模式,全称为 Block I/O,也叫同步阻塞 I/O。在 BIO 模式下,当我们执行 I/O 操作时,比如读取文件或者网络请求,程序会 阻塞,直到 I/O 操作完成后,才能继续执行后面的代码。也就是说,当一个线程在等待 I/O 完成时,它是处于阻塞状态的,不能做其他事情。 NIO(同步非阻塞 I/O) 一个线程管
cookie、session、token cookie 服务端发给客户端,交给客户端保存的数据,每次请求,客户端带上这些数据,服务端就读取这些数据,鉴别身份。 完全由客户端存储,和域名绑定,且不可跨域。 数据大小一般有限制。 容易被伪造,且客户端清除数据就丢失了 session 服务端将客户端的信息保存在服务端,然后将一个sessionId传给客户端,客户端保存起来,下次请求携带sessionId
MySQL锁 全局锁: flush tables with read lock,执行此条命令,整个数据库处于只读状态 unlock tables, 释放全局锁,会话断开时,也会自动释放全局锁 一般用来全库逻辑备份 表级锁:MySQL 里面表级别的锁有这几种: - - 表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。 - 元数据锁
垃圾收集器(CMS-G1-ZGC) CMS 垃圾收集器 JDK1.5时引入,JDK9被标记弃用,JDK14被移除 CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和 GC 线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。 - 初始标记:Stop The World,仅使用一条初始标记
类加载机制/类加载器 类加载的完整流程(生命周期) 类从加载到卸载经历 5 个阶段,其中加载、验证、准备、初始化、卸载的顺序是固定的,解析阶段可能与初始化交叉进行: 1. 加载(Loading) - 任务:通过类的全限定名(如 )获取其字节码数据,并生成 对象。 - 来源:字节码可来自本地文件、网络、数据库、动态生成(如 CGLib)等。 - 关键组件:类加载器(ClassLoader)负责此阶段
MVCC多版本并发控制 MVCC 的目标:让读操作尽量不阻塞写操作,写操作也尽量不阻塞读操作。 核心机制: MVCC主要依赖以下机制实现: 数据库行记录中的隐藏字段:最近修改本行数据的事务id、回滚指针指向本行数据的上个版本(其实是指向undo,通过undo计算上一个版本) •undo log:回滚日志,在insert、delete、update时产生,记载了与操作相反的操作,比如delete操作
SpringMVC执行流程 请求先到 DispatcherServlet(前端控制器),它负责调度 HandlerMapping → HandlerAdapter → Controller → ViewResolver → View。 Spring MVC 采用前端控制器模式,所有请求先进入 DispatcherServlet。DispatcherServlet 通过 HandlerMapping