@fttt007

AI工程师一枚,分享自己的日常学习与项目构建。目前在研究Agent,譬如Pi. 被迫创业中 合作/咨询请留言

Joined June 2014
Pinned Tweet
我自己做了一个Pi核心20道题,理解了这20道题,对agent就有了一个大概的了解了。
6
37
1
251
27,273
有意思。
Replying to @rasbt
Update: OpenAI just added a Jev clone 😆
49
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
4
2,280
openai在模型能力上看来还是落后于Anthropic,期待能够追赶上。
78
理解 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
4
22
140
10,031
有一条大概至少能赚到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 个国家和地区 十月接着冲。。。
3
1
372
这个会把客服问题解决掉吗
Dot voice is an experiment around how it feels to call your little guy (not a real phone call, just feels like one.) Would love your feedback!
1
138
pi最近的版本迭代速度真快。
1
2
1,350
给客户做的一个中小学生考试作业辅导系统,客户反馈还不错。虽然是白菜价,不过总算是个好的开头。
3
434
有cloudflare,有国外的vps,感觉做国外的客户会比国内的反而容易些。
1
3
579
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 则让这些工具更容易组合成一个完整任务。
4
1
41
3,519
感觉蹬不完了,咋办
3
5
416
我更喜欢用agent学习,而不是网页的llm进行学习,用agent感觉更放心些。当然也贵一些
1
2
116
自建了一个可以发送邮件的agent,连接到飞书使用。以后的工作中心就转向可以干活的agent了。
1
2
456
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? 👇
8
53
2
275
8,539
所以用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.
1
115
感觉还不错。
2
385
claude真的非常耐用。
2
120
开始自己构建属于自己的类似muse 的agent,感兴趣的可以和我聊。
1
76