03|pi-ai 的输入输出:事件流、最终消息与可重放上下文

这篇写什么

聚焦 pi-ai 的统一输入输出协议:为什么要把输出分成“事件流”和“最终消息”,以及为什么“可重放性”是 agent 系统的关键约束。

先说结论

pi-ai 的核心价值是:把多厂商模型调用统一成一套对 agent 友好的输入输出协议。

对 agent 友好意味着它要覆盖:

  • 多轮上下文
  • 工具调用
  • 流式增量输出
  • thinking/reasoning
  • usage/cost
  • 失败与中断
  • 跨模型继续对话

统一输入:上层真正需要表达的只有四类

  1. 用哪个模型
  2. 当前上下文是什么
  3. 这轮可以用哪些工具
  4. 这轮调用的运行参数是什么

模型输入不是字符串

模型对象应携带能力与调用语义:provider、协议类型、上下文窗口、是否支持 reasoning/多模态、成本与兼容配置等。

上下文输入不是单一 prompt

必须能表达 system 指令、历史消息、tool result 历史、以及多模态内容块。

工具输入必须结构化

工具是一组能力清单(名称/描述/参数 schema),而不是靠纯文本提示“你可以用这些工具”。

运行参数与上下文分层

运行参数影响执行方式(温度、max tokens、abort、transport、metadata…),但不应污染上下文语义。

统一输出:为什么要两层

1) 过程层:事件流

事件流用于表达进行中的状态变化,例如:

  • 文本增量
  • thinking 增量
  • tool call 及参数增量
  • 结束或错误

价值:UI 可实时渲染,runtime 可在 tool call 完整时接管执行。

2) 结果层:最终消息

最终消息是“这轮调用的官方结算单”:

  • 完整 assistant 内容(可能包含 text/thinking/tool call 等内容块)
  • 来源信息(provider/model/协议)
  • usage/cost
  • stop reason
  • error(如有)

价值:便于落库、回放、续接会话、统计分析。

为什么必须强调可重放性

一句话:输出最终要能够回流为下一轮输入。

这看起来简单,但现实里要面对:

  • thinking/reasoning 可能无法跨模型无损重放
  • tool call 标识或格式在不同 provider 下可能不兼容
  • aborted/error 消息是否应进入历史

因此设计要允许:

  • 表达 thinking/tool call
  • 同时不假设它们一定能跨模型原样重放
  • 必要时降级、剔除或转换

stop reason 为什么必须标准化

不同 provider 的结束语义很不统一,但上层真正关心的是:

  • 是否自然结束
  • 是否需要执行工具
  • 是否长度截断
  • 是否错误或中断

标准化 stop reason 是 agent runtime 决策(继续/停止、补救、重试)的关键依据。

小结

pi-ai 输入侧统一“模型 + 上下文 + 工具 + 运行参数”,输出侧统一“事件流 + 最终消息”,并把“可重放性”作为设计约束。

这些是它能支撑 agent 系统稳定多轮运行的骨架。

Read more

LTX-2.3 本地部署完整复盘

先把结论放前面:LTX-2.3(22B)这条 pipeline 在 4×RTX 3090(24GB)这套硬件上,按官方默认推理方式基本跑不起来。我最终得到的不是“没跑通”,而是一个更有价值的结果:把它为什么跑不起来、卡在哪、该怎么判断“物理不可行”,完整验证了一遍。 这篇文章是一次本地部署的工程复盘:从模型文件下载、依赖链补齐、环境和代码层踩坑,到显存拆分、多卡 device 规划,再到最终 OOM 的边界判断。希望你在遇到类似“看起来只要把权重放进去就能跑”的大模型工程时,可以少走很多弯路。 TL;DR(1 分钟读完) * LTX-2.3 不是单模型,而是一个多组件 pipeline:文本编码器(Gemma)+ 视频 diffusion 主模型(

By ladydd

一次 generate-prompts 服务连续超时事故的完整排查记录

背景 一个平时很稳定的服务,在 2026-04-02 这天突然出现“连续失败”。 最让人难受的不是失败本身,而是失败信息太少:日志里只有一串「第 1 次请求失败」,没有异常类型、没有耗时、没有栈。 这种时候人的直觉会把怀疑撒向四面八方:逻辑是不是坏了、参数是不是不对、上游是不是抽风、网络是不是波动……但没有证据,一切都只是猜。 1. 先把故障“照亮”:只补日志,不动行为 线上系统已经跑了很久,第一原则是:先让问题可见,但不要一上来就改主逻辑。 我加的日志只做两件事: * 把“这次请求到底发生了什么”讲清楚 * 保持所有行为不变(重试次数、超时、请求参数、返回解析都不动) 具体补充项包括: * 请求开始时的关键信息(目标地址、超时、参数摘要、prompt 长度) * 当前是第几次重试、总重试次数 * 每次请求耗时

By ladydd

快手 KAT-Coder-Pro V2 模型测试

市面上几乎没人聊这个模型,反倒让我很好奇,我决定全面测评使用一下 StreamLakeStreamLake溪流湖是快手toB视频云平台,提供领先的音视频AI解决方案。包含KAT-Coder智能编程助手、万擎大模型平台、视频云服务、直播云、点播云、实时音视频RTC等产品。基于前沿AI技术和音视频算法,为企业提供智能代码生成、视频处理、内容理解、智能审核等全链路服务,助力数字化转型。StreamLakeStreamLake 付完款发现上下文只有256K , 到今天来说 已经落后了 而且不支持视觉,也没有mcp接入 联网搜索之类的东西 确实是远远落后了 时隔半年再次看快手模型的官网,发现现在几乎就主打这一个模型了 coding plan用这个,然后api 调用这个是, 接入openclaw 也是这个,总之一个模型走天下,看上去太穷了,像是随时跑路的状态,但其实我很喜欢这种方式, 一个模型通杀所有场景 哈哈哈 接入 opencode 中使用 开了一个新的项目,决定保守一点,先让写文档, 之后再生成代码 下面是实际的体验 1. 不断 chat

By ladydd
陕公网安备61011302002223号 | 陕ICP备2025083092号