Windmill App 模式 AI 聊天安全与效率评审:七大改进方向及源码级解读
Windmill App 模式 AI 聊天安全与效率评审七大改进方向及源码级解读【免费下载链接】windmillOpen-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x vs Airflow). Open-source alternative to Retool and Temporal.项目地址: https://gitcode.com/GitHub_Trending/wi/windmillApp Mode 是 Windmill 中以 AI 会话驱动的方式构建、修改前端应用、后端 runnable 与 datatable 的交互模式。本文围绕仓库中的内部评审文档 docs/app-mode-ai-chat-review.md系统梳理该文档提出的七大高价值改进方向——危险工具确认、datatable SQL 安全强制、按需上下文、上下文生命周期、schema 刷新、建表策略持久化与评测覆盖——并结合 ai_evals 评测框架、datatable SQL 引擎 与 App 模式用例 等源码证据说明每项改进的动机、现状与落地路径。读完本文你将理解 Windmill App 模式 AI 聊天的安全边界、上下文管理机制以及如何用确定性校验与 LLM 评判双重手段验证这些行为。评审文档定位聚焦最高价值的下一步docs/app-mode-ai-chat-review.md是一份精炼的内部评审笔记明确说明其定位是只追踪让 app-mode AI chat 更安全、更高效的最高价值下一步This note only tracks the highest-value next steps。它不是完整的设计文档而是以行动清单形式给出七条改进建议。这些建议全部围绕一个核心矛盾AI 代理在 App 模式中拥有修改文件、执行后端代码、执行 datatable SQL 的能力必须在不牺牲效率的前提下把这些能力关进安全的笼子里。仓库中与之配套的工程事实包括App 模式评测通过 ai_evals/modes/app.ts 中的createAppModeRunner运行每次尝试依次执行真实生产路径 → 确定性校验 → LLM 评判三步见 ai_evals/README.mdApp 模式用例存放在 ai_evals/cases/app.yaml可用validate、judgeChecklist、runtime.maxTurns、runtime.appContext等字段表达约束datatable 相关的三类工具list_datatables、get_datatable_table_schema、exec_datatable_sql在评测中由内存版 SQL 引擎支撑ai_evals/adapters/frontend/datatableSqlEngine.ts在生产前端由 frontend/src/lib/components/copilot/chat/datatableTools.ts 提供实现。下文逐条展开评审文档的七大建议并结合源码说明为什么需要与目前做到了哪一步。一、为危险工具增加确认机制建议内容评审文档的第一条建议是在文件写入、文件删除、后端 runnable 写入/删除、datatable SQL 执行等危险操作前要求用户显式确认并在应用动作前展示有意义的 diff 或精确的 SQL 文本。为什么危险App 模式中 AI 代理的操作对象不是纯前端代码而是会持久化、会被后端执行的对象前端文件如 app-test6-file-manager-rename-save-cancel 用例所示重命名、保存、取消这类操作直接影响/index.tsx、/components/FileItem.tsx等文件内容后端 runnable用例app-test8-inventory-tracker-search-deleteai_evals/cases/app.yaml#L86-L114要求listInventory、addInventory、deleteInventory等 inline runnable 存在且类型正确这些 runnable 是真正会执行的数据访问逻辑datatable 持久化app-datatable-persistent-notes用例ai_evals/cases/app.yaml#L146-L210验证 AI 使用wmill.datatable的select/insert/delete访问真实表public.notes。一旦 AI 误判或幻觉一次无确认的写操作就可能覆盖用户数据。因此评审建议执行前展示 diff 或精确 SQL让用户对即将发生什么有最终否决权。评测侧的对应约束虽然确认 UI本身属于前端交互但评测框架已能确定性校验相关行为。以app-datatable-persistent-notes为例它通过forbiddenAppContent禁止localStorage、sessionStorage、indexedDB等不安全持久化方案通过requiredToolsUsed强制 AI 在写代码前先调用list_datatables和get_datatable_table_schema检查既有 schemaai_evals/cases/app.yaml#L198-L200——这正体现了先看清现状再动手的安全原则。validate字段requiredFrontendPaths、requiredBackendRunnableKeys、requiredBackendRunnableTypes、requiredDatatables则把危险操作的对象收敛为可断言的清单见 ai_evals/README.md 的 Case Format 一节。二、在代码层面强制 datatable SQL 安全建议内容评审文档第二条建议直指一个常见误区不要依赖提示词prompt来约束 SQL 安全。应当在执行前对语句进行分类默认阻止 DDL除非允许建表并对 DDL、DML 以及会把数据回传给模型的行返回型读取row-returning reads要求确认。现状评测引擎的尽力而为定位从源码看当前评测环境中的 SQL 执行是一个刻意保持最小化的内存引擎文件头注释明确写道This is NOT a real SQL implementationai_evals/adapters/frontend/datatableSqlEngine.ts#L2-L8。applyDatatableSql按语句首词分类处理SELECT/WITH→ 返回表中全部行不做 WHERE 过滤、投影、连接、聚合CREATE TABLE、DROP TABLE、INSERT INTO、UPDATE、DELETE FROM→ 原地修改内存中的 datatable 种子数据无法解析的语句 →无副作用地返回成功never throws行为评测断言的是发出了正确的语句而非其精确的数据效果ai_evals/adapters/frontend/datatableSqlEngine.ts#L10-L16。这意味着评测场景中写后可见依赖引擎的原地变更——CREATE/DROP/INSERT/UPDATE/DELETE会改变种子数据后续list_datatables、get_datatable_table_schema、SELECT或information_schema查询都能反映出来这正是阻止模型在重复查询验证写入时陷入循环的关键ai_evals/README.md#L183-L198。生产侧的差距与建议指向引擎同时说明了其局限WHERE只支持col value的 AND 谓词UPDATE/DELETE 遇到无法解析的 WHERE 时影响零行而非全表ai_evals/adapters/frontend/datatableSqlEngine.ts#L13-L16。生产侧则对应 frontend/src/lib/components/copilot/chat/datatableTools.ts 中的真实工具实现其测试见 datatableTools.test.ts。评审文档的意图正是把哪些 SQL 语句允许执行、哪些必须确认、哪些会把敏感数据回传给模型的判定逻辑写进代码而非提示词从机制上杜绝模型被诱导绕过约束。三、默认上下文按需提供demand-driven建议内容第三条建议要求控制进入 prompt 的上下文规模优先使用用户选中的上下文selected context和定向读取而非宽泛的目录扫描文件列表保持仅元数据metadata-only默认不发送完整 datatable schemaSDK/参考材料除非被请求或任务需要否则不进入基础 prompt。评测中的相关证据App 模式评测已经为此准备了专门的token 压力用例app-token-baseline-large-app-small-edit对一个大型 app 做一行标题修改maxTurns限制为 8检验模型在上下文膨胀场景下仍能精准完成小改动app-token-many-datatable-context通过runtime.appContext.additional注入 10 张 datatableanalytics.event_log_01…event_log_08、operations.ops_record_13/14并要求datatableTableCountAtLeast: 18——在大量 datatable schema 已入上下文的情况下模型必须不新建表地完成任务app-token-large-datatable-discovery同样是高 datatable 数量场景验证复用既有配置而非重建。这些用例直接呼应避免默认发送完整 schema的建议当 schema 数量巨大时上下文消耗与模型出错概率都会上升按需读取如先list_datatables再对用到的表调get_datatable_table_schema才是可持续的默认策略。上下文消耗可观测评测运行器会记录finalContextTokensai_evals/adapters/frontend/core/app/appEvalRunner.ts#L41、ai_evals/modes/app.ts#L51历史记录中也包含每次尝试的平均 token 使用量averageTokenUsagePerAttempt、averageTokenUsagePerPassedAttempt见 ai_evals/README.md 的 Results And Artifacts 一节。这说明上下文是否精简已经可以被量化跟踪评审文档建议的可见的近似上下文大小指示器正是把这种观测带到用户界面。四、改进 App 上下文生命周期建议内容第四条建议涉及引用上下文如datatable、runnable、file的生命周期管理默认情况下上下文按消息生效per-message对需要跨消息持续存在的上下文提供显式的固定/置顶pinning能力文件和 runnable 内容懒加载lazy-load避免一引用就全量塞入增加一个可见的近似上下文大小指示器让用户能发现 prompt 膨胀。评测侧的支撑结构App 模式的用例格式已支持在runtime.appContext.additional中声明随会话携带的 datatable 引用见app-token-many-datatable-context的写法ai_evals/cases/app.yaml#L259-L299运行器通过appEvalRunner的appContext参数注入ai_evals/adapters/frontend/core/app/appEvalRunner.ts#L48、ai_evals/modes/app.ts#L34。这为哪些上下文应持久、哪些应随消息丢弃的语义提供了可编程的测试载体。设计权衡按消息生效避免了上下文无界累积每个新消息只携带与当前请求相关的引用懒加载把引用与内容解耦引用时只占少量 token真正使用该文件/runnable 时才读取全文上下文指示器把成本显性化用户可以对是否值得携带这个大文件做出判断。五、变更后刷新 datatable 上下文建议内容第五条建议在数据面板data-panel变更之后、以及 AI 创建新表之后刷新表元数据避免后续工具调用与用户可见上下文使用过期的 schema 数据stale schema data。为什么必须刷新评测引擎的设计已经证明了陈旧 schema的危害注释明确指出如果写操作不可见模型重新查询验证写入时会看到过期的种子数据从而断定写入失败直到耗尽回合数ai_evals/adapters/frontend/datatableSqlEngine.ts#L4-L8。同理如果 AI 刚通过CREATE TABLE建了新表而后续get_datatable_table_schema仍返回旧元数据模型的后续调用就会基于错误认知继续操作。引擎为此专门实现了系统目录合成catalog synthesis当模型用information_schema.tables、information_schema.columns或pg_tables验证CREATE/DROP时返回的是当前真实的表/列集合而非回退数据ai_evals/adapters/frontend/datatableSqlEngine.ts#L93-L130。评测用例app-datatable-persistent-notes同时用datatableTableCountExactly: 1和requiredDatatables断言复用了public.notes而没有新建表ai_evals/cases/app.yaml#L193-L197这类断言正是为了防止模型基于过期 schema 重复建表。六、显式持久化AI 建表策略建议内容第六条建议将是否允许 AI 创建表存为显式的 app 设置而不是从是否存在 datatable 配置这种旁证推断。推断式策略的隐患从用例语义可以反推现状app-token-many-datatable-context与app-token-large-datatable-discovery的提示词都明确写有Do not create any new tablesai_evals/cases/app.yaml#L255、ai_evals/cases/app.yaml#L314并用datatableCountAtLeast/datatableTableCountAtLeast/judgeChecklist三重校验未新建表。这说明当前是否允许建表很大程度上依赖提示词与用例约束属于文档所批评的从配置存在性推断策略。显式设置的价值在于策略是声明式的、可审计的、与提示词解耦的。用户可以针对每个 app 明确关闭建表能力评测与校验逻辑则直接读取该设置做确定性判断而不是依赖模型对自然语言提示的遵守程度。七、为上述行为增加聚焦的评测覆盖建议内容第七条建议把前六条翻译成可执行的验证计划为确认要求confirmation requirements、datatable SQL 策略执行、选中上下文最小化、过期 schema 刷新行为提供针对性的 app-mode 评测在不可行处使用更低层级的测试。仓库已有的评测基建Windmill 的 App 模式评测基建已经相当完整可直接承载这些新用例模式运行器ai_evals/modes/app.tsconcurrency: 5、judgeThreshold: 80加载 fixture、执行真实生产路径、运行确定性校验validateAppState、产出 artifact用例格式ai_evals/README.md#L106-L199initialfixture、runtime.maxTurns、validate规则requiredFrontendPaths、requiredBackendRunnableKeys、requiredDatatables、forbiddenAppContent等、toolExpectrequiredToolsUsed/forbiddenToolsUsed/toolCallArgs与judgeChecklist运行方式ai_evals/README.md#L33-L81cd ai_evals bun run cli -- cases app # 列出 app 模式用例 bun run cli -- run app app-test1-counter-create --model sonnet bun run cli -- run app --runs 3 --verbose支持--skip-judge只做确定性校验、--record把通过率与 token 用量追加到ai_evals/history/app.jsonl低层级测试SQL 引擎本身有独立测试 datatableSqlEngine.test.tsmock 后端有 mockBackendDatatables.test.ts确定性校验器有 validators.test.ts——确认要求、SQL 策略、上下文最小化、schema 刷新均可拆到这一层做低成本回归。建议的用例落地形态基于现有格式前六条建议大致可映射为以下评测形态评审建议对应评测/测试形态危险工具确认用toolExpect断言模型在写文件/删 runnable 前调用预览/确认类工具judgeChecklist校验 diff 或 SQL 文本被展示SQL 安全强制用toolCallArgs如fieldMustBeAbsent断言 DDL/DML 调用受策略约束低层级测试直接喂给 SQL 引擎各种语句分类按需上下文用app-token-*系列压力用例 finalContextTokens指标跟踪上下文消耗上下文生命周期在runtime.appContext中声明持久/临时上下文校验模型不把临时上下文带过回合schema 刷新校验CREATE TABLE后立即get_datatable_table_schema能看到新表引擎已支持见 datatableSqlEngine.ts建表策略显式化新增设置字段确定性校验直接读设置值而非依赖提示词总结从评审清单到工程落地docs/app-mode-ai-chat-review.md的七条建议构成了一条清晰的演进主线先加确认防误操作→ 再代码级强制 SQL 安全防绕过→ 然后压缩与管控上下文提效率→ 最后把生命周期、刷新、策略全部显式化并纳入评测闭环。从仓库现状看安全侧评测引擎已具备语句分类与写后可见的基础datatableSqlEngine.ts生产侧工具实现在 datatableTools.ts缺的是确认 UI与执行前策略判定效率侧token 压力用例与finalContextTokens指标已经就位ai_evals/cases/app.yaml#L234-L326、appEvalRunner.ts缺的是 per-message 上下文语义、懒加载与可视化指示器策略侧建表与否目前仍主要靠提示词与用例约束表达显式 app 设置是最直接的收敛方向验证侧App 模式评测的确定性校验 LLM 评判双轨机制ai_evals/README.md已能承载上述所有新行为的回归。这份文档的价值正在于它没有停留在泛泛的安全讨论而是给出了可逐条认领、可评测验证的工程任务清单——这也是 Windmill 把 AI 生成能力做得可测试、可审计的典型工作方式。后续若这些建议在ai_evals/cases/app.yaml与前端工具实现中落地读者可通过新增用例与对应测试持续追踪其进展。【免费下载链接】windmillOpen-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x vs Airflow). Open-source alternative to Retool and Temporal.项目地址: https://gitcode.com/GitHub_Trending/wi/windmill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考