AI 流式输出时「思考中」总被正文盖住:最新活动优先的状态行做法

AI 流式输出时「思考中」总被正文盖住:最新活动优先的状态行做法

学习目标

读完这篇,你会给流式 AI 界面做一条永远显示"正在干什么"的状态行:模型在思考就显示思考,在调工具就显示工具名,在说话就显示正文尾巴——而不是永远卡在第一句话上。方法来自一个真实修过的 bug(boundless 的 src/ai/panel.rs),你照着思路搬到自己的项目里就行。

开场:最气人的不是慢,是不知道它在干嘛

画图 Agent 有个经典场面:你发一句"画个标题图",它先回一句"马上开画…“,然后就没动静了。实际上它正在一轮一轮地思考、调工具、画图,可状态行上永远停在那句"马上开画…”。用户看到的,就是"它卡住了"。

这不是模型慢,也不是网络卡,是状态行的优先级写反了。下面说怎么修,以及修之前怎么证明问题不在链路里。

1. 前置知识:三个概念先说清

流式事件三类:模型输出过程中,事件分三类——Reasoning(思考过程)、Tool(工具调用)、Text(正文叙述)。这三类是状态行的全部输入。

步骤序列 steps:按执行顺序排列的事件列表。steps 的最后一项,就是模型"正在干的事"。这个"最后一项"很关键,后面所有规则都建立在它上面。

buffer:已经流到的正文增量文本。它和 steps 是两条线:正文增量可能先于"生成 Text 步骤"的 flush 到达,也就是说,buffer 里有字的时候,steps 里可能还没有对应的 Text 步骤。

状态行和完整消息列表是两回事:消息列表要全,状态行只要"当前活动"这一行。

2. 分步骤实操:四步修好一条状态行

第 1 步:先定位——用探针证伪,别一上来改渲染

翻译成人话:状态行不显示思考,可能的原因有两个——(A)思考事件根本没到达前端;(B)到达了,但显示逻辑把它盖住了。两个原因修法完全不同,先分清再动手。

排查实录是这样的:在 BoundlessAgent::stream 上挂探针实测,128 个 Reasoning 事件正常到达;rig 0.38 的 OpenAI 兼容层解析 reasoning_content 无误;泵 / flush / 渲染链路插桩验证全通。更关键的是对照:纯问答场景本就正常,只有画图场景看不到思考。

结论:链路没问题,问题在状态行的优先级逻辑。这一步省下的,是"把渲染链路重写一遍"的无用功。怀疑链路时,先在边界上挂探针证伪,再动显示逻辑。

第 2 步:定规则——最新活动优先,而不是"说过的话优先"

旧逻辑长这样:

// 旧逻辑:buffer 优先
if !buffer.trim().is_empty() {
    显示 buffer 的尾部
} else if let Some(step) = steps.last() {
    按末步类型显示
}

问题一眼就能看出来:buffer 是"本轮说过的话",不是"正在做的事"。画图代理通常先叙述一句"马上开画…“,这句话一进 buffer,本轮之后所有轮次的思考尾部就再也显示不出来了——因为 buffer 永远非空。用户感受就是"思考过程不会显示”。

新规则只有一句话:看 steps 的最后一项,它就是当前活动。

fn streaming_status_text(steps: &[AssistantStep], buffer: &str) -> String {
    if let Some(step) = steps.last() {
        match step {
            // 末步是思考:显示思考尾部,空思考显示"思考中…"
            Reasoning { text } => 空则"思考中…",否则取 text 尾部,
            // 末步是工具:显示工具名
            Tool { name, .. } => "正在调用工具:{工具名}",
            // 末步是正文:显示文本尾部,空文本显示"生成中…"
            Text { text } => 空则"生成中…",否则取 text 尾部,
        }
    } else if !buffer.trim().is_empty() {
        // steps 为空、buffer 有字:增量先于 flush 到达,显示 buffer 尾
        取 buffer 尾部
    } else {
        "正在思考…"
    }
}

注意那个 else if 分支:steps 为空但 buffer 有字时,说明正文增量已经到了、但生成 Text 步骤的 flush 还没到。这时候显示 buffer 尾巴,状态行就不会卡住。这个兜底分支不能删——删了,增量先到的那几百毫秒里状态行就是死的。

第 3 步:把逻辑抽成纯函数,尾部截取单独处理

状态文本的计算不碰任何 UI 状态,只依赖 steps 和 buffer 两个输入,抽成纯函数 streaming_status_text。UI 层只负责调用它,算错了也只在一个地方。

尾部截取单独一个小函数 tail_chars(s, 64):先 trim,换行压成空格,再取末尾 64 个字符。状态行只有一行,换行必须压掉;取尾部而不是头部,因为用户要看的是"最新进展",不是"开头说了什么"。

第 4 步:用单测锁定修复,别靠肉眼复查

修完要加两个测试,锁定这个行为:

#[test]
fn compact_status_shows_latest_reasoning_even_after_text() {
    // 画图场景:模型先叙述(text 已进 buffer),再开始新一轮思考。
    // 旧实现 buffer 优先,之后的思考全部被遮蔽——本测试锁定修复。
    let steps = vec![
        AssistantStep::Text { text: "马上开画…".into() },
        AssistantStep::Reasoning { text: "先画一个圆角矩形作为标题底".into() },
    ];
    assert_eq!(
        streaming_status_text(&steps, "马上开画…"),
        "先画一个圆角矩形作为标题底"
    );
}

#[test]
fn compact_status_follows_step_sequence() {
    assert_eq!(streaming_status_text(&[], ""), "正在思考…");
    // buffer 已有字但 step 尚未 flush → 显示 buffer 尾
    assert_eq!(streaming_status_text(&[], "hello"), "hello");
    // 空思考步 → 思考中
    assert_eq!(streaming_status_text(&[Reasoning { text: "" }], ""), "思考中…");
    // 工具步 → 工具名(断言以前缀"正在调用工具"开头)
    // 文本步 → 文本尾
    assert_eq!(streaming_status_text(&[Text { text: "done" }], "done"), "done");
}

第一个测试是关键:它复现的正是画图场景——先叙述、后思考,修复后的状态行必须显示思考内容,而不是那句"马上开画…"。以后谁再把优先级改回去,这个测试会第一时间拦住。

3. 为什么这样设计

状态行显示的是"当前活动",不是"本轮说过什么"。 buffer 优先的旧逻辑,把"说过"当成了"正在做"。一旦分清这两个概念,规则就只有"看最后一项"这一条,没有第二条。

画图场景是这个 bug 的放大器。 纯问答场景里,模型往往思考完再说话,buffer 优先和最新活动优先表现一样,所以 bug 藏得住。画图代理的节奏是"先叙述、再思考、再调工具",叙述一进 buffer,之后的思考全被盖住。场景节奏不同,同一个优先级 bug 的可见度完全不同——这也是为什么排查时要拿画图场景做复现,而不是纯问答。

纯函数 + 单测,是这类 UI 逻辑的标准形态。 状态计算是纯逻辑,不依赖渲染时机、不依赖 UI 状态,抽出来可测、可锁定。靠肉眼复查的修复,下次重构还会翻车。

4. 避坑清单

  1. 状态行别直接读 buffer:buffer 是"说过的话",不是"正在做的事"。拿它做第一优先级,思考过程会被永久遮蔽。
  2. 增量先于 flush 要留兜底:steps 为空但 buffer 有字时显示 buffer 尾,别让状态行在那几百毫秒里卡死。
  3. 空状态要有占位文案:空思考显示"思考中…“,空文本显示"生成中…”,什么都不显示时显示"正在思考…"。别让状态行出现空行,用户会当成卡死。
  4. 尾部截取要压换行:状态行只有一行,换行不压掉,布局会乱。
  5. 怀疑链路先探针证伪:在事件到达的边界上挂探针,数一下事件到底到了几个。链路没问题就别重写渲染。
  6. 修完用单测锁定:把复现场景写成测试,第一个测试就是"先叙述、后思考必须显示思考"。靠肉眼验证的修复,等于没修。

5. 总结:给开发者的建议

  1. 流式状态行的规则只有一条:显示 steps 最后一项对应的活动。
  2. 优先级按"正在做"排,不按"说过什么"排;buffer 只做 steps 为空时的兜底。
  3. 状态计算抽成纯函数,输入只有步骤序列和 buffer,UI 层只调用。
  4. 空思考、空文本、全空三种情况都要有占位文案,别留空行。
  5. 修之前先在事件边界挂探针,证明事件到达了,再动显示逻辑。
  6. 把复现场景写成单测,锁定修复,防止下次重构改回去。

状态行只有一行,但它回答的是用户最关心的问题:它现在到底在干嘛。这一行对了,用户才愿意等;这一行错了,模型跑得再快,用户也觉得它卡住了。

相关推荐

中文手写体在桌面应用里总变印刷体?内嵌小赖字体加按脚本分段塑形的完整做法

先在目标平台上复现风格穿帮,再动手:确认是回落机制够不到内嵌字体,而不是字体文件或配置写错。内嵌字体三件套一次到位:字体文件、许可文本、启动注册,缺一件都算没做完。混排文字按 Unicode 区段切 run:中文组主字体用中文字体,拉丁组保持原手写体,run 按脚本边界交替。回落链继续保留给生僻字兜底:主字体管风格,回落链管覆盖,两层分工不要互相替代。三组样例验完再收工:纯中文、中英混排、生僻字加标点,缺一组都可能漏掉穿帮点。

遇码开源社区 245

给 Agent 搭一套无头评测跑器:事件出口抽象加确定性打分,让每次优化都有分数可比

新增一个Emitter再给它一个emit方法,签名刻意和 Tauri 窗口的emitWindow变体:直接调窗口的emit;Headless变体:把事件往通道里一送就返回。这里有个关键细节:通道断开时(比如评测器提前退出了),Headless分支静默丢弃即可,绝不能让事件出口的失败拖垮 Agent 的主循环。翻译成人话:评分员中途离场,不应该导致台上的演员停演。事件出口的语义是「尽力通知」,不是「可靠投递」。然后把原来所有直接调窗口 emit 的地方统一换成这个抽象。

遇码开源社区 342

水彩落笔后别立刻定型:用 2.5 秒晕开动画让数字水彩像真的在纸上洇开

读完这篇,你能给自己的手绘白板或画布应用加一个“落纸晕开”动画:水彩笔抬笔之后,笔画在 2.5 秒内按缓动曲线从“刚落笔的浓而窄”逐渐洇开成“沉降后的淡而宽”,动画结束时与静态渲染逐像素相同,无缝交回缓存。做完之后,你的数字水彩不再是“一抬笔就定型”的贴纸,而是有“洇开过程”的真水彩。解决办法不是换一套更复杂的笔刷算法,而是在已有的静态光栅上加一个时间维度:抬笔后 2.5 秒内,同一支笔画按沉降参数重新渲染几帧,从湿态渐变到干态,最后与静态结果完全一致。,多接受一个与笔画一一对应的沉降度数组。

遇码开源社区 233

知识库按标题查不到别直接报错:标题模糊匹配加候选清单的两级兜底做法

先实现标题全量收集,跳过 frontmatter、收全所有级别;精确失败后按“唯一前缀、唯一包含”的顺序兜底,唯一才直接返回;多候选或无候选时返回标题清单加重试指引,不替调用方猜;三组单测钉住三条分支,尤其是“多候选不能替选”这条底线。说到底,标题兜底不是什么高深技术,它就是把一句“未找到”换成了三句话:能确定的直接给,不能确定的给清单选,确实没有的明说。调用方少猜两次,你的 Agent 就少走两轮弯路。,觉得有用欢迎点个 star。

遇码开源社区 174

水彩两笔叠在一起出现双边沉色加白缝怎么修:读落笔前 alpha 快照做湿碰湿接缝融合,顺带把 AI 笔画尾巴收细

读完这篇,你能在自己的水彩光栅渲染里修掉一个典型瑕疵:两笔水彩叠在一起时,接缝处出现两条深色边加中间一条白缝;修完后接缝变成连续过渡。同时你还能顺手修掉另一个瑕疵:AI 生成的笔画尾巴是圆头胶囊,改成收细的笔尖。先给大家科普一个概念「湿碰湿」。翻译成人话:真实水彩里,新颜料落到已经湿了的纸面上时,不会老老实实在自己的边缘停下——颜料会向湿区扩散,两种颜色在接触处互相渗透,接缝是晕开的,不是两条线夹一条缝。

遇码开源社区 243

给 Agent 评测加只读闸门:评测任务禁写知识库与 DDL,评测不能改变它所度量的环境

读完这篇,你能给自己的 Agent 评测加上一道只读闸门:评测任务运行时,写知识库和改数据库结构的工具一律被拒绝,评测跑完后被测环境和跑之前一模一样;同时模型收到拒绝后能改用已有知识继续完成分析,而不是卡住或反复重试。先给大家科普一个概念「评测污染」。翻译成人话:评测是拿一把尺子量 Agent 的表现,如果量的时候 Agent 顺手改了尺子——比如往知识库里写了新结论、建了新视图——那第二次量的时候,量的就已经不是原来的东西了。分数变了,你却不知道是 Agent 变强了,还是环境被它自己改了。

遇码开源社区 291

给桌面应用工具栏加悬停提示:标签加快捷键徽章的暗色浮层做法

状态只要四样:标签、快捷键、光标位置、窗口宽度,用Option表示"无提示";悬停逻辑抽成 trait,所有按钮链式调用一次,不要每个按钮手写;快捷键对照真实绑定写进按钮表,改绑定时同步改表;渲染时暗色浮层跟随光标,右边界钳制,放在根节点最后保证置顶;全部按钮都要挂上,漏一个就是一次"这个按钮是不是坏了"的误会。图标按钮省下的地方,要用悬停提示还给用户。名称加快捷键徽章一次给全,是桌面应用里成本最低、收益最稳的可用性改进之一。,觉得有用欢迎点个 star。

遇码开源社区 248

给 AI 对话应用加历史轮次过程折叠:结论常驻、过程折叠成一行,顺带把每轮用量算清楚

reasoningtooltext段的 id 全部加入折叠集合;charterror段跳过;折叠控件的锚点是过程组第一段的 id,控件就渲染在这个段原来的槽位上;累加所有reasoning段的elapsedMs,得到推理总耗时;只要任一段缺耗时,这个数字就标为未知,不显示时间部分——宁可不显示,也不要显示一个假数字;数出tool段的数量,得到工具调用次数。返回结果包含四样东西:锚点 id、折叠 id 集合、推理总耗时(可选)、工具调用次数。

遇码开源社区 270

画布越画越卡?用 stamp 增量光栅把每笔的渲染成本锁死在自己的像素足迹里

算足迹(stamp box)→ 独立光栅(stamp)→ 合成进 base(composite)→ 实时帧 = base 副本 + 尾笔,外加一条"增量与全量像素等价(±2/255)"的回归纪律。20 笔从 3053ms 到 144ms,靠的不是奇技淫巧,是把 O(N²) 换成 O(N)。给开发者的建议先给你的渲染器加个"全量 vs 增量"的像素对比测试,再动手改架构——没有这条测试,增量就是慢性跑偏。

遇码开源社区 273

给 Agent 加三层记忆系统:用户画像、任务协议与知识生命周期,让它越用越懂你

用户画像记住"他是谁",任务协议记住"这类活怎么做",知识生命周期管住"旧知识别捣乱",再加一个复盘脚本当"捡漏网"。每层都是机械纪律,不是"让模型自己看着办"。给开发者的建议先给你的 Agent 写一条"沉淀纪律":触发条件 + 立即写 + 固定格式,三句话就能落地第一层。把你历史上交付得最漂亮的一次,拆成"适用问题/数据源/交付结构/验证清单"四要素,那就是你的第一条 playbook。给知识库加个status。

遇码开源社区 382

多行输入框“只见首行“的静默裁剪:auto_grow(1,4) 的三段式高度设计

静止形态(min):平时长什么样是 UI 契约,auto_grow的 min 守住它(悬浮条是 1 行胶囊)。生长上限(max):给生长一个天花板,界面不被撑爆(悬浮条是 4 行)。溢出行为:封顶后内部滚动、跟随光标,写得进去就得看得见。“能布局全长"不等于"能看见全长”——见到 h_auto 配固定高度裁剪盒,先怀疑静默裁剪。给开发者的建议:去翻一下你项目里的多行输入框,看看有没有"固定高度 + overflow 裁剪"的组合。

遇码开源社区 268

AI 指控“显示层插鬼影行“时,先过两步定案:payload 对账与直查数据库的防误诊做法

模型说"框架/渲染/驱动层有 bug",先当假的——这是最贵的结论,定案门槛最高。第一步 payload 对账:summary 声明、meta.rows、rows 实际行数三处一致,机械检查,不依赖模型判断。第二步直查数据库:绕开 agent 链路,逐字复核。两步全过才能定案。证据必须同源:验证探查与可疑分组同一列、同一查询;行号超出结果行数范围 = 读串,论证作废。贵的结论配贵的检查,便宜的检查先做——不要让模型的注意力,成为你最高成本结论的唯一证人。

遇码开源社区 214

给形状加「无描边」选项:为什么用独立布尔标志而不用特殊颜色值

给渲染元素加「无」类选项,四步:独立 bool 标志(serde 默认兼容旧文件)→ 渲染管线统一门控跳过(填充零改动)→ 缓存指纹纳入(切换即时生效)→ 边界回落 + UI 状态同步(文字回落深色、色板互斥、无效选项隐藏)。"无"不是值,是决策;决策只做一次,做在离渲染最近的地方。给开发者的建议:去翻一下你自己的代码,搜0x00000000-1""这种"特殊值表示无"的地方,数一数有几个消费点在检查它。超过 3 处,就值得重构成独立标志——现在不改,将来每加一个消费点都是在给未来的自己埋雷。

遇码开源社区 647

给数据分析 Agent 加联网搜索:为什么默认禁用,以及三条调用纪律

给 Agent 加一个"能力强但会污染主业"的工具,四步:照常挂载但把后端选择藏进配置 → preamble 立「克制使用」纪律 → 双条件准入 + 三条禁止线 → 结果标注来源、定性为背景。工具给能力,纪律给边界;没有边界的能力,输出的是看起来合理的错误。给开发者的建议:去翻一下你自己的 agent prompt,找那些"能力强"的工具——联网搜索、代码执行、文件写入。每个都问一遍:它有没有默认姿态?有没有准入条件?有没有禁止清单?如果三问里有一问答不上来,模型的用法就是失控的,趁早把纪律写进去。

遇码开源社区 631

图片渲染出来红蓝颠倒:颜色通道顺序 bug 的定位与锁死方法

颜色通道顺序 bug 六步法:纯红纯蓝诊断图钉死症状 → 查解码侧约定 → 查上传侧约定 → 搜项目内先例 → 入库处补swap(0, 2)→ 回归测试锁死字节序。颜色 bug 先对"两端的约定"表,对不上就补转换,补完用测试把约定变成契约。给开发者的建议:如果你在做任何涉及 GPU 纹理上传的图形开发,现在就去搜一下你的解码路径和上传路径——to_rgba8()后面有没有swap(0, 2),纹理格式是 RGBA 还是 BGRA。别等用户说"肤色发青"了才查。,觉得有用欢迎点个 star。

遇码开源社区 310

评测打分时数字总“对不上“:把精确相等换成相对容差 0.5% 的做法

给自动打分(或断言)里的数字比对换姿势,五步:承认格式噪声 → 抽出num_close→ 定相对容差公式(0.5% + 0.01 下限)→ 全调用点统一语义 → 真实 case 转回归测试。比的不是数字的字面相等,而是"在业务精度下是不是同一个数"。给开发者的建议:去翻一下你自己的测试/打分代码,搜1e-6==后面跟数字的地方——八成有至少一处正在用精确相等误伤合法答案。改的时候别只改一处,全局搜一遍,统一语义。,觉得有用欢迎点个 star。

遇码开源社区 229

Rust 桌面应用自托管自动更新:latest.json 清单 + minisign 签名校验的完整做法

自托管自动更新七步:密钥对(公钥 bake 进二进制)→ CI 签名 + latest.json → 客户端轮询比版本 → 下载到临时文件 → 验签(不过就停)→ 平台差异化换包 → 重启。信任锚钉死在二进制里,失败时永远能回到可启动的旧版本。给开发者的建议:如果你也在用 Rust 写桌面应用(GPUI、egui、iced 都一样),这套链路可以直接抄——updater.rs的结构是平台无关的,换掉产物格式和平台分支就能用。,觉得有用欢迎点个 star。

遇码开源社区 433

给 Agent 的动态知识大纲加 token 预算:热表完整注入、冷表折叠降级的做法

动态知识注入的预算装配,五步:估算器 → 定预算(按实测量体量)→ 按业务含义排序 → 逐条装配(超预算降级名称行、首条保底)→ 积压折叠(一行提示 + 按需拉取钩子)。常驻提示词只付"热知识"的钱,冷知识走按需拉取。给开发者的建议:如果你也在做 Agent,先去量一下你每轮提示词里动态部分有多大——八成有惊喜。量完再定预算,别拍脑袋。,觉得有用欢迎点个 star。

遇码开源社区 315

Agent 会话结束别直接关:五块式复盘报告的搭建方法

Agent 跑完不复盘,等于写了代码不看日志。先落盘、再一句命令出五块报告、然后人工过检查单、最后把纠正变成画像——这套流程抄走即用,今晚就能给你的 Agent 加上。

遇码开源社区 283

桌面应用自动保存不丢数据:dirty 标记 + 1.5 秒防抖落盘 +切换/关闭强制落盘的完整做法

—因为这时候弹什么提示用户都看不见了,不如不弹。

遇码开源社区 357

没有标准答案的 Agent 会话怎么打分:五维度机械检查评分模型的搭建方法

先给大家科普一个取数口径:交付形态的检查,落在"最后一次工具调用之后的文本"上。这跟 UI 的折叠语义一致——用户最终看到的、折叠后展开的那段结论,就是这段文本。前面中间过程的啰嗦不算,算的是最后交付出来的那段。空会话和纯文本会话(没有任何工具调用)不计分:没有可机械检查的取数行为,硬打分只会打出噪音。先定义回合和取数口径(最后一次工具调用之后的文本),再写任何检查。维度先少后多:从交付形态、用户验收这两头开始——前者是"交出来的东西对不对",后者是"用户买不买账"。

遇码开源社区 313

不用转场引擎做幻灯片转场:相机滑动、黑场淡入与真全屏的完整做法

给画布应用加放映转场,按这个顺序来:页面并排布局 → 每页加effect属性(SlideFadeNone,默认滑动)→ 翻页时由被进入页决定转场 → 滑动用相机插值 + smoothstep(300ms)→ 淡入用黑场遮罩盖住瞬间切换(140 / 80 / 260ms)→ 第一页的effect就是开场特效 → 真全屏 + 放映期间藏起所有编辑痕迹。转场不是"画面怎么切",而是"观众的注意力怎么被带到下一页"。

遇码开源社区 322

流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法

给流式调用加瞬态故障处理,按这个顺序来:先写标记分类函数并钉死正反测试 → 在流循环里用划清重试边界 → 复用一个指数退避循环(最多 4 次,每次都通知用户)→ 重试耗尽后给中文诊断 + 原文备查 → 没走重试的错误也要落结构化日志,带阶段、token、耗时。用户不需要知道是什么,他只需要知道"程序已经自动重试过了,现在该他做什么"。从这个标准反推,你就知道分类、重试、诊断每一环该写成什么样。

遇码开源社区 228

AI 画四格漫画人物总走样:模板套件 + 姿势库 + 反死板检查的完整做法

给 AI 绘图工具加"画漫画"能力,按这个顺序来:先做模板存取(save / stamp / list)+ 确定性盖章变换 → 再做剧本-分格-盖章-终检的工作流 → 最后加姿势套件、表情部件、反死板检查这些生动性机制。让 AI 画得一致,别训练它的记忆力,给它一套印章。记忆会漂移,文件不会。

遇码开源社区 371

给 Agent 的每条 SQL 执行记账:审计日志表 + 双份落盘的搭建方法

给 Agent 工具加审计日志,按这个顺序来:先定五个字段的 meta → 抽出wrap_query保证记录与执行逐字一致 → 成功失败双路径落日志 → logs 表 + transcript meta 双份落盘 → 用三个排查查询验证能查到东西。审计日志的价值不在"记了多少",而在"出事时能不能复现现场"。从这个标准反推,你就知道该记什么、不该记什么。

遇码开源社区 335

给无限白板做填充材质系统:五种填充 + 阴影 + 飞白参数的完整实现

填充系统的起点不是"五个 if",是一个枚举(FillStyle,在Hachure, // 纹:经典手绘排线,默认Dense, // 密:超密排线,近乎平铺但保留手绘质感Solid, // 实:平铺色块,粉笔板报的实心面板Watercolor, // 彩:水彩晕染,多层半透明排线 + 边缘洇色Gradient, // 渐变:垂直线性渐变,顶亮底暗为什么是枚举而不是"五个布尔开关"?因为填充是"互斥的材质选择"——一个形状同一时间只能是一种填充。

遇码开源社区 284

Agent 结论发出前先对账:值域对账验证层 + n=3 重复对照的搭建方法

这两天 Agent 圈还在卷"模型越来越聪明"——更大的参数、更长的上下文、更强的推理。可查数场景有个反直觉的现实:结论错了,往往不是模型算错了,而是它把 A 层级的东西填进了 B 层级的榜单,还写得自信满满。我没跟着换更大的模型。我干了另一件事——把我自己维护的开源数据智能体工作台 daw 里,2026 年 9 月 1 日那天落地的验证层(verify)完整拆了一遍。看完我可以负责任地告诉你三件事。第一,结构级错误(层级错配、口径错配)是可以用机械检查当场抓出来的,不用等用户来骂。

遇码开源社区 816

macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件

这两天桌面端 AI 应用越来越多,Mac 用户有个肌肉记忆:双指一捏,画布就该放大;双指一收,就该缩小。结果在我自己维护的开源无限手绘白板 boundless(Rust + GPUI)里,这个手势一度完全没反应——双指在触控板上搓到冒烟,画布纹丝不动。我没换 UI 框架。我干了另一件事——把 GPUI 0.2.2 的 mac 后端翻了一遍,找到这个手势死在了哪一层,然后给框架打了个 vendor 补丁。看完我可以负责任地告诉你三件事。第一,捏合手势死在两处:mac 后端的 NSView 根本没注册。

遇码开源社区 411

Agent 本地知识库的生命周期管理:写入三道守卫、读取两级兜底、定期体检

这两天 Agent 圈还在卷"记忆"——上下文窗口越开越大,Agent 还是记不住用户上周说过的话。于是大家去追更长的窗口、更贵的向量库,好像"记住"是个存储问题。我没跟着卷。我干了另一件事——把我自己维护的开源数据智能体工作台 daw 的本地知识库(OKF,Open Knowledge Files)机制完整拆了一遍。它不用向量库,就是一堆 Markdown 文件,但跑了两个月没腐烂:写不丢、读得到、改了可追溯、旧知识会体面退场。看完我可以负责任地告诉你三件事。

遇码开源社区 527

给无限白板加图片插入:在场景图里新增一种元素类型的完整套路

凡是做过画布类应用的人(白板、思维导图、流程图编辑器),都绕不开同一个问题:场景图里已经有矩形、线条、文字了,现在要加一种——比如图片。从哪下手?建模怎么建?渲染、交互、撤销、序列化要改多少地方?我自己维护的开源无限手绘白板 boundless(Rust + GPUI)去年 9 月就完整走了一遍这个流程:给白板加上图片嵌入。今天把这套实现拆开,它沉淀出了一套,五步,每一步都有明确的"为什么这样设计"。看完我可以负责任地告诉你三件事。第一,新增元素类型最难的不是渲染,是。

遇码开源社区 224
上一篇: 没有标准答案的 Agent 会话怎么打分:五维度机械检查评分模型的搭建方法
下一篇: 桌面应用自动保存不丢数据:dirty 标记 + 1.5 秒防抖落盘 +切换/关闭强制落盘的完整做法
遇码
遇码 遇码开源社区官方账号 遇码开源社区官方账号
博客等级 码龄11年 581粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值