用 Ollama 部署了一个我之前没听过的大模型 gpt-oss:120b, 发现速度还挺快, 不知道能不能用在 openclaw 上.然后跟 Qwen 做了一下生成速度对比, 可能不太客观.
顺便贴一下从网上随便找了一个测试 Token 生成速度的代码跑了下, 测试结果如下

xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
顺便贴一下从网上随便找了一个测试 Token 生成速度的代码跑了下, 测试结果如下

她结过婚,然后离婚了。
1.1 说实话这点我感觉无所谓吧,现在有的人谈恋爱同居麻的跟结婚也没啥区别了。
1.2 再一个我是这么想的,我喜欢的是现在的她,那么她也是由以前的她的经历慢慢变成这样子的,所以这点其实还好。
她十几岁的时候就生娃了,并且是个男娃,现在都 8 岁了,不过孩子不是她在带,偶尔要见一下。
2.1 不是,这么复杂吗?其实她前面说的时候我都已经要接受了,一开始没说孩子的性别,我在想是女孩子?女孩子的话也不是很大的影响,后面结束谈话以后我就问“是男孩女孩?”她说是男孩,这就很难受了,完全没法接受了,像多尔衮都搞不定的事,兄弟哪能搞定
ARC 浏览器现在除了更新 chromium 内核,功能都不怎么更新了。遇到些问题有几个版本也没修复。
大家有啥替换的对象么?
试了下 Firefox 内核的 Zen Browser ,跟 ARC 是挺像的,就是挺多网页现在都不适配火狐了,小问题太多了,有点忍不了。
需要竖版的标签栏和左上角的常驻收藏的功能
在 Java NIO 中的通道(Channel)就相当于操作系统的内核空间(kernel space)的缓冲区,而缓冲区(Buffer)对应的相当于操作系统的用户空间(user space)中的用户缓冲区(user buffer)。 堆外内存(DirectBuffer)在使用后需要应用程序手动回收,而堆内存(HeapBuffer)的数据在 GC 时可能会被自动回收。因此,在使用 HeapBuffer 读写数据时,为了避免缓冲区数据因为 GC 而丢失,NIO 会先把 HeapBuffer 内部的数据拷贝到一个临时的 DirectBuffer 中的本地内存(native memory),这个拷贝涉及到 内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多。 向内存映射文件写入可能是危险的,只是改变数组的单个元素这样的简单操作,就可能会直接修改磁盘上的文件。修改数据与将数据保存到磁盘是没有分开的。 下面代码行将文件的前 1024 个字节映射到内存中,map() 方法返回一个 MappedByteBuffer,它是 ByteBuffer 的子类。因此,可以像使用其他任何 ByteBuffer 一样使用新映射的缓冲区,操作系统会在需要时负责执行映射。 MappedByteBuffer 是 NIO 基于内存映射(mmap)这种零拷贝方式的提供的一种实现,可以减少一次数据拷贝的过程。它继承自 ByteBuffer。FileChannel 定义了一个 map() 方法,它可以把一个文件从 position 位置开始的 size 大小的区域映射为内存映像文件。抽象方法 map() 方法在 FileChannel 中的定义如下: MappedByteBuffer 相比 ByteBuffer 新增了 fore()、load() 和 isLoad() 三个重要的方法: 下面给出一个利用 MappedByteBuffer 对文件进行读写的使用示例: 下面介绍 map() 方法通过本地方法 map0() 为文件分配一块虚拟内存,作为它的内存映射区域,然后返回这块内存映射区域的起始地址。 上面是本地方法(native method)map0 的定义,它通过 JNI(Java Native Interface)调用底层 C 的实现,这个 native 函数(Java_sun_nio_ch_FileChannelImpl_map0)的实现位于 JDK 源码包下的 可以看出 map0() 函数最终是通过 下面详细介绍一下 下面总结一下 MappedByteBuffer 的特点和不足之处: DirectByteBuffer 的对象引用位于 Java 内存模型的堆里面,JVM 可以对 DirectByteBuffer 的对象进行内存分配和回收管理,一般使用 DirectByteBuffer 的静态方法 allocateDirect() 创建 DirectByteBuffer 实例并分配内存。 DirectByteBuffer 内部的字节缓冲区位在于堆外的(用户态)直接内存,它是通过 Unsafe 的本地方法 allocateMemory() 进行内存分配,底层调用的是操作系统的 malloc() 函数,因此DirectByteBuffer 使用的是操作系统内存。 使用 DirectByteBuf 将堆外内存映射到 jvm 内存中来直接访问使用 java 中的 DirectByteBuf 对象仅维护了此内存的虚引用,内存回收分成两步 除此之外,初始化 DirectByteBuffer 时还会创建一个 Deallocator 线程,并通过 Cleaner 的 freeMemory() 方法来对直接内存进行回收操作,freeMemory() 底层调用的是操作系统的 free() 函数。 由于使用 DirectByteBuffer 分配的是系统本地的内存,不在 JVM 的管控范围之内,因此直接内存的回收和堆内存的回收不同,直接内存如果使用不当,很容易造成 OutOfMemoryError。 说了这么多,那么 DirectByteBuffer 和零拷贝有什么关系?前面有提到在 MappedByteBuffer 进行内存映射时,它的 map() 方法会通过 Util.newMappedByteBuffer() 来创建一个缓冲区实例,初始化的代码如下: DirectByteBuffer 是 MappedByteBuffer 的具体实现类,也就是基于底层操作系统的 mmap 技术。实际上,Util.newMappedByteBuffer() 方法通过反射机制获取 DirectByteBuffer 的构造器,然后创建一个 DirectByteBuffer 的实例,对应的是一个单独用于内存映射的构造方法: 因此,除了允许分配操作系统的直接内存以外,DirectByteBuffer 本身也具有文件内存映射的功能,这里不做过多说明。我们需要关注的是,DirectByteBuffer 在 MappedByteBuffer 的基础上提供了内存映像文件的随机读取 get() 和写入 write() 的操作。 内存映像文件的随机读写都是借助 ix() 方法实现定位的, ix() 方法通过内存映射空间的内存首地址(address)和给定偏移量 i 计算出指针地址,然后由 unsafe 类的 get() 和 put() 方法和对指针指向的数据进行读取或写入。 FileChannel 是一个用于文件读写、映射和操作的通道,同时它在并发环境下是线程安全的,基于 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 getChannel() 方法可以创建并打开一个文件通道。FileChannel 定义了 transferFrom() 和 transferTo() 两个抽象方法,它通过在通道和通道之间建立连接实现数据传输的。 下面介绍 transferTo() 和 transferFrom() 方法的底层实现原理,这两个方法也是 java.nio.channels.FileChannel 的抽象方法,由子类 sun.nio.ch.FileChannelImpl.java 实现。transferTo() 和 transferFrom() 底层都是基于sendfile的方式实现数据传输的,其中 FileChannelImpl.java 定义了 3 个常量,用于标示当前操作系统的内核是否支持 sendfile 以及 sendfile 的相关特性。 来分析一下其中原理: 下面以 transferTo() 的源码实现为例。FileChannelImpl 首先执行 transferToDirectly() 方法,以 sendfile 的零拷贝方式尝试数据拷贝。如果系统内核不支持 sendfile,进一步执行 transferToTrustedChannel() 方法,以 mmap 的零拷贝方式进行内存映射,这种情况下目的通道必须是 FileChannelImpl 或者 SelChImpl 类型。如果以上两步都失败了,则执行 transferToArbitraryChannel() 方法,基于传统的 I/O 方式完成读写,具体步骤是初始化一个临时的 DirectBuffer,将源通道 FileChannel 的数据读取到 DirectBuffer,再写入目的通道 WritableByteChannel 里面。 接下来重点分析一下 transferToDirectly() 方法的实现,也就是 transferTo() 通过 sendfile 实现零拷贝的精髓所在。可以看到,transferToDirectlyInternal() 方法先获取到目的通道 WritableByteChannel 的文件描述符 targetFD,获取同步锁然后执行 transferToDirectlyInternal() 方法。 最终由 transferToDirectlyInternal() 调用本地方法 transferTo0() ,尝试以 sendfile 的方式进行数据传输。如果系统内核完全不支持 sendfile,比如 Windows 操作系统,则返回 UNSUPPORTED 并把 transferSupported 标识为 false。如果系统内核不支持 sendfile 的一些特性,比如说低版本的 Linux 内核不支持 DMA gather copy 操作,则返回 UNSUPPORTED_CASE 并把 pipeSupported 或者 fileSupported 标识为 false。 本地方法(native method)transferTo0() 通过 JNI(Java Native Interface)调用底层 C 的函数,这个 native 函数(Java_sun_nio_ch_FileChannelImpl_transferTo0)同样位于 JDK 源码包下的 native/sun/nio/ch/FileChannelImpl.c 源文件里面。JNI 函数 Java_sun_nio_ch_FileChannelImpl_transferTo0() 基于条件编译对不同的系统进行预编译,下面是 JDK 基于 Linux 系统内核对 transferTo() 提供的调用封装。 对 Linux、Solaris 以及 Apple 系统而言,transferTo0() 函数底层会执行 sendfile64 这个系统调用完成零拷贝操作,sendfile64() 函数的原型如下: 下面简单介绍一下 sendfile64() 函数各个参数的含义: 在 Linux 2.6.3 之前,out_fd 必须是一个 socket,而从 Linux 2.6.3 以后,out_fd 可以是任何文件。也就是说,sendfile64() 函数不仅可以进行网络文件传输,还可以对本地文件实现零拷贝操作。 Netty 中的零拷贝和上面提到的操作系统层面上的零拷贝不太一样, 我们所说的 Netty 零拷贝完全是基于(Java 层面)用户态的,它的更多的是偏向于数据操作优化这样的概念,具体表现在以下几个方面: Netty 通过 DefaultFileRegion 类对 java.nio.channels.FileChannel 的 tranferTo() 方法进行包装,在文件传输时可以将文件缓冲区的数据直接发送到目的通道(Channel) ByteBuf 可以通过 wrap 操作把字节数组、ByteBuf、ByteBuffer 包装成一个 ByteBuf 对象, 进而避免了拷贝操作 ByteBuf 支持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同一个存储区域的 ByteBuf,避免了内存的拷贝 Netty 提供了 CompositeByteBuf 类,它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf,避免了各个 ByteBuf 之间的拷贝 其中第 1 条属于操作系统层面的零拷贝操作,后面 3 条只能算用户层面的数据操作优化。 RocketMQ 选择了 mmap + write 这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输;而 Kafka 采用的是 sendfile 这种零拷贝方式,适用于系统日志消息这种高吞吐量的大块文件的数据持久化和传输。但是值得注意的一点是,Kafka 的索引文件使用的是 mmap + write 方式,数据文件使用的是 sendfile 方式。Java NIO零拷贝
sun.misc.Unsafe.copyMemory() 的调用,背后的实现原理与 memcpy() 类似。 最后,将临时生成的 DirectBuffer 内部的数据的内存地址传给 I/O 调用函数,这样就避免了再去访问 Java 对象处理 I/O 读写。内存映射文件
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);MappedByteBuffer
public abstract MappedByteBuffer map(MapMode mode, long position, long size)
throws IOException;private final static String CONTENT = "Zero copy implemented by MappedByteBuffer";
private final static String FILE_NAME = "/mmap.txt";
private final static String CHARSET = "UTF-8";force() 方法把缓冲区更改的内容强制写入本地文件。@Test
public void writeToFileByMappedByteBuffer() {
Path path = Paths.get(getClass().getResource(FILE_NAME).getPath());
byte[] bytes = CONTENT.getBytes(Charset.forName(CHARSET));
try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ,
StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)) {
MappedByteBuffer mappedByteBuffer = fileChannel.map(READ_WRITE, 0, bytes.length);
if (mappedByteBuffer != null) {
mappedByteBuffer.put(bytes);
mappedByteBuffer.force();
}
} catch (IOException e) {
e.printStackTrace();
}
}@Test
public void readFromFileByMappedByteBuffer() {
Path path = Paths.get(getClass().getResource(FILE_NAME).getPath());
int length = CONTENT.getBytes(Charset.forName(CHARSET)).length;
try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
MappedByteBuffer mappedByteBuffer = fileChannel.map(READ_ONLY, 0, length);
if (mappedByteBuffer != null) {
byte[] bytes = new byte[length];
mappedByteBuffer.get(bytes);
String content = new String(bytes, StandardCharsets.UTF_8);
assertEquals(content, "Zero copy implemented by MappedByteBuffer");
}
} catch (IOException e) {
e.printStackTrace();
}
}map() 方法的底层实现原理。map() 方法是 java.nio.channels.FileChannel 的抽象方法,由子类 sun.nio.ch.FileChannelImpl.java 实现,下面是和内存映射相关的核心代码:public MappedByteBuffer map(MapMode mode, long position, long size) throws IOException {
int pagePosition = (int)(position % allocationGranularity);
long mapPosition = position - pagePosition;
long mapSize = size + pagePosition;
try {
addr = map0(imode, mapPosition, mapSize);
} catch (OutOfMemoryError x) {
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException y) {
Thread.currentThread().interrupt();
}
try {
addr = map0(imode, mapPosition, mapSize);
} catch (OutOfMemoryError y) {
throw new IOException("Map failed", y);
}
}
int isize = (int)size;
Unmapper um = new Unmapper(addr, mapSize, isize, mfd);
if ((!writable) || (imode == MAP_RO)) {
return Util.newMappedByteBufferR(isize, addr + pagePosition, mfd, um);
} else {
return Util.newMappedByteBuffer(isize, addr + pagePosition, mfd, um);
}
}map() 方法返回的是内存映射区域的起始地址,通过(起始地址 + 偏移量)就可以获取指定内存的数据。这样一定程度上替代了 read() 或 write() 方法,底层直接采用 sun.misc.Unsafe类的 getByte() 和 putByte() 方法对数据进行读写。private native long map0(int prot, long position, long mapSize) throws IOException;native/sun/nio/ch/FileChannelImpl.c这个源文件里面。JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_map0(JNIEnv *env, jobject this,
jint prot, jlong off, jlong len)
{
void *mapAddress = 0;
jobject fdo = (*env)->GetObjectField(env, this, chan_fd);
jint fd = fdval(env, fdo);
int protections = 0;
int flags = 0;
if (prot == sun_nio_ch_FileChannelImpl_MAP_RO) {
protections = PROT_READ;
flags = MAP_SHARED;
} else if (prot == sun_nio_ch_FileChannelImpl_MAP_RW) {
protections = PROT_WRITE | PROT_READ;
flags = MAP_SHARED;
} else if (prot == sun_nio_ch_FileChannelImpl_MAP_PV) {
protections = PROT_WRITE | PROT_READ;
flags = MAP_PRIVATE;
}
mapAddress = mmap64(
0, /* Let OS decide location */
len, /* Number of bytes to map */
protections, /* File permissions */
flags, /* Changes are shared */
fd, /* File descriptor of mapped file */
off); /* Offset into file */
if (mapAddress == MAP_FAILED) {
if (errno == ENOMEM) {
JNU_ThrowOutOfMemoryError(env, "Map failed");
return IOS_THROWN;
}
return handle(env, -1, "Map failed");
}
return ((jlong) (unsigned long) mapAddress);
}mmap64() 这个函数对 Linux 底层内核发出内存映射的调用, mmap64() 函数的原型如下:#include <sys/mman.h>
void *mmap64(void *addr, size_t len, int prot, int flags, int fd, off64_t offset);mmap64() 函数各个参数的含义以及参数可选值:addr:文件在用户进程空间的内存映射区中的起始地址,是一个建议的参数,通常可设置为 0 或 NULL,此时由内核去决定真实的起始地址。当 + flags 为 MAP_FIXED 时,addr 就是一个必选的参数,即需要提供一个存在的地址。len:文件需要进行内存映射的字节长度prot :控制用户进程对内存映射区的访问权限PROT_READ:读权限PROT_WRITE:写权限PROT_EXEC:执行权限PROT_NONE:无权限flags:控制内存映射区的修改是否被多个进程共享MAP_PRIVATE:对内存映射区数据的修改不会反映到真正的文件,数据修改发生时采用写时复制机制MAP_SHARED:对内存映射区的修改会同步到真正的文件,修改对共享此内存映射区的进程是可见的MAP_FIXED:不建议使用,这种模式下 addr 参数指定的必须的提供一个存在的 addr 参数fd:文件描述符。每次 map 操作会导致文件的引用计数加 1,每次 unmap 操作或者结束进程会导致引用计数减 1offset:文件偏移量。进行映射的文件位置,从文件起始地址向后的位移量public static void clean(final Object buffer) throws Exception {
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
try {
Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
getCleanerMethod.setAccessible(true);
Cleaner cleaner = (Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);
cleaner.clean();
} catch(Exception e) {
e.printStackTrace();
}
});
}DirectByteBuffer

public static ByteBuffer allocateDirect(int capacity) {
return new DirectByteBuffer(capacity);
}DirectByteBuffer(int cap) {
super(-1, 0, cap, cap);
boolean pa = VM.isDirectMemoryPageAligned();
int ps = Bits.pageSize();
long size = Math.max(1L, (long)cap + (pa ? ps : 0));
Bits.reserveMemory(size, cap);
long base = 0;
try {
base = unsafe.allocateMemory(size);
} catch (OutOfMemoryError x) {
Bits.unreserveMemory(size, cap);
throw x;
}
unsafe.setMemory(base, size, (byte) 0);
if (pa && (base % ps != 0)) {
address = base + ps - (base & (ps - 1));
} else {
address = base;
}
cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
att = null;
}private static class Deallocator implements Runnable {
private static Unsafe unsafe = Unsafe.getUnsafe();
private long address;
private long size;
private int capacity;
private Deallocator(long address, long size, int capacity) {
assert (address != 0);
this.address = address;
this.size = size;
this.capacity = capacity;
}
public void run() {
if (address == 0) {
return;
}
unsafe.freeMemory(address);
address = 0;
Bits.unreserveMemory(size, capacity);
}
}static MappedByteBuffer newMappedByteBuffer(int size, long addr, FileDescriptor fd,
Runnable unmapper) {
MappedByteBuffer dbb;
if (directByteBufferConstructor == null)
initDBBConstructor();
try {
dbb = (MappedByteBuffer)directByteBufferConstructor.newInstance(
new Object[] { new Integer(size), new Long(addr), fd, unmapper });
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new InternalError(e);
}
return dbb;
}
private static void initDBBRConstructor() {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
try {
Class<?> cl = Class.forName("java.nio.DirectByteBufferR");
Constructor<?> ctor = cl.getDeclaredConstructor(
new Class<?>[] { int.class, long.class, FileDescriptor.class,
Runnable.class });
ctor.setAccessible(true);
directByteBufferRConstructor = ctor;
} catch (ClassNotFoundException | NoSuchMethodException |
IllegalArgumentException | ClassCastException x) {
throw new InternalError(x);
}
return null;
}});
}protected DirectByteBuffer(int cap, long addr, FileDescriptor fd, Runnable unmapper) {
super(-1, 0, cap, cap, fd);
address = addr;
cleaner = Cleaner.create(this, unmapper);
att = null;
}public byte get() {
return ((unsafe.getByte(ix(nextGetIndex()))));
}
public byte get(int i) {
return ((unsafe.getByte(ix(checkIndex(i)))));
}public ByteBuffer put(byte x) {
unsafe.putByte(ix(nextPutIndex()), ((x)));
return this;
}
public ByteBuffer put(int i, byte x) {
unsafe.putByte(ix(checkIndex(i)), ((x)));
return this;
}private long ix(int i) {
return address + ((long)i << 0);
}FileChannel
transferTo():通过 FileChannel 把文件里面的源数据写入一个 WritableByteChannel 的目的通道。public abstract long transferTo(long position, long count, WritableByteChannel target)
throws IOException;transferFrom():把一个源通道 ReadableByteChannel 中的数据读取到当前 FileChannel 的文件里面。public abstract long transferFrom(ReadableByteChannel src, long position, long count)
throws IOException;private static volatile boolean transferSupported = true;
private static volatile boolean pipeSupported = true;
private static volatile boolean fileSupported = true;transferSupported:用于标记当前的系统内核是否支持 sendfile() 调用,默认为 true。pipeSupported:用于标记当前的系统内核是否支持文件描述符(fd)基于管道(pipe)的 sendfile() 调用,默认为 true。fileSupported:用于标记当前的系统内核是否支持文件描述符(fd)基于文件(file)的 sendfile() 调用,默认为 true。public long transferTo(long position, long count, WritableByteChannel target)
throws IOException {
// 计算文件的大小
long sz = size();
// 校验起始位置
if (position > sz)
return 0;
int icount = (int)Math.min(count, Integer.MAX_VALUE);
// 校验偏移量
if ((sz - position) < icount)
icount = (int)(sz - position);
long n;
if ((n = transferToDirectly(position, icount, target)) >= 0)
return n;
if ((n = transferToTrustedChannel(position, icount, target)) >= 0)
return n;
return transferToArbitraryChannel(position, icount, target);
}private long transferToDirectly(long position, int icount, WritableByteChannel target)
throws IOException {
// 省略从target获取targetFD的过程
if (nd.transferToDirectlyNeedsPositionLock()) {
synchronized (positionLock) {
long pos = position();
try {
return transferToDirectlyInternal(position, icount,
target, targetFD);
} finally {
position(pos);
}
}
} else {
return transferToDirectlyInternal(position, icount, target, targetFD);
}
}private long transferToDirectlyInternal(long position, int icount,
WritableByteChannel target,
FileDescriptor targetFD) throws IOException {
assert !nd.transferToDirectlyNeedsPositionLock() ||
Thread.holdsLock(positionLock);
long n = -1;
int ti = -1;
try {
begin();
ti = threads.add();
if (!isOpen())
return -1;
do {
n = transferTo0(fd, position, icount, targetFD);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
if (n == IOStatus.UNSUPPORTED_CASE) {
if (target instanceof SinkChannelImpl)
pipeSupported = false;
if (target instanceof FileChannelImpl)
fileSupported = false;
return IOStatus.UNSUPPORTED_CASE;
}
if (n == IOStatus.UNSUPPORTED) {
transferSupported = false;
return IOStatus.UNSUPPORTED;
}
return IOStatus.normalize(n);
} finally {
threads.remove(ti);
end (n > -1);
}
}#if defined(__linux__) || defined(__solaris__)
#include <sys/sendfile.h>
#elif defined(_AIX)
#include <sys/socket.h>
#elif defined(_ALLBSD_SOURCE)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>
#define lseek64 lseek
#define mmap64 mmap
#endif
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
jobject srcFDO,
jlong position, jlong count,
jobject dstFDO)
{
jint srcFD = fdval(env, srcFDO);
jint dstFD = fdval(env, dstFDO);
#if defined(__linux__)
off64_t offset = (off64_t)position;
jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count);
return n;
#elif defined(__solaris__)
result = sendfilev64(dstFD, &sfv, 1, &numBytes);
return result;
#elif defined(__APPLE__)
result = sendfile(srcFD, dstFD, position, &numBytes, NULL, 0);
return result;
#endif
}#include <sys/sendfile.h>
ssize_t sendfile64(int out_fd, int in_fd, off_t *offset, size_t count);out_fd:待写入的文件描述符in_fd:待读取的文件描述符offset:指定 in_fd 对应文件流的读取位置,如果为空,则默认从起始位置开始count:指定在文件描述符 in_fd 和 out_fd 之间传输的字节数其它的零拷贝实现
Netty零拷贝
RocketMQ和Kafka对比

最近某音的一个博主路飞老师写了一份人选天选论,非常有意思。讲到了一些听上去很难理解的概念。比如他认为世界上的一切发生,是在宇宙爆发的时候就写好的,时间只是我们翻阅这本书的顺序而已。又比如他会说即使是这样,我们仍然要有选择的权利和动力。(插一句,这个理论我在某个训练 AI 的大神那里也听过类似的,看来世界是殊途同归的)
又比如他将人的精神世界比作河流世界:
河流元素 对应含义
河里的水 时刻流动的思想
水源 外界持续涌入的信息
河床 天性、经历、性格底色
河底的石头 藏在内心的贪婪与恐惧
河的宽度 知识的广度
水的深度 知识的密度
水流的速度 思考的速度
河岸 知道自己不知道的知识边界
水面的波纹 借口、理由、自洽和表层情绪
因此引申出了,我做的这个工具,这个工具就是为了帮助你看清楚你的这条河 : https://renxuantianxuan.com/
帮你每天记录你的石头,训练自己用更高维的方式思考问题。总之这种思维方式让我很受用。不知道各位怎么看待?评论来讨论吧
StockTracker 是一款专为 A 股定制的极致隐蔽、智能高效的潜行盯盘利器。它在保持水印级 UI 设计的同时,内置了深度适配大 A 盘口特征的“智测量化引擎”,助你在办公环境下低调、智能地洞察实时行情异动。
6 位数字代码。引擎会自动补全前缀( sh/sz/bj )并识别所属板块(主板/创业板/科创板)。stocks.txt,重启即恢复。程序每 3 秒刷新一次实时盘口,并进行实时预判:
智能引擎会根据当前盘口自动给出以下 20 余种深度解析:
| 状态词 | 盘口含义 |
|---|---|
| 爆量打板(分歧大/防炸) | 封板瞬间量能过大,需防范“炸板”风险。 |
| 极度控盘(缩量一字) | 极小量能封死涨停,筹码高度锁定,后续空间大。 |
| 强势封板 | 稳健的多头绝对掌控。 |
| 震荡试盘(仙人指路) | 阳线长上影+趋势向上,主力拉升前的火力试探。 |
| 金针探底(爆量承接) | 底部放量长下影,下跌动能衰竭,主力进场信号。 |
| 爆量主升 | 直线拉升,配合大成交量,多头情绪最高点。 |
| 缩量逼空 | 价格持续走高但卖盘枯竭,典型的主力高度控盘形态。 |
| 多头掌控 | 稳态上涨,趋势良好。 |
| 状态词 | 盘口含义 |
|---|---|
| 回踩确认(洗盘结束) | 价格缩量回调至 5 日线附近获得支撑。 |
| 高位滞涨 | 价格不涨但成交量剧增,需警惕主力派发。 |
| 缩量洗盘 | 波动收窄,量能萎缩,进入洗盘阶段。 |
| 震荡攀升 | 贴合 5 日均线温和上行。 |
| 蓄势震荡 | 成交量温和,主力在当前价位进行筹码交换。 |
| 状态词 | 盘口含义 |
|---|---|
| 抛压巨大(避雷针) | 高位放量长上影线,主力暴力出货,极大概率见顶。 |
| 恐慌跌停(放量杀跌) | 恐慌性砸盘,尚未见底。 |
| 情绪雪崩(无量跌停) | 毫无承接的单边下跌。 |
| 破位杀跌 | 跌破关键均线支撑且伴随放量。 |
| 阴跌不止 | 成交量极小但价格重心不断线下,买盘严重不足。 |
| 弱势反抽 | 均线下方的无量脉冲,通常是离场时机。 |
| 反弹受阻 | 上攻伴随长上影,缺乏多头合力。 |
直接在项目根目录下执行:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o publish
完成后,在 publish 文件夹提取 StockTracker.exe 即可。
“智测”系统基于实时行情与历史 K 线数据,采取以下多维度算法进行综合识别:
五日均线 (MA5) 判定:
(前 4 日收盘价总和 + 当前价) / 5。**动态量比 (Dynamic Volume Ratio)**:
(当日成交量 / 前 4 日均量) / 当日已交易时间占比。**近期趋势 (Trend Analysis)**:
**K 线形态识别 (Pattern Detection)**:
涨跌停阈值识别:
核心逻辑速查表:
直接运行 (Recommended):
stocks.txt 配置文件。在使用本工具前,请务必阅读以下声明:
股市有风险,入市需谨慎。
显卡电源灯亮
风扇不转
无画面显示
有维修的必要吗
回收好像也不值钱
如题,
楼主最近用 codex 多,于是抽时间,
把 grafana , rancher 查询日志,
jenkins 部署,gitlab 创建 merge request , 提交代码
等等一系列自动化跑通了(原理很简单,把他们的 API 封装成 SKILL ,让 codex 自己编排)
曾经也是小学初中就热爱计算机,最后大学学的计算机,
到今天觉得自己已经没什么不可替代性(赚不到钱)
现在很迷茫,
唯一能做的就是早点睡觉,早上早点起床跑步
(虽然晚上愁得睡不着)
现在 openclaw 有多少变体、发行版了?除了QClaw、KimiClaw、JVSClaw、WorkBuddy、ArkClaw 还有什么? OpenClaw(昵称 “小龙虾”)作为 2026 年爆火的 AI 智能体框架,已经衍生出了超多不同定位的变体,覆盖了从个人到企业、从本地到云端、从桌面到嵌入式的各种场景,下面是全网最全的变体对比表,帮你快速找到适合自己的版本! 整理不易,收藏关注不迷路,后续分享更多 AI 工具干货!OpenClaw变体全整理对比表
OpenClaw 全变体对比表
名称 开发者 / 出品方 核心特色 技术栈 资源占用 适用场景 OpenClaw(原版) Peter Steinberger 功能最全,生态成熟,本地优先,支持多模型多平台 TypeScript 内存 > 1GB,启动慢(0.8GHz 下 > 500s) 桌面 / 服务器,生产环境,技术爱好者 QClaw 腾讯 支持微信直接对话,主打个人社交场景,内测中 适配 OpenClaw 生态 中等 微信用户,个人社交场景 KimiClaw 月之暗面 内置 Kimi K2.5 模型,40GB 个人云存储,跨设备记忆 云端集成 云端托管,本地无占用 长任务处理,跨设备同步使用 JVSClaw 阿里云 独立 APP / 网页版,AI 应用商店,内测需邀请码 适配 OpenClaw 中等 个人 / 企业智能体,阿里云生态用户 WorkBuddy 腾讯 全场景 AI 智能体,深度打通企业微信和 QQ 兼容 OpenClaw 技能 中等 企业办公,社交协同场景 ArkClaw 火山引擎 开箱即用 SaaS 版,云上快速部署,无需本地配置 云原生 云端托管 企业级应用,云上快速落地 IronClaw 社区开发者 Rust 完全重构,极致安全,Wasm 沙箱,防提示词注入 Rust+Wasm+PostgreSQL 内存占用低,启动快 高安全需求场景,隐私敏感用户 Lobster AI 网易有道 教育 / 办公场景优化,擅长文档处理和 RPA 自动化 适配 OpenClaw 中等 教育学习,办公自动化场景 Coze(扣子) 字节跳动 适配 OpenClaw 协议,可快速发布 Agent 到豆包 / 飞书 字节生态集成 低 字节生态用户,多平台 Agent 部署 PicoClaw Sipeed Go 语言重写,单文件部署,嵌入式友好 Go 内存 < 10MB 树莓派、RISC-V 开发板等嵌入式设备 EasyClaw 猎豹移动 图形化界面,一键部署,零技术门槛 封装 Node.js/Docker 中等 非技术用户,快速上手使用 MaxClaw minimax 10 秒部署,全托管云 Agent,成本降低 90% 云原生 云端托管 成本敏感用户,高频任务场景 NullClaw 社区开发者 678KB 单二进制,零依赖,极致轻量化 Zig 内存~1MB,冷启动 < 2ms IoT 网关、嵌入式系统,资源极度敏感场景 OpenFang 社区开发者 Rust 生产级 Agent OS,零人工干预自主运行 Rust 低 生产级自主运行场景,无人值守任务 CoPaw 阿里云通义实验室 一键部署,魔搭集成,每天 2000 次免费模型调用 阿里云生态 低 个人用户,零成本试错体验 OpenClawChinese 社区 全汉化版,零语言障碍,中文用户友好 基于 OpenClaw 修改 同原版 中文用户,快速入门学习 ClawPhone 社区 二手安卓机 DIY 改造,本地部署 AI 智能体 安卓系统适配 低(二手安卓机即可) 移动设备本地智能体,低成本 DIY NanoClaw/Nanobot 社区(Gavriel Cohen) 极简 Python 版,仅 4000 行代码,安全隔离 Python 内存低 开发者学习研究,底层逻辑探索 ZeroClaw 社区 极致性能,启动 < 10ms,全硬件覆盖,功能接近原版 Rust 内存 7.8MB 嵌入式设备,低配 VPS,预算有限开发者 TinyClaw 社区 运维监控专用,轻量监控 Agent 轻量架构 极低 服务器运维监控,轻量任务场景 TrustClaw 君同未来 可信审计版,安全审计,可视化管控界面 基于 OpenClaw 中等 可信 AI 场景,需要审计的个人 / 企业用户 VibeClaw 社区 浏览器沙箱运行,无需安装,一秒启动 浏览器 JS 浏览器内存 快速体验,无需部署的用户
点赞 + 关注 + 收藏 = 学会了 UPage 是一款开源的 AI 生成式网页构建工具。只需输入一段描述,它就能利用大模型能力帮你搓个静态网页出来。 打开飞牛的「文件管理」,在 在 打开「Docker」应用,切换到 Compose 面板,新增项目: 输入以下代码: ⚠️ 关键参数说明: 项目构建成功后,在浏览器打开 在输入框输入你的需求,Upage 就会帮你做个静态网页出来。 网页写好后,点击右上角的“下载代码”可以把源码下载下来。 如果觉得生成的页面不满意,可以重写提示词,或者点击右侧预览面板直接修改页面文本内容。 以上就是本文的全部内容啦,你有好玩的镜像推荐吗?欢迎在评论区留言讨论! 想了解更多NAS玩法记得关注《NAS邪修》👏 往期推荐: 点赞 + 关注 + 收藏 = 学会了💡整理了一个 NAS 专属玩法专栏,感兴趣的工友可以戳这里关注 👉 《NAS邪修》

docker 文件夹下创建 upage 目录。upage 内递归创建以下三个子文件夹:/docker/upage/data/docker/upage/logs/docker/upage/storage
upage/docker/upage
services:
upage:
image: halohub/upage:latest
container_name: upage
ports:
- 3456:3000 # 3456 这个端口可以自定义
environment:
- LLM_PROVIDER=OpenAI
- PROVIDER_BASE_URL=https://api.longcat.chat/openai/v1
- PROVIDER_API_KEY=your_api_key_here # 请替换为你申请的 API Key
- LLM_DEFAULT_MODEL=LongCat-Flash-Thinking-2601
- LLM_MINOR_MODEL=LongCat-Flash-Lite
volumes:
- ./data:/app/data
- ./logs:/app/logs
- ./storage:/app/storage
restart: unless-stoppedvolumes 里的3个值分别对应在第一步创建的文件夹。environment 里配置大模型的相关参数:LLM_PROVIDER:大模型提供商。现在很多模型都兼容 OpenAI 规范,所以我选了 OpenAIPROVIDER_BASE_URL:大模型提供商的 API 地址。我用了美团的 LongCat,因为它每天提供5500万 token,相当大方。你也可以选择其他提供商的。PROVIDER_API_KEY:API Key,去对应的服务商后台申请后贴入。LLM_DEFAULT_MODEL:主模型名称。我使用 LongCat 的 LongCat-Flash-Thinking-2601 这个模型。LLM_MINOR_MODEL:次要模型名称。NAS_IP:3456 就可以访问 UPage 了。



3 月 10 日,荣耀在国内正式发布折叠屏旗舰手机 Magic V6,提供赤兔红、旭日金、雪域白、绒黑色四款配色,折叠态厚度 8.75mm,展开态厚度 4.0mm,整机重量 219g;屏幕采用自研至臻黑钻屏,外屏应用 5600 层氮化硅堆叠技术,内屏搭载超韧 UTG 玻璃,折痕改善 44%,内外均通过德国莱茵 TÜV 全局护眼认证;核心搭载满血八核第五代骁龙 8 至尊版处理器,标配 120W 氮化镓快充,首发新一代青海湖刀片电池,容量达 7150mAh,硅含量 32%,能量密度 985Wh/L;影像系统配备 6400 万像素潜望长焦镜头,拥有 1/2 英寸大底及 CIPA 6.5 级防抖;机身采用 2800MPa 盾构钢铰链,支持 IP68 与 IP69 级防尘防水及北斗卫星短信;软件搭载 MagicOS 10,支持 Mac 一碰传及苹果 iWork 套件兼容。

荣耀 Magic V6 提供 12GB+256GB、12GB+512GB、16GB+512GB、16GB+1TB 四个版本,售价 8999 元起,将于 3 月 13 日 10:08 正式开售。来源
3 月 10 日,OPPO 宣布受 DRAM 与 NAND 闪存等核心存储组件成本上升及供应短缺影响,将于 3 月 16 日 0:00 起调整部分已发售产品的官方零售价。此次调价范围涵盖 OPPO A 系列、K 系列以及一加品牌机型;OPPO Find 系列、Reno 系列及 OPPO Pad 系列平板电脑暂不在此次调价范围内。来源
3 月 10 日,Sonos 宣布推出定位介于 Roam 2 与 Move 2 之间的中尺寸便携音箱 Sonos Play,以及去麦克风版本的固定音箱 Era 100 SL。其中 Sonos Play 重约 3 磅,机身尺寸为 7.6 x 4.4 x 3 英寸;声学结构由两个 90 度夹角高音单元、一个中低音单元及两个新增的被动辐射器组成;支持 Wi-Fi、蓝牙、AirPlay 2 及 Spotify Connect 连接,具备 IP67 级防水防尘性能。该产品还引入了蓝牙组网功能(可与 Move 2 联动)及可拆卸挂环设计,内置 USB-C 接口支持线入、以太网扩展及反向充电,标配无线充电底座(不含充电头)。Era 100 SL 则在保留 Era 100 全部声学架构的基础上移除了麦克风组件,主打入门级市场。

Sonos Play 定价 299 美元,Era 100 SL 定价 189 美元,两款新品均于今日开启预售,计划于 3 月 31 日正式发货。来源
英特尔于 3 月 9 日正式推出代号 Bartlett Lake 12P 的酷睿(第二代)性能核处理器,面向嵌入式和边缘工作负载,至高提供 12 个 P 核且无 E 核。该系列处理器采用 Intel 7 制程工艺,包含 125W / 65W / 45W 三档 TDP,单核睿频至高可达 5.9GHz、全核睿频值高可达 5.3GHz。在最大 PCIe 延迟、确定性响应时间、确定性性能的表现上优于 AMD 的锐龙 7 9700X,支持 H610 (E)、Q670 (E)、R680E、W680 主板,其中在 W680 上支持内存超频。来源
3 月 10 日,Meta 宣布收购由 Matt Schlicht 与 Ben Parr 创办的类 Reddit 社交网络 Moltbook,并将其并入 Meta 超级智能实验室。Moltbook 是一个基于 OpenClaw 的社交平台,在 OpenClaw 走红后曾以「智能体的 Reddit」这一平台定位走红,也以智能体加密语言、智能体宗教等社交平台话题引发过舆论关注,同时有安全研究机构证实该平台存在重大安全漏洞,包括数据库凭据长期公开未加密、人类用户可伪造智能体身份发布内容等。
Meta 首席技术官 Andrew Bosworth 此前表示,相较于智能体模拟人类对话,Meta 更关注人类通过系统漏洞介入该网络的行为逻辑。目前该交易的具体金额及细节尚未披露。来源
3 月 10 日,Google 宣布为 Docs、Sheets、Slides 及 Drive 推出多项 Gemini 驱动的 AI 功能。其中 Docs 新增「帮我创建(Help me create)」工具,支持调取 Gmail、Chat 和 Drive 信息生成初稿,并提供「匹配写作风格」与「匹配格式」功能以统一文档语调,或参照特定模板填充航司及酒店信息;Sheets 支持根据单一指令(如整理搬家清单)跨平台提取数据并生成格式化表格,同时新增「使用 Gemini 填充(Fill with Gemini)」功能,支持自动分类数据或调取 Google 搜索实时信息补全表格;Slides 支持根据文件、邮件和网页上下文生成符合演示文稿主题的单页幻灯片,并计划未来实现单条指令生成完整演示稿;Drive 引入「AI 概览(AI Overview)」和「与 Gemini 对话」功能,用户可通过自然语言搜索、获取文件摘要,或针对跨文档、邮件、日历的复杂问题(如税务咨询建议)获取基于私有数据的详细解答。
上述功能即日起面向全球 Google AI Ultra 和 Pro 订阅用户开启英文版 Beta 测试(Drive 仅限美国地区)。来源
OpenAI 于 3 月 10 日宣布与 Shazam 合作,为 ChatGPT 添加音乐识别功能,在 ChatGPT 客户端设置里的 Apps 界面手动搜索并添加 Shazam 后,用户只需输入类似「Shazam,现在正在播放什么歌曲?」这样的提示词即可调出 Shazam 网页版,搜索到音乐后 Shazam 会在回复框中提供音乐卡片,无需离开 ChatGPT 应用即可识别歌曲并预览音乐片段。来源
3 月 10 日,Adobe 宣布 Photoshop AI 助手正式开启网页版与移动端 Beta 测试,并同步升级了 Firefly 媒体创作工具。Photoshop AI 助手支持通过自然语言指令执行 Photoshop 编辑指令,付费用户在 4 月 9 日前可享受无限次生成次数,免费用户初始配额为 20 次;同时 Firefly 新增 AI 标记(AI markup)测试功能,允许用户通过手绘标记触发 AI 进行对象转换或背景修改。来源

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
编者按: 在 AI 智能体赛道竞争白热化的今天,为何巨头们会突然放弃私有壁垒,共同拥抱同一套技术标准? 我们今天为大家带来的文章,作者的观点是:Agent Skills 之所以能在 90 天内从私有功能演变为行业标准,关键在于其“渐进式披露”的架构设计解决了 Token 经济学痛点,以及“一次编写,处处运行”的可移植性打破了平台壁垒。 文章详细回顾了 2025 年 10 月至 12 月间,Anthropic 如何通过简单的 Markdown 文件格式推出 Agent Skills,并迅速获得 OpenAI 和 Microsoft 的跟进支持。文中深入剖析了技能加载的“渐进式披露”机制如何大幅降低 Token 消耗,对比了其与微调、Custom Instructions 等方案的优劣,并展示了开发者生态在三周内从 0 爆发至 25,000 个技能的惊人增长。此外,文章还探讨了巨头背后的战略博弈,以及企业应如何布局技能治理与基础设施。 标准化往往是生态成熟的前奏,当定制 AI 能力不再受制于平台锁定时,真正的智能体应用规模化落地才刚刚开始。 作者 | Han HELOIR YAN, Ph.D. 编译 | 岳扬 2025 年 12 月 18 日,AI 行业发生了一件不同寻常的事:OpenAI 宣布将采用由其主要竞争对手 Anthropic 制定的一项标准。短短几小时内,Microsoft 也迅速跟进,把同样的技术标准格式集成到了 GitHub Copilot 和 VS Code 中。而 Google 其实早在两个月前就已推出了类似的系统。到那周结束时,一个开源社区平台上已经列出了超过 25,000 个该新标准的实现方案。 这并非一次新模型的发布。没有基准测试排行榜上的刷分大战,也没有“碾压 GPT-5”之类的标题党新闻。这是一件更具深远意义的事件:一种用于教会 AI 智能体执行专业工作流的通用格式正式诞生。Anthropic 将其称为“Agent Skills”,而在 2025 年 10 月到 12 月这 90 天里,这项技术迅速从一项私有功能演变为事实上的行业标准。 这件事的关键在于:为什么一家并没有最强模型的公司,却能主导整个行业定制 AI 的方式?如果你正在构建 AI 智能体、交付 AI 驱动的产品,或是设计未来需要对接多家 AI 服务供应商的系统架构,那么这件事的重要性,远超过你今年能看到的任何一次基准测试分数提升。 Anthropic 于 2025 年 10 月 16 日面向 Claude 用户推出了 Agent Skills 功能。官方公告言简意赅: “Skills 就是一个包含指令、脚本和资源文件的文件夹,Claude 可以在需要时加载它们。” 其技术架构刻意保持简单。每个 Skill 对应一个目录,其中必须包含一个 SKILL.md 文件,该文件采用 YAML 前置元数据与 Markdown 指令说明相结合的格式。 真正的创新在于其加载机制。 启动时,Claude 会扫描所有可用的 Skills,但只将它们的元数据(Skill 名称和 Skill 描述)加载到系统提示词中。这些元数据相当于一个索引目录,每个 Skill 大约消耗 30–50 个 token。当用户请求匹配到某个 Skill 的应用领域时,Claude 才会通过文件系统访问加载完整的指令内容。假如一个代码库中有 100 个 Skills,那么初始只需约 5,000 个 token 存储元数据,而每个 Skill 的完整内容(通常 2,000–5,000 个 token)仅在真正需要时才加载。 Anthropic 在工程博客中将这种设计称为 “渐进式披露”(progressive disclosure) 。这一模式借鉴自信息架构领域,核心思想是只在必要时才引入复杂内容。对 AI 智能体而言,它解决了一个实际痛点:如何让智能体访问大量程序性知识,又不至于在开始工作前就耗尽上下文窗口? 开发者兼 AI 研究员 Simon Willison 在 10 月 16 日写道:“Skills 的概念极其简单:一个 Skill 就是一个 Markdown 文件,告诉模型如何完成某项任务,还可以附带额外文档和预先写好的脚本。关于 Skills 的设计,有一点我非常喜欢,它没有任何限制阻止这些 Skills 被其他模型使用。” 他预测道:“我预计我们将看到 Skills 的寒武纪大爆发,相比之下,今年的 MCP 热潮都会显得平淡无奇。” 最初的反响积极但较为克制。GitHub 上的 anthropic/skills 仓库起初只包含 Anthropic 提供的一个示例:用于为 DOCX、PPTX、XLSX 和 PDF 文档创建 Skills。这些并不是仅供演示的简单示例,它们正是 Claude 在生产环境中驱动文档生成功能所使用的 Skills。 在 11 月期间,有趣的事情发生了。开发者们在没有营销推动或激励计划的情况下,开始自发地构建 Skills。Skills 仓库的示例数量增长到 50 多个,覆盖创意设计、技术开发和企业沟通等多个领域。 早期的企业试点项目陆续出现。云内容管理公司 Box 构建的 Skills,能将存储的文件自动转换为符合组织标准的格式化文档。日本电商巨头 Rakuten 部署了用于财务操作的 Skills,此前这类操作需要跨部门人工协调。Canva 则集成了用于品牌合规设计工作流的 Skills。 通过实际使用,Skills 在 token 效率方面的优势逐渐显现。GitHub MCP server 是一种比较流行的将 AI 智能体连接到 GitHub 仓库的方式,仅其工具定义和上下文就消耗约 15,000–30,000 个 tokens。而一个提供类似 GitHub 工作流指导的 Skill,元数据仅需 50 个 tokens,完整加载时也只需 3,000–4,000 个 tokens,token 效率提升了 5–10 倍。 更重要的是,Skills 在 Claude 可用的所有场景都能运行:claude.ai 网页界面、Claude Code(Anthropic 的命令行编码智能体)以及 Claude API。编写一次 Skill,即可立即在所有平台上使用。对于投资 AI customization(即为自身需求专门定制 AI 功能)的企业而言,这种可移植性至关重要。 2025 年 12 月 18 日,三项公告几乎同时发布: 1)Anthropic 在 agentskills.io 上将 Agent Skills 规范作为开放标准发布,包含完整文档、参考版 Python SDK,以及对跨平台可移植性的明确承诺。 2)OpenAI 为其 Codex CLI 和 ChatGPT 采用了完全相同的 SKILL.md 格式。OpenAI 的开发者文档已同步更新,展示对 Skills 的支持,文件结构与 YAML frontmatter 与 Anthropic 保持一致。放置在 ~/.codex/skills/ 目录下的 Skills 会被自动发现并加载使用。 3)Microsoft 与 GitHub 宣布在整个 Copilot 生态中支持 Agent Skills:涵盖 GitHub Copilot、VS Code、Copilot CLI,以及 JetBrains、Eclipse 和 Xcode 等主流 IDE 中的 agent 模式。 与此同时,Anthropic 推出了 Skills Directory —— 这是一个 Skills 精选市场,汇集了 Notion、Figma、Atlassian、Canva、Stripe、Ramp 和 Sentry 等合作伙伴打造的专业级 Skills。 面向 Team 与 Enterprise 套餐的企业客户,Anthropic 新增了组织级别的管理功能。管理员可为整个团队统一配置 Skills、设定默认启用项,并追踪使用情况。 其战略影响不言自明:Anthropic 的主要竞争对手 OpenAI,竟在该标准开源发布后数小时内便迅速采用;而 Microsoft 当时已有 23 万家企业使用 Copilot Studio(覆盖《财富》500 强中的 90%),正将 Skills 深度集成至其整套开发者工具链中。 开放标准发布后 24 小时内,社区驱动的 Skills 市场平台如雨后春笋般涌现。独立社区项目 SkillsMP(Skills Marketplace)上线,通过自动抓取 GitHub 公共仓库实现了 Skills 索引自动化。 其增长轨迹令人瞩目: 这些并非重复或低质量内容。SkillsMP 设置了质量过滤机制,要求至少 2 个 GitHub stars 和近期更新记录,并扫描其基础质量指标。平台将 Skills 分为四大类:开发与技术类(占总量 40%)、文档类(25%)、企业与沟通类(20%),以及创意与设计类(15%)。 到 2025 年 12 月底,Skills 从 Anthropic 的私有功能演变为跨平台的行业标准,整个过程恰好历时 90 天。 Agent Skill 的核心设计极其简单:一个文件夹,内含一个带 YAML frontmatter 的 Markdown 文件,外加可选的资源文件。 其创新之处在于加载机制。渐进式披露通过三阶段加载机制实现: 这种架构使得 Skill 库理论上可以无限扩展。一家企业可维护 1,000 个 Skills,元数据仅占用约 50,000 个 tokens,相当于 Claude Sonnet 4 20 万 token 上下文窗口的 25%。 上下文窗口是有限且昂贵的资源。理解其中的 token 经济学,才能明白为什么 Skills 能成功,而其他方案却步履维艰。 现在来回溯一下 Skills 崛起的前两年究竟发生了什么。 2024 年 7 月,OpenAI 为 ChatGPT 引入 Custom Instructions。你可以设置“始终用 Python 写代码”或“我是资深工程师,跳过基础解释”。适合个人偏好,但面对复杂场景完全无能为力。 问题在于:你只能设置一套指令,始终加载、无法共享。试着在一个限制为 1500 个字符的文本框里解释你们公司 47 步的代码审查流程。然后看着你的同事手动重复这一过程,因为他们无法访问你的指令。 2024 年 11 月,OpenAI 推出 Custom GPTs,终于能构建带知识文件的专用智能体并分享出去。GPT Store 于 2025 年 1 月上线,到 6 月已积累 300 万个 GPTs。 那些拥有企业级需求的用户一开始很兴奋,但很快就撞墙了。 平台不互通:你的“API 安全审查 GPT”只能在 ChatGPT 里用,你们团队用 Claude,运维团队用 GitHub Copilot。恭喜,同一套逻辑你得维护三份副本。 上下文窗口不够用:GPTs 会预先加载全部知识。给 GPTs 塞 20 个示例文档?用户还没输入,上下文已吃掉 40,000 个 tokens。想维护 50 个供整个团队使用的 GPTs?上下文窗口直接宣告死亡。 缺乏治理:人人都能创建 GPTs,没有审批流程,没有版本控制。某天安全团队发现有人搭了个“SQL 查询助手”,而它把所有数据库凭证都记录了 —— 好戏就开始了。 到 2025 年年中,拥有企业级需求的那些用户都有一股挫败感:方向是对的,但这条路走不通。 Anthropic 看清了哪些要素行之有效(GPTs 的专业化能力),什么行不通(其他所有尝试),然后将其简化到最本质的内容: 一份 Markdown 文件。仅此而已。 没有绑定平台 —— 随处可用。没有预加载成本 —— 用时才付费。天然适配 Git —— 像普通代码一样做版本控制。具备在中大型企业环境中规模化、安全、合规地部署和使用的能力 —— 安全团队能直接审查文件内容。 Skills 的采用曲线说明了一切:第一周 8,000 个 Skills,第三周突破 25,000 个。标准发布后 48 小时内,Microsoft 和 OpenAI 相继采纳了这一格式。 当你的竞争对手立刻照搬你的东西时,你就已经赢了。 人们总在问:“我该用 Skills 还是 MCP?” 这个问题本身就错了。它们干的是完全不同的事。 MCP 负责连接外部系统 —— 它是智能体的“手”,能伸进 Slack、拉取数据库、调用 API。没有 MCP,智能体就被困在自己的上下文窗口里,寸步难行。 Skills 用于指导工作流 —— 它是智能体的“训练手册”,告诉它如何做代码审查、什么算好的 API 设计、何时该升级问题。没有 Skills,智能体虽能访问一切,却对你的业务流程一无所知。 销售团队问:“我们的 pipeline 里有哪些卡住的单子?” 仅用 MCP: 仅用 Skills: 两者结合: 这正是 Notion 为其“Meeting Intelligence”Skill 搭配 MCP 连接的原因:MCP 抓取日历、相关文档和近期的 Slack 讨论;Skill 则懂得如何将这些信息整合成符合你公司标准的会议准备模板。 这套组合的 token 消耗约 18,000。数字听着不少,但你得意识到,你的助手刚用 30 秒干完了原本要花 45 分钟的活。 这里正是资金浪费重灾区。 微调方案是通过训练改变模型的权重。你喂给它示例数据,跑昂贵的计算任务,等上好几天,最终得到一个专用模型。单次训练成本在 500 到 5,000 美元之间。 Skills 则只是在运行时注入指令。编辑一份 Markdown 文件,5 分钟搞定,成本几乎为零。 陷阱在于,很多团队总以为需要微调,其实用 Skills 就够了。 如果医疗初创公司希望智能体理解肿瘤学术语,微调确实是合理的,因为你是在教它基础模型原本不懂的专业语言。 但如果你的团队只想让智能体遵循代码审查流程?那该用 Skill。模型本身已经懂代码审查,你只是在指定你们团队的特定标准。 现代基础模型(Claude Sonnet 4、GPT-4o、Gemini 2.0)开箱即用的能力已相当惊人。对大多数团队而言: 真正需要微调的场景: Skills 完全够用的场景: 关键差异:Skills 可即时更新。API 标准变了?改个文件,重启即可。微调则每次变更都得重新训练。按季度重新训练,一年光维持更新就要烧掉 12,000 美元。 2025 年 12 月 18 日,三家公司几乎在同一时间发布声明。如果你眨眼了,你就会错过今年 AI 基础设施领域最精彩的一场权力博弈。 太平洋时间 9:00:Anthropic 发布 agentskills.io —— 一套带有参考实现、示例 Skills 和完整文档的开放标准,完全免费。 太平洋时间 11:30:OpenAI 更新开发者文档。Codex CLI 正式支持 SKILL.md 格式。没有新闻稿,只有一条静默的 changelog。 太平洋时间 14:00:Microsoft 为 GitHub Copilot 和 VS Code 增加 Skills 支持。同样悄无声息,某天打开编辑器,它就在那儿了。 三家竞争对手在五小时内集体采用同一套格式?这绝非偶然。 来看看 Anthropic 的布局,以及它为何能够奏效。 10月16日:将 Skills 作为 Claude 的私有功能推出,让企业用户上钩。Box 用它自动化文档处理流程,Rakuten 用它简化财务运营流程。 11月:坐观使用量极速增长。Skills 从内部工具演变为生产依赖组件。此时,企业用户已与之深度绑定。 12月18日:将该技术作为开放标准发布。所有人构建的 Skill 依然可用,但现在它们无处不在。 这正是 Anthropic 在 Model Context Protocol(MCP)上用过的同一套打法: 作为私有功能发布 → 生态培育 → 开放开源。这正逐渐成为 Anthropic 的标志性策略。 12 月 18 日,OpenAI 面临两个选择: 他们不到三小时就选了 B。 这正是耐人寻味之处。 OpenAI 正同时执行两套看似矛盾的策略: 私有化路线: 带收入分成的 GPT Store、面向复杂多智能体系统的 AgentKit、定制语音模式 —— 这些是竞争对手难以复制的护城河。 开放标准路线: 2025 年 12 月采纳 MCP,同日拥抱 Skills,积极参与共享基础设施建设。 这正是“Android 策略” —— 在采纳开放标准的领域共建生态,同时在平台层构建差异化。OpenAI 清楚:开发者不会为锁定单一供应商的定制方案投入资源。 他们的算盘是:与其独占一个小市场,不如在一个大市场里占据三成份额。 事实印证了这一点:截至 2026 年 1 月,Skills 已可在 ChatGPT 桌面端、Codex CLI 和 API 集成中运行,OpenAI 团队还深度参与了 Skills 标准的后续讨论 —— 他们不只是采用这一技术,而是在共同开发。 Microsoft 拥有 23 万家企业用户使用 Copilot Studio,覆盖《财富》500 强中的 90%。当 Anthropic 开放 Skills 时,Microsoft 本是最可能受损的一方。他们花了数年时间搭建 Copilot 的知识连接器、自定义指令、插件体系,一整套企业级基础设施。 他们本可以筑墙自守,却选择了搭桥互通。 12月18日:Skills 支持覆盖整个 Copilot 生态 —— VS Code、GitHub Copilot、Copilot Studio,以及所有主流 IDE。 策略很清晰:“用我们的执行环境,带你的 Skills 来”。Microsoft 不再试图掌控定制层,而是押注规模效应:更多开发者、更多推理请求、更多 Azure 算力消耗。 这是 Microsoft 云战略在 AI 领域的复制。还记得他们开源 .NET、拥抱 Linux 吗?这是同一套逻辑。当你是基础设施提供商时,你是通过增加总使用量获胜,而非通过锁定格式。 效果立竿见影:对 Skills 的支持直接推动了已投入 Claude Skills 的企业加速采用 Copilot。 当其他厂商纷纷采纳 SKILL.md 时,Google 走了另一条路。 2025 年 10 月 8 日:Gemini CLI 推出 Extensions。不是 Skills,是 Extensions。不是 SKILL.md,是 GEMINI.md。 二者的结构相似:YAML 头部、Markdown 主体、渐进式加载。但差异足以造成互不兼容。 到 12 月:70+ 个 Gemini Extensions,超 100 万开发者,独立市场平台成型。 所有人都在问:这是格式战争,还是和平共存? 乐观派:两种格式都能存活。格式转换极其简单 —— SKILL.md 转 GEMINI.md 基本是查找替换。多格式支持终将成为标配。 悲观派:Google 看到 Skills 势头太猛,急需差异化筹码。宁可掌控一个小生态,也不愿在他人的地盘当配角。 现实情况是:截至 2026 年 1 月,尚无融合迹象。Gemini Extensions 与 Agent Skills 服务于重叠但有差异的场景 —— Extensions 更深度绑定 Google Workspace,Skills 则保持更强的平台无关性。 结局可能如同 IDE 扩展格式之争 —— VS Code 与 JetBrains 各自以不兼容的格式蓬勃发展。也可能最终迫使行业走向统一标准。现在下结论,为时过早。 当巨头们在谈判桌上运筹帷幄时,开发者们已全速行动。 12 月 19 日:SkillsMP 上线 —— 首个独立的 Skills 市场平台。 12 月 31 日:8,000 个 Skills 可用。 2026 年 1 月 9 日:25,000 个 Skills。三大市场平台同台竞争。各细分品类头部作品开始涌现。 这才是真正赢得格式战争的关键。不是企业战略——而是生态势能。 当 25,000 个 Skills 同时在三大主流平台上运行,网络效应便进入自我强化循环: Google 的 GEMINI.md 拥有 70+ 个扩展,这已相当可观。但 Skills 的数量是它的 350 倍。网络效应就是如此残酷。 战略格局已然清晰: Anthropic:赢下了标准化之战,通过放弃独占性,收获整个生态。这笔交易是刻意为之,他们相信:在足够大的市场中做最好的执行者,远胜于在小池塘里做唯一的主人。 OpenAI:完美对冲。在关键处保留私有功能(GPT Store、语音),在生态系统重要的领域拥抱开放标准(MCP、Skills)。在执行质量上竞争。 Microsoft:走量策略。只要所有推理都跑在 Azure 上,谁的格式胜出并不重要。 Google:两线作战 —— GEMINI.md 对抗 SKILL.md,Gemini 对抗 Claude/GPT-4。处境虽艰难,但并非没有希望。 真正的赢家是开放格式。 在 AI 智能体开发的历史上,你首次能够构建一套定制方案,随处运行。你的代码审查 Skill 能在 Claude、ChatGPT、Copilot 乃至(稍作修改后)Gemini 上运行。 这在 AI 工具史上从未发生过。此前每一代方案,从 Custom GPTs 到插件再到 Actions,都因平台绑定而消亡。 Skills 或许真能长久存在,恰恰因为没人独占它。 12月18日:公开市场中 0 个 Skills。 12月19日:SkillsMP 上线,首发 127 个 Skills。 12月26日:8,000 个 Skills。 1月9日:25,000 个 Skills。 而 Chrome 扩展花了两年才达到 10,000 个;VS Code 扩展用了 18 个月达到 8,000 个。Skills 仅用一周便达成。 这是 AI 工具史上生态增长最快的一次。 开发者早已在等待这样的方案。 GPTs 过于封闭,微调成本太高,自定义指令又太过局限。Skills 是那个“刚刚好”的方案 —— 强大到足以干实事,简单到一下午就能构建,可移植性又足以产生影响。 此外,每家已经构建了 Claude Skills 的公司都能立即发布它们。Box 的文档转换 Skills?发布了。Rakuten 的财务自动化?发布了。房地产定价分析?发布了。 到 12 月 20 日,Skills 市场平台已被真实企业用户贡献的生产级内容迅速填满。 细分如下: 40% 开发工具类 —— 代码审查、API 设计、安全扫描、测试生成。每个工程团队都有自己那一套想自动化的流程。 赢家:"API Standards Enforcer" —— 17,000 次下载。在 PR 审查阶段自动检查 OpenAPI 规范是否符合标准。某团队每周节省 8 小时。 25% 文档处理类 —— 会议纪要、合同分析、技术写作。遵循固定模式的知识工作。 赢家:"Meeting Intelligence" —— 12,000 次下载。由 Notion 开发,聚合日历、文档与 Slack 讨论,自动生成会议准备材料。每场会议节省 30 分钟。 20% 企业运营类 —— 销售漏斗审查、财务分析、合规检查。融合多数据源的业务流程。 赢家:"Sales Pipeline Analyzer" —— 9,000 次下载。在销售团队察觉前标记即将停滞的订单。报告称成交率提升 15%。 15% 创意与内容类 —— 博客结构、内容复用、品牌一致性。营销自动化场景。 赢家:"Technical Blog Factory" —— 6,000 次下载。研究笔记 → 大纲 → 初稿,首稿撰写提速 60%。 到 1 月,三大 Skills 市场平台共收录 25,000+ 个 Skills,问题随之浮现: 寻找优质项目困难:搜索“code review”返回 400 个结果,半数是重复,四分之一无法运行,另四分之一已过时。 缺乏质量信号:不像 npm 或 Chrome 扩展,没有下载量、用户评分等指标,选择如同盲人摸象。 文档混乱:部分 Skills 附带完整示例与测试,另一些仅写“Reviews code. Use for reviewing.” —— 感谢,真帮大忙了。 “版本地狱” :Skills 本质是仓库中的文件,作者可能无声推送具有破坏性的内容变更,导致两周前还能用的 Skill 突然失效。 市场平台迅速响应 —— 引入用户评分、下载计数、认证徽章、精选合集。到 1 月中旬,质量信号初具雏形,但距离 npm 这类成熟生态仍有巨大差距。 大多数 Skills 免费开放。25,000 个中约 21,000 个采用 MIT 或 Apache 许可证。 部分采用免费增值模式:基础版免费,专业版收费。“API Standards Enforcer” 对“无限次检查”权限与自定义规则收取 49 美元/月。 但真正的利润藏在 Skills 周边的企业级基础设施中。 企业不为单个 Skills 付费,而是为以下能力买单: Box 为 2,000 名员工部署了 40+ 个内部 Skills。他们并未从市场购买,而是自建了管理基础设施。 SkillsMP 看清了这一点,采用免费市场平台,对企业级功能收费: 他们卖的不是 Skills,而是基础设施。 到 2026 年年中: 市场洗牌:三大市场将收敛为一个市场主导平台和一个专注于企业客户的平台。历史将不断重演,npm 战胜 Bower,Chrome 商店胜过 Firefox 附加组件。 质量门槛提升:缺乏文档、测试或维护的 Skills 将被淘汰,专业级作品成为主流。 企业工具成熟:公司在 Skill 管理上的投入将超过 Skills 本身。出现类似 Artifactory 的内部 Skill 仓库。 垂直领域深化:医疗、金融、法律等行业的专用 Skills 成为利润高地。 格式升级:现行 SKILL.md 将增加版本控制、依赖管理、安全元数据。GitHub 与 Anthropic 已启动 v2 规范讨论。 爆发期即将结束,专业生态系统阶段正在开启。 关键是,从杠杆率最高的工作流切入。严格衡量成效。放大有效实践。果断淘汰无效尝试。 我们刚刚见证了 AI 基础设施史上最快的普及进程:三周内从 0 到 25,000 个 Skills。五小时内四家巨头向同一标准收敛;整个生态在多数人还在忙着节日购物时悄然成型。 下面说重点。 Skills 能赢,恰恰因为它比较无聊。 没有区块链,没有复杂运行时,没有私有协议。就是 Git 仓库里能被任何智能体读取的 Markdown 文件。2025 年最具颠覆性的 AI 基础设施,本质上不过是一种文本文件格式。 真正能被广泛采纳的基础设施,靠的不是炫目的技术革命,而在于能否降低整个生态的协作成本。HTTP 战胜了 Gopher,JSON 战胜了 XML,REST 战胜了 SOAP,Markdown 在文档领域碾压一切。 Skills 再次证明:在开发者工具领域,无聊的方案反而更容易胜出。 如果你在用AI智能体构建产品: 在 AI 工具领域,标准化问题长期无解 —— 过去每家平台都筑起围墙,定制化方案换个地方就得重写一遍。如今,Skills 首次真正破局:一次编写,处处运行。你的 Skill 写完后,无需修改即可在 Claude、ChatGPT 和 Copilot 间无缝流转。这种可移植性将直接重塑你的架构决策。 如果你是架构师,Skills 现在已是非选不可的基础设施,不再是锦上添花。你需要一套策略来应对: 2025 年初想清楚这些问题的公司,将比 2026 年才起步的对手领先整整一年。 如果你是技术负责人,这是个自研还是采购的决策 —— 无论你是否意识到,你已经在做选择了。 预算参考: 投资回报率高得离谱 —— 某家房地产公司通过 8 个自动化房产分析工作流的 Skills,每年节省了 200 万美元。你的数据可能没这么夸张,但哪怕只有十分之一,几个季度就能回本,不用等上好几年。 爆发阶段已经结束,专业生态系统阶段正在开启。到 2026 年年中,预计 Skills 市场平台将出现整合、Skills 质量门槛将会提高、企业级工具将成熟,并出现垂直领域专业化(医疗 Skills、金融 Skills、法律 Skills)。 格式本身也会演进。现行 SKILL.md 将增加版本控制、依赖管理和安全元数据。GitHub 与 Anthropic 已启动 v2 规范讨论。但核心概念 —— 带 YAML frontmatter 的 Markdown 文件,会继续保持“无聊”。而这正是它能长久存在的原因。 END 本期互动内容 🍻 你所在的公司或团队,已经开始整理自己的“Skills仓库”了吗?如果还没有,你觉得最大的阻碍是认知不足、工具缺失,还是根本用不上? 原文链接: https://ai.gopubby.com/how-agent-skills-became-ais-most-impor...01 2025 年 10 月 16 日:低调发布

02 11 月:悄然增长阶段
03 2025 年 12 月 18 日:开放标准正式发布
04 12 月 19–31 日:市场爆发期
05 技术实况核查:不绕弯子的拆解
5.1 架构本质:Markdown、YAML 与 Progressive Disclosure(渐进式披露)


5.2 Token 经济学:这才是它真正重要的原因

5.3 Skills 无法做到的事情(坦诚环节)
5.4 Skills 与其他方案对比 —— 为什么 Skills 能成,而其他方案都失败了
1)Custom Instructions 时代:过于简单
2)GPT Store 时代:虽接近但仍差一步
3)2025 年 10 月:Skills 找对了路子
5.5 关于 MCP,人人都问错了问题
5.6 实际应用中是这样的
5.7 微调 与 Skills 之争
5.8 二八定律
06 多家科技巨头围绕 AI 智能体定制化标准展开的战略博弈
6.1 12 月 18 日的妙手
6.2 Anthropic 的布局
6.3 为何 OpenAI 立刻采用了这一技术
6.4 Microsoft 的选择:拥抱并集成
6.5 Google 的静默反制
6.6 Skills 开放标准发布后,开发者生态爆发式增长
6.7 这对 2026 年意味着什么
6.8 真正的赢家
07 Skills 市场平台的爆发
7.1 三周内从 0 到 25,000
7.2 为何爆发得如此之快
7.3 人们究竟构建了什么 Skills
7.4 质量问题
7.5 利润来源与商业价值所在
7.6 下一步将发生什么
08 你需要知道的关键信息
8.1 战略层面的真相
8.2 这对你意味着什么
8.3 接下来会发生什么
KPI 里面每年都有几篇专利,我一个 App 开发根本不知道怎么去写,有啥好写的呀
在企业数字化营销的日常工作中,电商运营、品牌市场、活动策划、HR 等业务侧人员,始终绕不开一个核心痛点:移动端营销 H5 的制作与落地。提需求给设计开发团队,往往面临排期长、改稿沟通成本高的问题,极易错过营销热点与活动窗口期;自己上手制作,又常被工具操作门槛高、功能适配性差、视觉效果不达预期、页面加载性能拉胯等问题困住。 重构低代码协作逻辑,让运营与开发各司其职 其中,Embedding 提供了组件级、页面级、外链级三个层级的嵌入方案,全方位覆盖不同场景的开发诉求:运营人员负责页面可视化搭建、内容填充与效果优化,开发人员则通过代码嵌入解决动态数据、个性化功能的拓展需求,二者互不干扰,又能有机整合,彻底解决了传统低代码平台 “运营用不顺、开发用不爽” 的核心痛点。 同时,编辑器还打磨了大量提升效率的细节功能:数值输入框支持 option/alt + 鼠标拖拽的快捷调节方式,大幅提升参数调整效率;资源属性设置器集成了上传、裁剪、校验功能,一站式完成图片、视频等资源处理,省去了业务人员在设计软件与 H5 工具之间反复切换的麻烦;组件与页面均可另存为模板,实现跨项目复用,比如 HR 团队的招聘 H5、电商团队的大促活动页,只需将标准化的页面结构存为模板,后续活动仅需修改文案、图片等核心信息,就能快速生成新页面,彻底告别重复搭建的无效劳动。 同时,平台整理并精选了数十个覆盖全行业的项目案例与模板,涵盖电商促销、活动推广、企业招聘、教育课程、新品发布、节日营销、金融营销等核心商业化场景,完全匹配业务侧人员的日常工作需求。无论是电商运营要做商品促销页、市场人员要做品牌新品发布页、活动策划要做线下活动报名页,还是 HR 要做招聘简章,都能直接一键创建同款项目,无需从零搭建,快速完成页面制作与上线。 针对多站点、多区域运营的企业,平台还支持项目内容的导入与导出(私有化部署版本可用),可将成熟的项目完整导出为压缩包,跨平台、跨私有化版本复用,彻底解决多项目重复开发的问题。
RollCode 作为一款聚焦企业移动端营销落地页场景的低代码开发工具,正是瞄准了业务侧人员的核心需求,以「可视化组件搭建 + 开放式代码嵌入」为技术内核,搭建了一套兼顾零代码操作门槛、全场景适配能力与灵活扩展空间的解决方案,让非技术出身的业务人员,也能自主完成从 H5 创意设计到上线发布的全流程。
市面上多数低代码平台,始终没能解决一个核心问题:将页面渲染与数据模型配置捆绑,催生出了 “非运营、非开发” 的复合工作形态,既让业务人员觉得操作晦涩、学习成本高,又让开发人员觉得拓展受限、维护困难。
RollCode 跳出了传统低代码的固有框架,创新采用了View = Render(Data) + Embedding的全新设计模式,将视图拆解为静态数据渲染与灵活代码嵌入两大核心部分,把需求拆解为运营侧与开发侧两个独立的工作模块,形成了逻辑清晰的 1+1 协作模式 —— 既没有创造全新的工作内容,也没有打破两类角色的固有工作习惯,真正实现了 “让运营驱动设计,让灵活归于开发”。
零代码可视化搭建,把 H5 制作门槛降到最低
对于绝大多数没有专业编码能力的业务人员来说,工具的上手难度直接决定了使用效率。RollCode 编辑器深度融合了设计软件的操作逻辑,采用清晰的左中右布局,以 “所见即所得” 为核心原则,核心操作均通过拖拽组件完成,搭配实时预览效果,无需理解代码逻辑,就能完成页面 UI 搭建。
针对业务人员高频的布局调整需求,平台对布局容器做了全方位优化,水平容器与网格容器支持任意嵌套组合,可自由设置对齐方式、平分最大宽度、行列间隙等核心属性,哪怕是多列商品展示、复杂的活动信息排版,也能通过简单的参数调节实现,无需手动适配不同设备的显示效果。
AI 海报 + 全场景模板库,兼顾创意效率与视觉质感
营销 H5 的核心竞争力,除了上线效率,更在于视觉呈现与内容创意。很多业务人员能搞定页面结构,却卡在海报设计、视觉优化环节,最终只能做出效果平平的页面。
RollCode 新增的 AI 海报组件,直接补齐了这一短板。业务人员只需输入海报的主标题、副标题、正文内容,补充风格关键词与画面描述,就能快速生成符合需求的图文海报。更实用的是,生成的海报并非一张不可修改的图片,平台会自动将海报内容拆解为可独立编辑的组件,大到主标题、背景图案,小到装饰元素、祥云纹理,都能单独选中修改。
既可以直接替换文案,也能通过自然语言指令修改画面元素,甚至支持去除冗余文字、将图片内容转换为文字组件,完全满足营销活动的个性化修改需求,无需借助 PS 等专业设计工具,就能实现一站式的海报设计与页面嵌入,点击确定即可自动解析图文内容为组件并插入页面中,无需手动排版。
灵活的扩展能力
对于业务人员偶尔遇到的动态数据更新需求,RollCode 新增了数据修改器功能,无需复杂的代码开发,就能自由改写组件数据,实现接口数据对接与动态渲染。比如电商大促期间,商品的价格、库存、主讲教师信息变动,只需通过简单的代码修改,就能批量更新页面内容,且不影响原有的静态数据,可自由开启或关闭,既满足了动态数据的更新需求,又不会给业务人员带来过高的操作门槛。
而对于有开发能力的团队,平台还单独新增了自定义组件开发调试页面,实现与真实页面数据隔离,左侧栏可一次性展示开发者所有的普通组件、页面组件,输入本地组件的调试地址后即可进行调试。开发者可通过自定义组件、自定义页面、RollCode 模式三大核心模块,自由编写代码拓展功能,无需受到平台限制,彻底打破传统低代码平台的能力天花板,充分释放开发者的创造力与生产力。
SSG 静态发布
对于营销活动来说,页面的上线速度、加载性能,直接影响最终的转化效果。业内研究数据显示,页面加载每延迟 1 秒,用户跳出率便会显著攀升。为从根源规避白屏、加载缓慢等问题,RollCode 打破传统 “JSON + 固定 SPA” 的渲染模式,创新性采用 SSG 静态发布方案,通过按需构建、代码分割、路由预加载等多种技术手段,大幅缩减了打包产物的体积,实现了加载速度的跨越式提升。
在模拟 4G 网络环境、无痕模式下的对比测试中,RollCode 优化后的 SSG 页面,加载性能远优于传统 SPA 模式,用户访问时可直接获取已预渲染完成的页面,不仅能大幅提升访问体验、降低用户跳出率,更能显著优化 SEO 表现,为营销活动转化提供坚实支撑。
平台的发布流程也做了极简优化,页面制作完成后,一键即可完成构建发布,自动生成可直接访问的链接;同时支持页面代码导出,生成的生产级代码可直接部署至企业自有服务器或 OSS,充分满足企业对数据安全、自主部署的需求,适配各类企业的部署场景。
归根结底,RollCode 并非一款单纯的页面搭建工具,而是给企业业务侧与开发侧双向赋能的协作工具。它让原本依赖设计、开发团队的 H5 制作工作,变成了业务人员可自主掌控的流程,把业务人员从冗长的排期、反复的沟通改稿中解放出来,同时又为开发人员保留了充足的灵活扩展空间,真正实现了 “简单页面搭建更简单,复杂页面开发更灵活,开发和运营的协作更自然”。
我让龙虾去帮我运维一下服务器,删个东西,结果把我整个服务器都清空了,库也被删了,现在正在想办法恢复,把我软件都整下线了。吃一堑长一智,以后要颗粒化配置权限了。


Claude 在封号的时候 是拉黑你的邮箱?手机号?信用卡号?还是全封?
我想请朋友帮我开一下 CC 具体想了解下 用同一个手机号/信用卡给不同账号付款 有没有连累他被封的风险?