@fttt007i
iAccount based inUnited States
About this account
- Account based in
- United States
- Connected via
- China Android App
Account-level information from X, not a live location or the device used for a specific post.
AI工程师一枚,分享自己的日常学习与项目构建。目前在研究Agent,譬如Pi. 被迫创业中 合作/咨询请留言
Joined June 2014
- Tweets1.6K
- Following2K
- Followers1.5K
- Likes657
jev现在可以便利的接入pi中了,这个通用分类器的潜力巨大。
this demo of codemode + jev in pi beautifully demonstrate both the power of codemode and general classification models
well done w/ this example @badlogicgames, @mitsuhiko, and the rest of your team
理解 Pi 的 Session 机制后,我对 Agent 的运行方式有了一个新的认识。
很多人理解 Session,只想到“聊天记录”。
但 Pi 的 Session 更像一个 Agent 的运行事件日志(event log)。
它不是简单保存用户和 AI 的对话,而是记录一次 Agent 运行过程中发生的各种事件:
用户消息
Assistant 回复
模型切换
Tool Call
Tool Result
Token 使用情况
Context Compaction
Extension 状态
Branch 分支
底层使用 JSONL 保存:
一个 Session 对应一个 JSONL 文件。
文件中的每一行都是一个 entry,通过 id 和 parentId 连接成一棵历史树,而不是简单的一条消息列表。
一次 Agent 运行过程中:
用户输入后,模型可能产生多个 content block:
thinking
text
toolCall
其中 toolCall 表示模型决定执行某个动作。
工具执行完成后产生 toolResult。
然后模型继续基于新的上下文生成下一步结果。
所以一个 Agent 任务可能包含多次模型调用,每一次调用都有自己的 assistant message。
而 Branch 机制让 Session 不再是一条线。
当你回到历史某个节点重新探索时,Pi 不需要创建新的 Session,而是在同一个 Session 中产生新的分支。
这和 Git 的 commit 历史很像:
保留过去的路径,同时允许从某个节点发展新的方向。
但需要注意:
Session 保存的是 Agent 的状态,不是整个项目环境。
它可以恢复:
✅ 对话历史
✅ Agent 运行状态
✅ 工具调用记录
✅ 模型状态变化
✅ Context 压缩记录
但不能保证恢复:
❌ 项目文件
❌ 代码版本
❌ 运行环境
所以一个可靠的 Coding Agent 系统,需要 Session、Git、项目环境和 Sandbox 等多个部分共同配合。
理解 Session,其实是在理解 Agent 如何实现:
可恢复(durable)
可分支(branchable)
可持续运行(long-running)
这也是未来 Agent 系统区别于普通 Chatbot 的重要基础。
#AI #Agent #LLM
有一条大概至少能赚到6美金,还是不错的,看看过两日的结算。这个平台起码能把老马的订阅费赚回来。
九月 @tuttihq 的数据,截到 9 月 30 日:
▸ 累计注册达人 14,269 个,九月新增 3,528。四月的时候总共才 159
▸ 真正发了帖的 1,431 位,一共 61,601 条,分在 46 场活动里
▸ 九月达人奖励 $81,480,1,545 个人拿到。本月单人最高 $2,653,累计拿得最多的那位已经 $11,197
▸ 有效曝光 860 万
▸ 一个月上了 7 次 𝕏 热榜
▸ 达人的粉丝里美国占 25%,抽样到的粉丝分布在 189 个国家和地区
十月接着冲。。。
Codemode 是让模型写一小段程序,来组织工具调用。 模型负责决定“怎么查、怎么处理”,程序负责执行循环、并行、筛选和计算,最后把需要的结果交回模型。Pi 把这段 JavaScript 放在专门的沙箱里运行。官方实现说明
它最重要的变化,是让工具之间传递的数据,可以先留在程序里处理,不必全部经过模型的上下文。
拿一个具体任务来说:
查询 100 条 issue,找出评论最多的 5 条,给我标题和链接。
普通工具调用可能是这样:
```mermaid
flowchart LR
A[模型请求 issue 列表] --> B[列表返回给模型]
B --> C[模型请求各条评论]
C --> D[评论返回给模型]
D --> E[模型比较并输出前 5 条]
```
如果工具本身不能排序、聚合,模型就得接收大量中间数据,再决定下一步。有些 agent 能并行调用工具,但返回结果通常仍会进入模型上下文。
Codemode 可以这样:
```mermaid
flowchart LR
A[模型写查询程序] --> B[程序调用工具]
B --> C[程序统计、排序、筛选]
C --> D[仅返回前 5 条]
D --> E[模型解释结果]
```
100 条 issue 仍然被查询了,但模型可以只看到最终的 5 条。 Pi 的 Codemode 文档明确说明,内部工具调用的原始结果不会自动进入模型上下文;脚本输出和返回值才会进入。官方实现说明
下面这段是示意代码,假设两个工具分别返回 issue 数组和评论数组,实际名称与返回格式由接入的服务决定:
const issues = await tools.listIssues({ limit: 100 });
const ranked = [];
for (const issue of issues) {
const comments = await tools.listComments({ issueId: issue.id });
ranked.push({
title: issue.title,
url: issue.url,
commentCount: comments.length
});
}
return ranked
.sort((a, b) => b.commentCount - a.commentCount)
.slice(0, 5);
这段程序做了四件事:查询、循环、统计、排序。模型不用每收到一条评论就重新思考一次。
这个例子为了清楚用了顺序执行;实际可以用并行或限制并发的方式加快查询。Codemode 减少的是模型参与中间步骤的次数,并不会减少任务本来需要的全部服务请求。
再往里面看,它是怎么执行的?
Pi 的流程大致如下:
Pi 告诉模型有哪些可调用工具,以及参数格式。
模型生成 JavaScript,作为一次 codemode 工具调用。
Pi 在 QuickJS 的 WebAssembly 沙箱里执行代码。
代码执行到 await tools.xxx(...) 时,Pi 的宿主程序真正调用工具,再把结果送回沙箱。
程序继续处理数据,通过 return、text() 或 image() 输出给模型。运行机制
所以,代码里的:
const result = await tools.someTool({ ... });
并不是模型“模拟”了一次调用,而是真实执行了已经接入 Pi 的工具。
脚本里的普通循环、条件判断、排序,也由 JavaScript 执行。只有你显式调用了模型或分类器,才会在这段流程中额外发生模型推理。
为什么它与 MCP 很搭?
MCP 和 Codemode 分别解决两个问题:
能力负责的事情MCP接入外部工具,处理通信、工具发现与认证等Codemode把这些工具组织成程序,处理调用顺序和中间数据
例如 MCP 提供“查 issue”“查评论”;Codemode 把它们组合成“查 issue → 查评论 → 统计 → 排序”。
但 Codemode 不依赖 MCP。Pi 的内置工具和扩展工具也能被它调用,比如同时读取几个文件,再提取其中的特定字段。官方也支持在 Codemode 中调用 Jev 等分类模型。Pi 使用文档
这里还有一个关键条件:工具返回结构化数据,组合起来才顺畅。
如果工具返回:
{
"issues": [
{ "id": "123", "title": "登录失败" }
]
}
程序直接读取 issues[0].id 就行。
如果工具返回的是一大段自然语言,程序还得从文字里猜字段。官方因此强调,MCP 服务应该提供更适合程序处理的结构化结果,而很多现有服务仍没有做好这一点。官方设计解释
它具体省在哪里?
可以分成三个方面:
少传中间数据。 完整结果先留在脚本里,模型只接收筛选后的内容。
少进行模型往返。 一段程序可以提前写好几十次有依赖关系的调用,不必每一步都等模型生成下一次请求。
按需提供工具说明。 Pi 的工具声明有预算,默认约 3000 个估算 token;放不下的工具可以通过搜索、查看说明后再使用。CLI 文档、设置说明
不过,“省上下文”不是自动发生的。脚本如果最后写:
return everything;
仍会把一大堆数据交给模型。收益取决于程序有没有有效地过滤和汇总。 写程序本身也需要 token,因此只有一个简单查询时,直接调用工具通常更省事。
你可能会问:那直接让模型写 Python 或 Bash 不也行?
确实,很多数据处理任务用普通脚本就能完成。Codemode 的特点是,它能直接使用 Pi 已经注册好的工具接口。
例如,一个 MCP 服务已经在 Pi 中完成 OAuth 登录,Codemode 可以直接调用它。自己写外部 Python 脚本,则通常还要自行处理相应的连接、认证、客户端和调用方式。
另外,Codemode 内部调用会经过 Pi 的工具执行流程,包括参数验证和扩展的调用钩子;已有权限扩展也能拦截这些调用。MCP 执行机制
因此,两者有重叠,但接入的位置不同:普通脚本使用操作系统和软件库,Codemode 使用 agent 已经提供的工具能力。
“沙箱”也需要准确理解。
Pi 的 Codemode JavaScript 没有普通 Node.js 那样的 process、require、模块导入或直接 fetch 能力。它通过注入的工具与外部交互。沙箱说明
但这不代表里面的操作都是安全、只读的。假如暴露的工具能够执行命令、修改文件或删除 issue,脚本也可以调用这些操作。
还有两点实际限制:
脚本失败,不代表前面已经完成的写入会自动撤销;不能把整个程序当作一个数据库事务。
程序擅长规则明确的筛选和计算;“哪个方案更合理”这类判断,仍需要模型或人来完成。
Pi 还允许保留部分跨调用数据。
脚本可以:
store("issues", issues);
下一次再:
const issues = load("issues");
Pi 会把成功写入的 JSON 数据记录到会话里,恢复会话和分支时按对应路径读取。它不是一个永久保留所有 JavaScript 变量的运行环境,需要保留的数据应显式存储。会话存储说明
如果要启用,在 ~/.pi/agent/settings.json 中合并:
{
"defaultTools": ["+codemode"]
}
启用后默认是 on:模型既可以直接调用工具,也可以通过 Codemode 调用。only 则把可调用工具集中到 Codemode,让模型通过脚本使用它们。这是工具呈现方式的区别,使用时可以根据任务选择。配置文档
对你前面说的这次更新,真正值得关注的是:Pi 开始正式支持“模型编写工具流程,程序执行并处理数据”的工作方式。 MCP 提供工具来源,Codemode 则让这些工具更容易组合成一个完整任务。
kayce retweeted
GitHub Roadmap for Developers 🐙
Start here:
01 → Create your GitHub account
02 → Learn repositories
03 → Learn `clone`
04 → Learn `add`
05 → Learn `commit`
06 → Learn `push`
07 → Learn `pull`
08 → Understand branches
09 → Learn merge
10 → Handle merge conflicts
11 → Write good commit messages
12 → Learn `.gitignore`
13 → Create README files
14 → Use Issues
15 → Learn Pull Requests
16 → Fork a repository
17 → Contribute to open source
18 → Learn GitHub Actions
19 → Deploy with GitHub Pages
20 → Pin your best projects
21 → Create a profile README
22 → Keep your contribution graph alive
Don't use GitHub only as cloud storage.
Make it proof of what you can BUILD.
What step are you on? 👇
所以用pi比用claude本身效果更好
Sonnet 5.5 vs Opus 5.5 High on my-mini-bench and comparison with Sonnet 5
I tested them on tasks from my own work: data conversion, frontend, refactoring and running task evaluations.
Setup: 10 tasks × 3 runs, High reasoning, in pi-agent and Claude Code through harbor.
Sonnet 5.5 vs Opus 5.5 in pi:
> Both passed 30/30.
> Time: 46s vs 103s: ~2.2× faster.
> Cost: $0.10 vs $0.30 per task: ~3× cheaper.
Compared with Sonnet 5 in pi:
> Passes: 25/30 → 30/30.
> Turns: 12.7 → 4.3
> Output tokens: 17.7k → 6.5k
The trajectories show a different approach to reading files, writing code, and testing. Examples below 👇
This benchmark is already saturated, but I use it to find the best setup for my tasks: cheaper, faster, and still gets the job done. It also lets me quickly compare models and see how their behavior differs.