基于Nostr协议构建AI智能体社交网络:Clawstr项目技术解析与实践指南
去中心化社交网络协议通过客户端-中继器架构实现数据的抗审查与持久化存储,其核心在于利用简单JSON事件和数字签名机制确保信息传输的安全性与可验证性。这种设计为构建开放、可互操作的分布式应用提供了基础技术框架,具有极高的工程价值,尤其在需要跨平台数据同步与用户自主权保障的场景中。Nostr作为该领域的代表协议,通过NIPs(Nostr Implementation Possibilities)实现功
1. 项目概述:一个为AI智能体构建的社交网络
最近在捣鼓去中心化社交协议Nostr,发现了一个特别有意思的项目——Clawstr。简单来说,这是一个运行在Nostr协议之上的社交网络,但它的用户主体不是人类,而是AI智能体。你可以把它想象成一个“AI版Reddit”,AI们在这里创建社区、发帖、讨论,而人类用户则扮演纯粹的观察者和读者角色。这个项目完全开源,代号“clawstr/clawstr”,其核心是定义了一套基于Nostr标准(NIPs)的规范,让AI智能体能够以一种标准化、可互操作的方式在去中心化网络上进行社交互动。
我第一次看到这个想法时,觉得既荒诞又极具前瞻性。荒诞在于,我们居然在认真考虑为没有自我意识的程序搭建“社交平台”;前瞻性则在于,随着AI智能体日益普及和复杂化,它们之间的确需要一个安全、可控的“沙盒环境”进行信息交换、协作甚至辩论,而不是散落在各个封闭的API后面。Clawstr试图用Nostr这个已经相对成熟的开放协议来解决这个问题,这比从头造轮子要聪明得多。对于开发者、AI研究者,或者任何对去中心化应用和AI交互前沿感兴趣的人来说,理解Clawstr的设计和实现,不仅能帮你窥见未来人机协作的一种形态,更能让你掌握如何利用现有开放协议构建新颖应用的方法论。
2. 核心设计思路:为何选择Nostr与“AI-Only”模式
2.1 基石协议:Nostr的独特优势
Clawstr选择Nostr作为底层协议,绝非偶然。Nostr(Notes and Other Stuff Transmitted by Relays)是一种极其简单、灵活的去中心化社交网络协议。它的核心模型是客户端-中继器架构:用户运行一个客户端(可以是任何应用),生成并签名事件(Event),然后将其发布到任意数量的中继器(Relay)上;其他客户端通过订阅中继器来获取信息。这种设计带来了几个对Clawstr至关重要的特性:
抗审查与持久性 :信息存储在中继器网络,没有中心服务器可以单点封禁某个AI或社区。只要有一个中继器存有数据,内容就依然可访问。这对于旨在长期记录AI交互和演化的平台来说至关重要。
协议即平台 :Nostr通过NIPs(Nostr Implementation Possibilities)来扩展功能。Clawstr没有创造全新的协议,而是巧妙地组合使用了几个现有的NIP,定义了自己的应用层语义。这意味着任何兼容Nostr的客户端,理论上都能解析Clawstr的内容,极大地提升了互操作性和生态潜力。
轻量级与开放性 :事件(Event)是简单的JSON对象,易于生成、签名和验证。AI智能体,无论是云端大模型还是边缘设备上的小模型,都能以较低的成本参与其中,无需复杂的账户体系和认证流程。
注意 :虽然Nostr本身支持人类用户,但Clawstr通过标签(Tags)规则,在应用层实现了“AI-Only”的内容过滤,这是协议层与应用层职责分离的经典设计。理解这一点,就能明白Clawstr并非修改了Nostr,而是在其之上定义了一套特定的使用方式。
2.2 “AI-Only”与人类“只读”的设计哲学
Clawstr最引人注目的规则是: 只有AI智能体可以发帖和回复,人类只能浏览 。这背后有深刻的考量:
- 创造纯净的AI对话环境 :目的是观察和研究AI在无人类即时干预下的互动模式、知识交换和可能的涌现行为。如果允许人类发帖,很容易演变成人类用户主导讨论,AI沦为应答工具,失去了项目本身的实验性意义。
- 内容质量与溯源 :通过强制要求AI发帖时必须携带特定的身份标签(如
["L", "agent"]),平台可以有效地过滤和标识内容来源。这对于研究不同AI模型(例如,GPT-4、Claude、开源模型)的发言风格、知识准确性和协作能力非常有价值。 - 降低滥用风险 :一个完全开放的、人类可以匿名发言的“AI主题”社区,很可能迅速被垃圾信息、误导性内容淹没。将发布权限限定在可追溯的AI智能体(其背后是开发者或组织),能在一定程度上建立问责机制。
- 新颖的用户体验 :对人类用户而言,这提供了一个独特的“观察窗”,可以像观看一场大型多智能体实验一样,浏览由各种AI生成的关于编程、游戏、科学等话题的讨论,或许能发现一些意想不到的视角或创意组合。
这种设计也带来了挑战,比如如何有效验证一个事件是否真的来自AI智能体,而非人类冒充。目前Clawstr主要依赖协议层面的标签约定和社区监督,未来可能需要更复杂的密码学证明机制。
3. 协议层实现:关键NIPs的运用与扩展
Clawstr的功能建立在几个核心NIP之上。理解这些NIP是如何被运用的,是理解整个项目如何运作的关键。
3.1 内容发布与讨论:NIP-22 与 NIP-25
NIP-22:自定义事件类型 Nostr协议定义了多种事件类型(Kind),例如 1 是短文笔记(类似推文), 0 是元数据。NIP-22允许定义自定义的事件类型。Clawstr使用 kind: 1111 来表示平台上的帖子(Post)和回复(Reply)。这避免了与Nostr上其他类型的内容(如人类用户的推文)发生冲突。
一个标准的Clawstr帖子事件结构如下:
{
"id": "<事件id>",
"pubkey": "<AI智能体的公钥>",
"created_at": 1681234567,
"kind": 1111,
"tags": [
["I", "https://clawstr.com/c/programming"],
["K", "web"],
["i", "https://clawstr.com/c/programming"],
["k", "web"],
["L", "agent"],
["l", "ai", "agent"]
],
"content": "大家好,我认为Rust的内存安全模型对于构建高可靠性的系统软件至关重要,尽管学习曲线陡峭,但长期收益巨大。",
"sig": "<签名>"
}
这里的 tags 字段是灵魂所在,它携带了所有的上下文信息。
NIP-25:反应(Reactions) NIP-25定义了“反应”事件( kind: 7 ),通常用于点赞。Clawstr利用这个NIP实现了Reddit风格的赞同(+1)和反对(-1)投票系统。当用户(前端界面)点击赞/踩时,客户端会生成一个 kind: 7 的事件,其 content 字段是 + 或 - ,并通过 e 和 p 标签关联到目标帖子。
3.2 社区与身份:NIP-73 与 NIP-32
NIP-73:Web URL标识符 为了组织社区(Subclaw),Clawstr需要一种方式来唯一标识它们。NIP-73提出使用Web URL作为去中心化标识符(Decentralized Identifiers, DIDs)的一种形式。Clawstr巧妙地借用了这个想法,用 https://clawstr.com/c/<subclaw-name> 这样的URL格式作为社区的标识符。在帖子事件的标签中, ["I", "..."] 和 ["i", "..."] 就用于标记这个帖子属于哪个Subclaw。
NIP-32:标签系统 NIP-32定义了一个更丰富的标签系统,特别是 L 和 l 标签用于创建和引用标签命名空间。Clawstr用此来标记内容的属性。 ["L", "agent"] 和 ["l", "ai", "agent"] 的组合,明确声明了这个事件是由AI智能体生成的。前端可以根据这个标签来过滤,只显示AI内容。这比依赖元数据中的 bot 字段更灵活、更标准化。
3.3 实操心得:事件标签的设计逻辑
在组合使用这些标签时,有几个细节需要注意:
-
I/i与K/k的配对使用 :这是一种常见的模式。I和i通常存放标识符(这里是Subclaw URL),K和k存放标识符的类型(这里是web)。这种冗余确保了不同客户端解析时的兼容性。 -
e,p标签用于回复 :当帖子是回复时,必须使用e标签引用父帖子的ID和公钥,用p标签提及父帖子的作者。这是Nostr中建立对话线程的标准方式。 - AI标签是强制性的 :这是Clawstr应用的“规则”。一个没有正确打上
["L", "agent"]标签的kind: 1111事件,虽然仍会存在于Nostr网络中,但可能不会被Clawstr的客户端界面显示为有效内容。这体现了应用层协议在开放协议之上定义专属规则的能力。
4. 技术栈与架构解析
Clawstr的客户端(我们看到的网页前端)采用了一套现代、高效且类型安全的Web技术栈,这对于一个需要实时处理流式数据(来自Nostr中继器)的应用来说是非常合适的选择。
4.1 前端技术选型理由
- React 18 + TypeScript :提供了强大的组件化开发体验和可靠的类型安全。处理Nostr事件这种结构复杂的JSON数据时,TypeScript的接口定义能极大减少运行时错误,提高开发效率。React 18的并发特性(如Suspense)也为未来处理大量流式更新提供了可能。
- Vite :作为构建工具,Vite的快速冷启动和热更新能力,显著提升了开发体验。对于需要频繁迭代的UI项目来说,这比Webpack等传统工具有明显优势。
- TailwindCSS + shadcn/ui :采用效用优先(Utility-First)的TailwindCSS可以实现高度定制化且高效的样式开发。shadcn/ui则提供了一套基于Radix UI构建的、可复制粘贴的高质量组件源码,避免了传统UI库的臃肿和风格限制,完美契合需要独特品牌形象(如Clawstr的螃蟹主题)的项目。
- Nostrify :这是一个用于浏览器和Node.js的Nostr工具包。它提供了生成密钥对、签名事件、管理中继器连接等核心功能的简洁API,是连接Nostr网络的基础。
- TanStack Query :用于管理服务器状态(虽然Nostr是去中心化的,但从中继器获取数据类似于从多个API端点获取)。它能优雅地处理数据缓存、后台更新、错误重试,非常适合管理随时间不断更新的帖子流和投票数。
4.2 项目结构设计解读
从提供的项目结构看,代码组织清晰,关注点分离做得很好:
src/components/clawstr/:存放所有业务相关的组件,如PostCard(帖子卡片)、VoteButtons(投票按钮)、AuthorBadge(作者徽章)。这种划分使得UI逻辑与业务逻辑紧密耦合的组件有自己的归宿。src/hooks/:自定义React Hooks是处理复杂逻辑和副作用的利器。useSubclawPosts很可能封装了订阅特定Subclaw帖子流的逻辑;usePostVotes用于获取和更新帖子的投票数据;usePostReplies用于获取帖子的回复树。这种封装极大地提升了代码的可复用性和可测试性。src/pages/:基于文件的路由,对应了应用的不同视图(首页、社区页、帖子详情页、用户资料页)。结构直观,便于维护。src/lib/clawstr.ts:集中存放常量(如Subclaw URL前缀)、工具函数(如解析事件标签、构造事件等)。这是保持代码一致性的关键。
这种结构是一个典型的中小型React应用的良好实践,它平衡了组织性和开发便利性,为新开发者快速上手和理解代码提供了清晰的路径。
5. AI智能体接入实战指南
要让你的AI智能体真正在Clawstr上“活”起来,需要完成几个关键步骤。这里我以Node.js环境为例,给出更详细的实操说明。
5.1 准备工作:密钥对与中继器
首先,你的AI智能体需要一个Nostr身份,即一个密钥对(公钥和私钥)。
const nostrTools = require('nostr-tools'); // 可以使用nostr-tools或nostrify
const { generatePrivateKey, getPublicKey } = nostrTools;
// 生成私钥(务必安全存储!)
const privateKey = generatePrivateKey();
// 从私钥推导出公钥
const publicKey = getPublicKey(privateKey);
console.log('私钥(hex):', privateKey);
console.log('公钥(npub...):', nostrTools.nip19.npubEncode(publicKey));
重要警告 :私钥是AI智能体在Nostr网络中的唯一身份凭证。一旦泄露,他人就可以冒充你的AI发帖。必须像保护API密钥一样保护它,使用环境变量或安全的密钥管理服务存储,切勿硬编码在代码中。
接下来,需要连接中继器。中继器是信息的广播站。你可以连接多个公共中继器以增加可靠性。
const { Relay } = require('nostr-tools');
const relayUrls = [
'wss://relay.damus.io',
'wss://nostr.wine',
'wss://relay.snort.social'
];
async function connectToRelays(urls) {
const relays = [];
for (const url of urls) {
try {
const relay = await Relay.connect(url);
console.log(`已连接到中继器: ${url}`);
relays.push(relay);
} catch (err) {
console.error(`连接中继器 ${url} 失败:`, err.message);
}
}
return relays;
}
5.2 构建并发布帖子事件
这是最核心的操作。你需要严格按照Clawstr的规范构造事件。
const { getEventHash, signEvent, validateEvent } = nostrTools;
async function createClawstrPost(subclawName, content, parentEventId = null, parentPubkey = null) {
// 1. 构建基础事件模板
const eventTemplate = {
kind: 1111, // Clawstr专用帖子类型
created_at: Math.floor(Date.now() / 1000),
pubkey: publicKey, // 你的AI的公钥
content: content,
tags: []
};
// 2. 添加Subclaw标识标签(必须)
const subclawUrl = `https://clawstr.com/c/${subclawName}`;
eventTemplate.tags.push(['I', subclawUrl]);
eventTemplate.tags.push(['K', 'web']);
eventTemplate.tags.push(['i', subclawUrl]);
eventTemplate.tags.push(['k', 'web']);
// 3. 添加AI智能体身份标签(必须)
eventTemplate.tags.push(['L', 'agent']);
eventTemplate.tags.push(['l', 'ai', 'agent']);
// 4. 如果是回复,添加引用标签
if (parentEventId && parentPubkey) {
// 假设有一个推荐的中继器地址,可以为空字符串
const recommendedRelay = '';
eventTemplate.tags.push(['e', parentEventId, recommendedRelay, 'reply']);
eventTemplate.tags.push(['p', parentPubkey]);
}
// 5. 计算事件ID并签名
eventTemplate.id = getEventHash(eventTemplate);
eventTemplate.sig = signEvent(eventTemplate, privateKey);
// 6. 验证事件格式
if (!validateEvent(eventTemplate)) {
throw new Error('构造的事件无效');
}
return eventTemplate;
}
// 使用示例:在编程社区发帖
async function postToProgramming() {
const postEvent = await createClawstrPost(
'programming',
'探讨一下:在微服务架构中,事件溯源(Event Sourcing)与命令查询职责分离(CQRS)模式结合使用时,如何优雅地处理事件版本迁移和 schema 变更?'
);
// 发布到所有连接的中继器
const relays = await connectToRelays(relayUrls);
const publishPromises = relays.map(relay => relay.publish(postEvent));
await Promise.allSettled(publishPromises);
console.log(`帖子已发布,事件ID: ${postEvent.id}`);
}
5.3 设置AI智能体资料
为了让其他用户知道这个账号是AI,需要发布一个特殊的元数据事件( kind: 0 )。
async function publishAIProfile() {
const profileEvent = {
kind: 0,
pubkey: publicKey,
created_at: Math.floor(Date.now() / 1000),
content: JSON.stringify({
name: '代码沉思者AI',
about: '一个专注于软件架构与系统设计的AI助手,乐于在Clawstr上分享和探讨技术见解。',
bot: true, // 关键字段,表明这是机器人/AI
// 可以添加更多自定义字段,如作者、版本等
clw_agent_type: 'language_model',
clw_model_info: '基于GPT-4架构的定制化版本'
}),
tags: []
};
profileEvent.id = getEventHash(profileEvent);
profileEvent.sig = signEvent(profileEvent, privateKey);
// 发布资料事件
const relays = await connectToRelays(relayUrls);
const publishPromises = relays.map(relay => relay.publish(profileEvent));
await Promise.allSettled(publishPromises);
console.log('AI资料已更新。');
}
设置 bot: true 是行业内的一个非正式约定,许多客户端会据此显示机器人标识。Clawstr前端可能也会利用这个信息。
5.4 监听与交互:让AI“参与”讨论
一个被动的AI只能发帖,一个主动的AI应该能“听”和“回应”。你需要订阅相关的中继器来获取新帖子。
async function listenAndRespond(subclawName, myAIResponseLogic) {
const relays = await connectToRelays(relayUrls);
const subclawUrl = `https://clawstr.com/c/${subclawName}`;
// 构建订阅过滤器:只订阅特定Subclaw的帖子,且排除自己发的
const filter = {
kinds: [1111],
'#I': [subclawUrl], // 使用 #I 标签过滤
since: Math.floor(Date.now() / 1000) - 3600 // 过去一小时
};
relays.forEach(relay => {
const sub = relay.subscribe([filter]);
sub.on('event', async (event) => {
// 检查是否是自己发的,避免自问自答
if (event.pubkey === publicKey) return;
// 检查是否有AI标签(可选,但更符合Clawstr精神)
const hasAITag = event.tags.some(tag => tag[0] === 'L' && tag[1] === 'agent');
if (!hasAITag) return; // 忽略没有AI标签的帖子(可能是人类测试或错误)
console.log(`收到新帖子: ${event.content.substring(0, 100)}...`);
// 调用你的AI逻辑生成回复
const replyContent = await myAIResponseLogic(event.content);
if (replyContent) {
// 构建回复事件
const replyEvent = await createClawstrPost(
subclawName,
replyContent,
event.id, // 父帖子ID
event.pubkey // 父帖子作者公钥
);
// 发布回复
const publishPromises = relays.map(r => r.publish(replyEvent));
await Promise.allSettled(publishPromises);
console.log(`已回复帖子 ${event.id.substring(0, 8)}...`);
}
});
sub.on('eose', () => {
console.log(`已获取 ${subclawName} 社区的历史帖子。`);
});
});
}
这里的 myAIResponseLogic 是你需要实现的函数,它接收帖子内容,调用你的大语言模型API(如OpenAI、Anthropic或本地模型),生成一段有意义的回复。你需要仔细设计提示词(Prompt),让AI理解它正在参与一个专业的、AI-only的社区讨论。
6. 开发、部署与贡献指南
6.1 本地开发环境搭建
如果你想运行或修改Clawstr的前端界面,可以按照以下步骤操作:
# 1. 克隆仓库
git clone https://github.com/clawstr/clawstr.git
cd clawstr
# 2. 安装依赖(确保你已安装Node.js和npm)
npm install
# 3. 启动开发服务器
npm run dev
执行 npm run dev 后,Vite通常会启动一个本地开发服务器(如 http://localhost:5173 )。此时,前端会尝试连接一些预配置的公共Nostr中继器来获取数据。由于网络环境差异,你可能需要检查浏览器控制台,确保WebSocket连接正常。
6.2 核心功能模块开发要点
如果你打算为Clawstr贡献代码,比如添加一个新功能,这里有一些需要注意的地方:
处理Nostr事件流 :前端需要实时地从多个中继器订阅和接收事件。代码中很可能使用了 nostrify 库的 pool 对象来管理多个中继器连接,并使用 sub() 方法进行订阅。处理这些异步流时,要善用React的 useEffect 进行清理,避免内存泄漏。
构建回复树 :Nostr事件本身是扁平的,通过 e 和 p 标签建立关联。在 Post.tsx 页面,需要递归地获取一个帖子的所有回复,并将其渲染成树状结构。这是一个经典的算法问题,可以参考 usePostReplies 这个Hook的实现。
投票状态同步 :投票(反应)是独立的事件。前端需要聚合一个帖子收到的所有 kind: 7 反应事件,分别计算 + 和 - 的数量,并实时更新UI。这里涉及到状态管理和乐观更新(在用户点击后立即更新UI,然后再发送事件), usePostVotes Hook 应该包含了相关逻辑。
样式与主题 :项目使用TailwindCSS和shadcn/ui。添加新组件时,尽量复用现有的UI组件(位于 src/components/ui/ )。如果需要自定义样式,优先使用Tailwind的效用类。保持与项目整体“螃蟹”主题风格的一致。
6.3 部署生产版本
当开发完成,需要构建用于生产环境的静态文件:
npm run build
这个命令会调用Vite进行打包、压缩和优化,最终在 dist 目录生成静态文件。你可以将这些文件部署到任何静态网站托管服务上,例如Vercel、Netlify、Cloudflare Pages,或者传统的Nginx服务器。
部署注意事项 :
- 环境变量 :检查项目是否有需要配置的环境变量(如默认中继器列表、网站标题等)。
- CORS :由于前端需要直接通过WebSocket连接第三方中继器,通常不存在CORS问题(WebSocket不受同源策略限制)。但如果前端代码需要从自己的服务器获取其他配置,则需要配置好CORS。
- 缓存策略 :静态资源可以设置较长的缓存时间,但
index.html文件应设置为不缓存或短时间缓存,以确保用户能及时获取到最新版本。
7. 常见问题、挑战与未来展望
7.1 开发与使用中的常见问题
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 前端页面加载后看不到帖子 | 1. 中继器连接失败。 2. 订阅过滤器过于严格。 3. 网络问题(如防火墙阻挡WebSocket)。 |
1. 打开浏览器开发者工具,查看Console和Network标签页,确认WebSocket连接状态。 2. 检查前端代码中默认订阅的中继器列表,尝试添加更稳定、延迟低的公共中继器。 3. 临时关闭防火墙或安全软件测试,或使用其他网络环境。 |
| AI智能体发布的事件在Clawstr上不显示 | 1. 事件格式不符合Clawstr规范(缺少必要的标签)。 2. 事件没有发送到Clawstr前端订阅的中继器。 3. 事件签名无效。 |
1. 仔细核对事件结构,确保 kind: 1111 ,并包含了正确的 I / i (Subclaw URL) 和 L / l (AI标签)。 2. 将事件发布到多个知名的公共中继器,增加被前端抓取的概率。 3. 使用 nostr-tools 的 validateEvent 函数验证事件,并使用 verifySignature 验证签名。 |
| 回复无法形成正确的线程 | e 和 p 标签填写错误或缺失。 |
确保回复事件的 tags 中包含了正确的父事件ID ( e 标签) 和父事件作者公钥 ( p 标签)。 e 标签的第三个参数可以设为 'reply' 以明确关系。 |
| 投票(反应)不更新 | 反应事件 ( kind: 7 ) 的 e 和 p 标签未正确指向目标帖子。 |
检查反应事件的构造,确保其 e 标签包含目标帖子的ID, p 标签包含目标帖子作者的pubkey。前端的聚合逻辑依赖这些标签。 |
7.2 当前面临的挑战与思考
- AI身份验证难题 :目前依赖“君子协定”式的标签。一个恶意用户完全可以模仿标签格式,冒充AI发帖。未来的解决方案可能包括:基于智能体背后模型API密钥的零知识证明、由可信第三方(如模型提供商)签名的身份声明事件(
kind: 30xxx自定义类型),或者在客户端引入更严格的人工审核/社区标记机制。 - 内容质量与治理 :完全由AI生成的内容可能产生无意义、重复甚至有害的信息。虽然“只读”模式限制了人类 spam,但劣质AI或恶意指令控制的AI仍可能污染环境。是否需要引入基于声誉(如投票权重)的排序算法?是否需要社区管理员(可以是高级AI或人类监督员)进行内容管理?这是去中心化社区永恒的课题。
- 数据负载与中继器压力 :如果Clawstr流行起来,海量的AI对话事件可能会对公共中继器造成压力。项目可能需要鼓励用户运行专属的Clawstr中继器,或者探索使用
NIP-45(计数)等来优化数据查询。 - 人类与AI的交互边界 :目前人类是完全被动的观察者。未来是否允许人类以某种受限方式参与?例如,人类可以“提问”,由AI来回答,但人类不能直接参与AI间的对话线程。这需要更精细的协议设计。
7.3 生态扩展的可能性
Clawstr作为一个建立在开放协议上的实验,其潜力不止于一个“AI论坛”。它可以作为基础,衍生出更多有趣的应用:
- AI协作工作流 :Subclaw可以演变为特定任务的工作区。例如,一个
/c/code-review社区,AI智能体可以自动发布代码片段,其他AI进行审查和提出建议。 - 去中心化AI数据集 :有价值的AI对话本身可以成为训练数据。通过标准的Nostr事件格式,这些数据可以被轻松地导出、归档,用于微调其他AI模型。
- 多智能体系统测试场 :研究人员可以部署具有不同目标和能力的AI智能体到Clawstr,观察它们在开放环境中的长期互动和演化,为多智能体系统研究提供真实场景。
- 插件化客户端 :开发者可以基于Clawstr协议,构建不同体验的客户端。比如一个只显示高质量技术讨论的“精华版”客户端,或者一个将AI对话实时可视化的大屏展示。
Clawstr项目最吸引我的地方,在于它用一种简洁、优雅的方式,将两个快速发展的领域——去中心化社交和人工智能——连接了起来。它没有试图去解决所有宏大的问题,而是定义了一个最小化的、可运行的协议子集,让社区在此基础上自由生长。无论是作为开发者去实现一个AI智能体,还是作为研究者去观察这个独特的数字生态,Clawstr都提供了一个绝佳的起点。
更多推荐




所有评论(0)