Fabric REST API 模式变量(Pattern Variables)实战指南:从 /chat 请求到模板替换的完整链路 AI 应用人工智能提示工程CLI本地部署【免费下载链接】FabricFabric is an open-source framework for augmenting humans using AI. It provides a modular system for solving specific problems using a crowdsourced set of AI prompts that can be used anywhere.项目地址https://gitcode.com/GitHub_Trending/fa/Fabric点击查看免费下载在 Fabric 的 REST API 中variables字段是让同一个模式pattern按需定制化运行的关键机制你无需为每种语言、每个角色或每套输出要求复制一份提示词只需向POST /chat端点传入一个键值映射服务端就会在把提示词发送给 AI 模型之前用 Go 模板系统完成{{变量名}}占位符的替换。本文以官方示例文档 internal/server/docs/API_VARIABLES_EXAMPLE.md 为骨架结合 internal/server/chat.go、internal/plugins/db/fsdb/patterns.go 与 internal/plugins/template/template.go 的源码实现完整讲解请求写法、变量替换原理、安全边界与故障排查读完后你将能熟练通过 REST 调用让任意模式按需生成不同结果。一、先厘清概念什么是模式变量Fabric 的模式pattern是存放在data/patterns/name/system.md中的提示词模板模板里可以出现两类占位符{{变量名}}由调用方通过variables映射传入具体值{{input}}用户输入内容由服务端自动填入不允许出现在variables映射中。在 CLI 中模式变量通过-vname:value传入见 internal/cli/flags.go在 REST API 中它们统一封装进每个 prompt 的variables对象。两者的底层走的是同一套模板引擎因此 REST 调用能够享受到与 CLI 完全一致的能力——包括插件plugin与扩展extension令牌。二、最小可运行示例用 translate 模式实战官方示例文档给出了一个完整可运行的请求调用translate模式把一段英文自我介绍翻译成法语。2.1 完整请求体{ prompts: [ { userInput: Hello my name is Kayvan, patternName: translate, model: gpt-5.2, vendor: openai, contextName: , strategyName: , variables: { lang_code: fr } } ], language: en, temperature: 0.7, topP: 0.9, frequencyPenalty: 0.0, presencePenalty: 0.0 }2.2 模式内容中的占位符translate模式的真实内容位于 data/patterns/translate/system.md其中关键片段如下You are an expert translator who takes sentences or documentation as input and do your best to translate them as accurately and perfectly as possible into the language specified by its language code {{lang_code}}, e.g., en-us is American English or ja-jp is Japanese. ... - Translate the document as accurately as possible keeping a 1:1 copy of the original text translated to {{lang_code}}. # INPUT INPUT:注意该文件在# INPUT标题下实际是以{{input}}占位符收尾的示例文档以{{input}}表示该位置。也就是说这个模式一共需要两个占位符{{lang_code}}由变量映射提供{{input}}由userInput字段提供。2.3 替换过程按示例文档与源码可归纳为以下 4 步服务端按patternName从模式库加载translate模式的原始内容加载逻辑见 internal/plugins/db/fsdb/patterns.go{{lang_code}}被替换为variables映射中的fr{{input}}被替换为userInput字段的值Hello my name is Kayvan处理完成后的完整提示词被发送给指定的 AI 模型vendor: openai、model: gpt-5.2。2.4 预期结果模型收到的指令等价于把这句英文精确翻译成法语语言代码 fr因此正常响应类似Bonjour, je mappelle Kayvan.三、用 curl 实测启动服务端后默认监听:8080启动命令为fabric --serve详见 docs/rest-api.md可以直接用 curl 验证上述流程curl -X POST http://localhost:8080/api/chat \ -H Content-Type: application/json \ -d { prompts: [ { userInput: Hello my name is Kayvan, patternName: translate, model: gpt-5.2, vendor: openai, variables: { lang_code: fr } } ], temperature: 0.7 }两点说明示例文档中使用的路径是/api/chat这是 Ollama 兼容模式fabric --serveOllama提供的端点路由注册见 internal/server/ollama.go标准 REST 服务的聊天端点为POST /chat同样接受variables字段路由注册见 internal/server/serve.go。两者都需要Content-Type: application/json请求头。响应以 SSEServer-Sent Events流式返回每行是一个data: {...}JSON 事件事件类型包括content内容块、usage用量、error错误与complete流结束具体编码见 internal/server/chat.go。四、多变量模式一个提示词多组参数对于需要多个变量的模式只需在variables映射中同时给出所有键。示例文档给出了custom_analysis模式的用法{ prompts: [ { userInput: Analyze this business model, patternName: custom_analysis, model: gpt-5.2, variables: { role: expert consultant, experience: 15, focus_areas: revenue, scalability, market fit, output_format: bullet points } } ] }对应的模式模板可以写成You are a {{role}} with {{experience}} years of experience. Focus on: {{focus_areas}}. Present the analysis as {{output_format}}. {{input}}这样一次请求即可把role、experience、focus_areas、output_format四个占位符一次性填满模板中的顺序与 JSON 中的键顺序无关。五、请求结构拆解PromptRequest 与 ChatRequest要深入理解变量如何进入处理链路需要看服务端的请求结构体定义internal/server/chat.goJSON 字段Go 字段类型说明userInputUserInputstring用户输入将填入{{input}}vendorVendorstringAI 供应商如openai、anthropic、ollamamodelModelstring模型名如gpt-5.2patternNamePatternNamestring要应用的模式名可选contextNameContextNamestring前置上下文名可选strategyNameStrategyNamestring推理策略名可选sessionNameSessionNamestring多轮会话名可选variablesVariablesmap[string]string模式变量键值映射可选顶层ChatRequest还包含language、modelContextLength上下文窗口大小以及嵌入的domain.ChatOptionstemperature、topP、frequencyPenalty、presencePenalty、thinking、search等生成参数。在处理时buildPromptChatRequestinternal/server/chat.go会把每个 prompt 的字段平铺成一个domain.ChatRequest其中PatternVariables直接取自prompt.Variables——这就是变量进入下游的唯一通道。对应的单元测试 internal/server/chat_test.go 验证了Variables映射在转换过程中被原样保留。六、变量替换的底层实现一次单遍扫描6.1 调用链REST 请求中的变量最终会汇聚到PatternsEntity.GetApplyVariablesinternal/plugins/db/fsdb/patterns.goloadPattern(source) → 从磁盘/数据库读取模式原始文本 applyVariables(pattern, variables, input) → 执行模板替换applyVariables的实现internal/plugins/db/fsdb/patterns.go有几个值得注意的细节输入哨兵机制先用template.InputSentinel临时替换{{input}}再执行模板引擎。这是为了防止用户输入内容里恰好包含{{...}}形式的文本时被误当作模板变量展开模板应用调用template.ApplyTemplateREST 服务场景下是受限版本ApplyTemplateNoSystemPlugins见下文安全边界哨兵还原处理完成后把InputSentinel还原为用户输入原文。6.2 单遍扫描解析器模板引擎的核心是applyTemplateinternal/plugins/template/template.go。它从左到右只扫描一次原始模板文本遇到{{时压栈记录 token 起点遇到}}时弹出并解析闭合的 token每个 token 只解析一次解析结果作为字面文本写入输出不会再被二次扫描——因此变量值里若包含{{plugin:sys:env:NAME}}之类的字符串会保持为字面文本而不会触发插件执行支持嵌套 token如{{plugin:text:upper:{{name}}}}内层 token 先于外层解析支持三花括号 Mustache 形式{{{name}}}此时最外层花括号作为字面文本输出。6.3 变量解析与缺失报错resolveTokeninternal/plugins/template/template.go对普通变量做查表替换body input或body InputSentinel时返回用户输入否则在variables映射中查找找到则返回对应值找不到且是普通标识符时返回错误missing required variable对应 i18n 键template_missing_required_variable这正是模式要求变量而请求未提供时客户端会收到错误事件的原因若 body 形如{{a}{b}}单花括号文本常见于 LaTeX则视为字面文本保留。从源码结构看这一设计保证了请求中漏传模式所需的任何变量都会在发送给模型之前被明确拒绝而不是带着未替换的{{变量名}}占位符发给模型。七、模板系统能力变量、插件与扩展REST 变量并非只支持简单替换。模板系统详见 internal/plugins/template/README.md支持三类令牌7.1 变量替换Hello {{name}}! Current role: {{role}}7.2 插件调用语法为{{plugin:namespace:operation:value}}例如{{plugin:text:upper:hello}} - HELLO {{plugin:datetime:now}} - 2024-11-20T15:04:05Z {{plugin:datetime:rel:-1d}} - 2024-11-19 {{plugin:sys:env:HOME}} - /home/user7.3 扩展调用语法为{{ext:name:operation:value}}扩展从~/.config/fabric下的注册表加载见 internal/plugins/template/template.go 与 extension_manager.go。7.4 REST 服务的插件安全边界重要REST 服务在启动时会把PatternsEntity.NoSystemPlugins置为true见 internal/server/serve.go从而让模板引擎走ApplyTemplateNoSystemPluginsinternal/plugins/template/template.go。其约束为只允许text与datetime两个插件命名空间sys、file、fetch插件令牌以及任何{{ext:...}}扩展令牌会直接返回错误。官方文档 docs/rest-api.md 解释了原因由于客户端可以通过POST /patterns/:name保存模式若放开系统插件恶意保存的模式就能在服务端读取环境变量与文件、发起 URL 请求或运行扩展。CLI 不受此限制会运行全部插件。因此为 REST 场景设计模式时不要在模板中依赖系统插件或扩展令牌。八、REST API 专属的变量应用端点POST /patterns/:name/apply除了在聊天请求中传变量REST API 还提供了一个纯模板渲染端点POST /patterns/:name/apply路由注册见 internal/server/patterns.go处理逻辑见同一文件的ApplyPatterninternal/server/patterns.go。其请求体结构PatternApplyRequest为{ input: Hello world, variables: {lang_code: es} }该端点有三个特色行为Query 参数与 body 变量合并URL 查询参数会被收集进变量映射body 中的variables优先级更高通过maps.Copy覆盖调用同一底层函数最终执行GetApplyVariables(name, variables, input)与/chat的变量处理完全一致输入兜底拼接如果模式中没有{{input}}占位符InputUsed false且请求提供了input会把输入追加到模式末尾保证响应契约一致。实测命令摘自 docs/rest-api.mdcurl -X POST http://localhost:8080/patterns/translate/apply \ -H Content-Type: application/json \ -d { input: Hello world, variables: {lang_code: es} }该端点对开发者调试、批量渲染提示词等场景非常实用因为它在发送模型之前就能让你看到替换后的完整提示词。九、与 CLI 变量的对照CLI 与 REST 使用同一套模板引擎两者的变量能力对等场景CLI 写法REST 写法简单变量echo Hello {{name}}! \| fabric -vname:Worldvariables: {name: World}多变量fabric -vrole:expert -vpoints:30variables: {role: expert, points: 30}输入替换管道输入userInput: ...CLI 侧还提供--input-has-vars对用户输入执行变量替换且输入中的插件/扩展令牌保持字面文本与--no-variable-replacement禁用变量替换两个开关REST 请求目前没有对应字段。工作流文件internal/cli/workflow.go的每个步骤也支持variables映射说明变量机制贯穿 CLI、工作流与 REST 三个入口。十、注意事项与故障排查{{input}}是保留占位符不要把它写进variables映射它由userInput字段自动填充示例文档的 Implementation Details 部分明确说明。缺失变量会报错若模式模板引用了请求未提供的变量服务端会在发送前失败。从测试用例 internal/server/chat_test.go 可以看到这类流开始前的失败会通过 SSE 的error事件上报给客户端且不会再发送complete事件。模式名与上下文的合法性校验HandleChat会对每个 prompt 的patternName、contextName、sessionName做校验路径样式的模式名以/、\、~、.开头会被拒绝internal/server/chat.go防止把 CLI 的从文件读模式能力暴露给 REST 客户端。JSON 内容类型/chat与/patterns/:name/apply都要求Content-Type: application/json否则返回415。认证启用--api-key后所有业务请求需携带X-API-Key头实现见 internal/server/auth.goSwagger 文档端点/swagger/*公开可访问。REST 模板受限服务端只运行text与datetime插件模板若包含sys/file/fetch插件或扩展令牌/chat与/patterns/:name/apply都会返回错误——这是刻意的安全设计而非功能缺失。总结Fabric REST API 的模式变量机制本质上是把提示词模板与参数输入解耦variables映射提供命名参数userInput提供正文输入二者经 internal/plugins/template/template.go 的单遍扫描模板引擎合成最终提示词再交给模型流式返回。理解 internal/plugins/db/fsdb/patterns.go 的GetApplyVariables调用链与 REST 服务的插件安全边界后你既能写出参数化、可复用的高质量模式也能快速定位缺失变量模板被安全策略拒绝等常见问题让 Fabric 的 REST 服务真正成为你的可编程 AI 提示词网关。赞分享AI 应用人工智能提示工程CLI本地部署【免费下载链接】FabricFabric is an open-source framework for augmenting humans using AI. It provides a modular system for solving specific problems using a crowdsourced set of AI prompts that can be used anywhere.项目地址https://gitcode.com/GitHub_Trending/fa/Fabric点击查看免费下载相关推荐Phoenix 请求生命周期实战指南从路由到模板的完整链路解析Phoenix 请求生命周期实战指南从路由到模板的完整链路解析 导读 本篇指南以 Phoenix 框架的请求生命周期Request Life cycle为后端Nuclei 调试完全指南从模板请求到 DSL 变量的全链路排查方法Nuclei 调试完全指南从模板请求到 DSL 变量的全链路排查方法 导读 本文是 Nuclei 官方调试指南 DEBUG.md https://link网络安全应用安全漏洞扫描REST Client请求变量终极指南实现API测试链式调用的完整教程REST Client请求变量终极指南实现API测试链式调用的完整教程 想要在VS Code中实现高效API测试REST Client插件通过强大的请求变量开发工具接口测试上一篇Grasscutter资源包部署指南15分钟配好资源目录并启动服务器下一篇5 分钟跑通 Pencil免费开源原型与线框图工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考