拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sandcastle blank 模板 prompt.md 指南:从空骨架搭建自定义沙箱编码 Agent 的提示词工程

Sandcastle blank 模板 prompt.md 指南:从空骨架搭建自定义沙箱编码 Agent 的提示词工程 【免费下载链接】sandcastleOrchestrate sandboxed coding agents in TypeScript with sandcastle.run()项目地址https://gitcode.com/gh_mirrors/sandcastl/sandcastle点击查看免费下载导读Sandcastle 是一个用 TypeScript 编排沙箱化编码 Agent 的库blank模板是其最简起点src/templates/blank/prompt.md提供了一份仅含Context、Task、Done三个章节的提示词骨架配合 src/templates/blank/main.mts 即可驱动 Claude Code 在 Docker 等沙箱中完成一次编码任务。读完本文你将掌握如何基于这份骨架写出高可用的 Agent 提示词理解!command 动态上下文注入与promiseCOMPLETE/promise提前终止信号背后的源码级机制并学会用{{KEY}}参数占位符把提示词模板化、可复用化。一、blank 模板是什么最小可用的提示词骨架blank模板在init脚手架中描述为Bare scaffold — write your own prompt and orchestration见 src/templates/blank/template.json即裸脚手架提示词与编排逻辑全部由你自行填写。它生成的项目里最重要的两个文件是.sandcastle/prompt.md—— 来自 src/templates/blank/prompt.md定义 Agent 该做什么.sandcastle/main.mts—— 来自 src/templates/blank/main.mts用 JS API 控制 Agent 如何运行。prompt.md全文如下总共只有三个章节# Context !-- Use !command to pull in dynamic context. Commands run inside the sandbox. -- !-- Example: !git log --oneline -10 or !{{LIST_TASKS_COMMAND}} -- # Task !-- Describe what the agent should do. -- # Done !-- When the task is complete, output promiseCOMPLETE/promise to signal early termination. --这个骨架并不是一个可直接用的提示词而是一份结构化模板它把一段生产级 Agent 提示词应当具备的信息组织方式固化下来——先给上下文Context再下任务Task最后定义完成判据Done。注释中已经点出两个核心机制后面两节分别展开!command在沙箱内执行命令把输出注入提示词作为动态上下文promiseCOMPLETE/promiseAgent 输出该信号即可提前终止迭代循环。值得注意的是这份骨架并非只存在于模板目录。init命令使用的SKELETON_PROMPT常量见 src/templates.ts与prompt.md内容完全一致并额外给出了!gh issue list --label Sandcastle --json number,title 的真实示例。也就是说无论你通过模板文件还是通过脚手架常量拿到提示词得到的是同一套三章节约定。二、Context 章节用!command 注入沙箱内动态上下文# Context !-- Use !command to pull in dynamic context. Commands run inside the sandbox. --!command 是 Sandcastle 的shell 表达式shell expression语法一个前导!加反引号包裹的命令。提示词经过预处理时该表达式的标准输出会被原地替换进提示词再交给 Agent。关键约束写在注释里命令在沙箱内运行因此你可以放心地读取工作树里的 git 历史、文件状态等运行时才存在的信息。常见用法# Context 仓库最近的提交历史 !git log --oneline -10 当前分支 !git rev-parse --abbrev-ref HEAD执行时上述两行会被替换为命令的实际输出如最近的 10 条提交、分支名Agent 拿到的是最新鲜的上下文而非写死的内容。这正是blank模板注释里!git log --oneline -10 示例的用意。底层实现Preprocessor 的并行执行与超时保护!command 展开由 src/PromptPreprocessor.ts 的preprocessPrompt完成其行为可以从源码确认并行执行提示词中所有 shell 表达式通过Effect.all(..., { concurrency: unbounded })一次性并发执行多个命令互不等待src/PromptPreprocessor.ts30 秒硬超时每个命令套用Effect.timeoutOption(Duration.millis(30_000))超时抛PromptExpansionTimeoutError避免某个挂起命令卡死整个 runsrc/PromptPreprocessor.ts非零退出码即失败命令exitCode ! 0时抛PromptError报错信息包含退出码与 stderr遵循快速失败原则ADR 0020见 docs/adr/0020-prompt-expansion-fails-fast.mdToken 预算可见每个命令展开后按stdout.length / 4估算 token 数并打印command → ~N tokens日志src/PromptPreprocessor.ts让你能判断某个上下文注入是否过度消耗模型输入仅替换原始模板中的表达式预处理只执行被打标记的块——源码通过SHELL_BLOCK_MARKER\x01区分原始模板中的!command 与参数替换后混入的文本后者一律当作纯数据防止注入src/PromptArgumentSubstitution.ts。一条重要限制提示词必须来自promptFile才会执行 shell 表达式展开。若使用内联prompt: ...提示词会原样交付给 Agent不做任何替换与展开见 src/PromptResolver.ts 中source: inline | template的区分。三、Task 章节把该做什么写清楚# Task !-- Describe what the agent should do. --骨架只留了一行占位注释但这一章是整个提示词的实际工作量所在。基于骨架并参考仓库内其他成熟模板如 src/templates/parallel-planner/implement-prompt.md的写法一个可运行的 Task 章节通常包含# Task 1. 阅读 Context 中提供的提交历史确定本次改动范围。 2. 实现 XXX 功能遵循仓库现有代码风格。 3. 为新增逻辑补充测试并运行 npm test 确认全部通过。 4. 不要修改与本任务无关的文件。写 Task 时的实操建议拆成可核查的步骤每一条都是 Agent 可以自检、你也可以在 Done 阶段验证的原子动作明确约束与禁区如不修改无关文件不要运行破坏性命令Agent 会把这些当作硬性要求给出验收方式测试命令、lint 命令等可执行判据比含糊的保证质量更有效。四、Done 章节promiseCOMPLETE/promise提前终止机制# Done !-- When the task is complete, output promiseCOMPLETE/promise to signal early termination. --Done 章节约定的是完成信号当任务完成时Agent 在输出中写入promiseCOMPLETE/promiseSandcastle 检测到该子串后提前结束迭代循环不必等到maxIterations跑满。这份骨架把何时算完成显式写进提示词是避免 Agent 空转的关键。从源码可以确认它的默认值与行为默认信号const DEFAULT_COMPLETION_SIGNAL promiseCOMPLETE/promise;src/Orchestrator.ts可自定义run()的completionSignal选项接受字符串或字符串数组匹配方式为对 Agent 输出做includes子串判断src/run.ts因此你完全可以定义自己的信号如completionSignal: [promiseDONE/promise, promiseFAILED/promise]完成宽限期观察到信号后默认再等 60 秒让 Agent 进程自然退出期间仍继续捕获 token 用量、result事件等尾部输出若因gh/git 子进程或长驻 MCP 服务器占用 stdout 而迟迟不退Sandcastle 会强制完成本轮并给出警告src/run.ts对应 ADR 0019见 docs/adr/0019-completion-timeout-for-hanging-process.md空闲超时兜底即使信号缺失Agent 连续 600 秒默认idleTimeoutSeconds无输出也会被判为失败双层防护保证编排不会无限挂起src/Orchestrator.ts。这条机制在测试中被反复验证例如Orchestrator.test.ts中All done. promiseCOMPLETE/promise的输出即触发提前终止并断言result.completionSignal promiseCOMPLETE/promisesrc/Orchestrator.test.tsInitService.test.ts还验证了脚手架生成的提示词必然包含该信号src/InitService.test.ts。五、把骨架模板化{{KEY}}参数替换blank模板的骨架刻意保持为空但你完全可以像仓库其他模板那样用{{KEY}}占位符把提示词参数化实现一份提示词、多次运行。占位符替换由 src/PromptArgumentSubstitution.ts 的substitutePromptArgs实现规则如下占位符语法{{KEY}}正则/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/gsrc/PromptArgumentSubstitution.ts参数来源run()的promptArgs: PromptArgs值为string | number | booleansrc/PromptArgumentSubstitution.ts缺失即失败提示词引用了占位符但promptArgs未提供对应值或值为 null/undefined直接抛PromptError避免 Agent 拿到未替换的模板src/PromptArgumentSubstitution.ts多余参数告警提供了参数但提示词未引用会输出 warning 提示src/PromptArgumentSubstitution.ts内置参数不可覆盖SOURCE_BRANCH与TARGET_BRANCH由 Sandcastle 自动注入试图通过promptArgs覆盖会报错src/PromptArgumentSubstitution.ts仅支持 promptFile与 shell 表达式一致{{KEY}}替换同样只在promptFile模式下生效内联prompt会原样传给 AgentvalidateNoArgsWithInlinePrompt会直接拒绝同时传入promptArgs的做法src/PromptArgumentSubstitution.ts。结合模板参数的示例把骨架升级为可复用模板# Context 分支 {{SOURCE_BRANCH}} 上的最近提交 !git log --oneline -10 # Task 修复 issue #{{ISSUE_NUMBER}} 描述的问题并补充回归测试。 # Done 完成时输出 promiseCOMPLETE/promise。对应编排代码import { run, claudeCode } from ai-hero/sandcastle; import { docker } from ai-hero/sandcastle/sandboxes/docker; await run({ agent: claudeCode(claude-opus-4-8), sandbox: docker(), promptFile: ./.sandcastle/prompt.md, promptArgs: { ISSUE_NUMBER: 42 }, });注意!git log ... 与{{SOURCE_BRANCH}}可以共存参数先被替换随后 shell 表达式在沙箱内展开最终提示词里不存在任何占位符。六、从骨架到首次运行init 脚手架与编排入口blank模板不是孤立存在的它的上下游配套如下生成运行npx ai-hero/sandcastle init选择blank模板后脚手架把 src/templates/blank/prompt.md 与 src/templates/blank/main.mts 复制到项目的.sandcastle/目录复制逻辑见 src/InitService.ts 附近的copyTemplateFiles。定制init完成后的Next steps提示明确要求Read and customize .sandcastle/prompt.md to describe what you want the agent to dosrc/InitService.ts随后定制main.mts并把sandcastle: npx tsx .sandcastle/main.mts写进package.jsonscriptssrc/InitService.ts。编排入口模板自带的 src/templates/blank/main.mts 是最小编排示例import { run, claudeCode } from ai-hero/sandcastle; import { docker } from ai-hero/sandcastle/sandboxes/docker; // Blank template: customize this to build your own orchestration. // Run this with: npx tsx .sandcastle/main.mts // Or add to package.json scripts: sandcastle: npx tsx .sandcastle/main.mts await run({ agent: claudeCode(claude-opus-4-8), sandbox: docker(), promptFile: ./.sandcastle/prompt.md, });运行npm run sandcastle或npx tsx .sandcastle/main.mts。在这个入口里promptFile指向的就是你定制过的prompt.md。run()会先经 src/PromptResolver.ts 读取文件并标记为template源随后依次完成{{KEY}}参数替换与!command 展开最终把成品提示词交给沙箱内的 Agent展开位置见 src/Orchestrator.ts。Sandcastle 随后负责沙箱生命周期、git 分支策略与提交回合并你只需关注提示词本身。七、对照其他模板骨架的可扩展方向仓库内其他模板展示了这份三章节骨架的进阶形态可作定制参考src/templates/simple-loop/prompt.md在骨架基础上加入!{{LIST_TASKS_COMMAND}} 动态任务列表、git 历史注入与明确的完成条件是单 Agent 简单循环的标准写法src/templates/parallel-planner/implement-prompt.md同一骨架在多 Agent 流水线planner → implementer → merger中复用!git log -n 10 --format... 注入结构化提交历史src/templates/sequential-reviewer/implement-prompt.md展示 review 场景下!git diff {{TARGET_BRANCH}}...{{BRANCH}} 的 diff 上下文注入。它们的共同规律是Context 章节尽量注入运行时的真实数据Task 章节明确步骤与约束Done 章节统一用promiseCOMPLETE/promise收尾。掌握了 blank 骨架你就掌握了 Sandcastle 全部内置模板的提示词组织范式可以在此基础上自由组合!command、{{KEY}}与自定义completionSignal构建属于自己的多 Agent 编排流水线。小结blank模板的prompt.md是 Sandcastle 提示词工程的最小单元Context章节负责用!command 在沙箱内注入动态上下文并行执行、30 秒超时、非零退出码快速失败Task章节承载实际任务描述Done章节通过promiseCOMPLETE/promise实现提前终止默认信号、60 秒宽限期、600 秒空闲兜底。在此基础上叠加{{KEY}}参数替换即可把单次提示词升级为可复用的模板。从npx ai-hero/sandcastle init到npm run sandcastle整条链路在 src/InitService.ts、src/PromptResolver.ts、src/PromptPreprocessor.ts、src/Orchestrator.ts 中均有清晰实现可循是一套从空骨架到自定义沙箱 Agent的完整、可验证的实践路径。赞分享【免费下载链接】sandcastleOrchestrate sandboxed coding agents in TypeScript with sandcastle.run()项目地址https://gitcode.com/gh_mirrors/sandcastl/sandcastle点击查看免费下载相关推荐LMCache源码解析KV缓存层如何让长上下文推理跳过Prefill完整指南LMCache源码解析KV缓存层如何让长上下文推理跳过Prefill完整指南 LMCache 是一个面向 LLM 推理的 KV 缓存层 它把推理引擎如Quivr提示工程自定义提示词模板和优化技巧Quivr提示工程自定义提示词模板和优化技巧 引言为什么提示工程对AI助手至关重要 在人工智能助手领域提示工程Prompt Engineering是决人工智能AI 应用大模型RAG后端前端baoyu-infographic 提示词模板工程从 base-prompt.md 到生产级信息图生成baoyu infographic 提示词模板工程从 base prompt.md 到生产级信息图生成 导读 base prompt.md 是 baoyu iAI 技能AI 插件上一篇终极AI绘画指南stable-diffusion-webui神经渲染实时图像生成全攻略下一篇Guava集合工具类Iterables、Lists、Sets与Maps深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表