Serena 怎么用 Jinja 模板覆盖 system_prompt 等内置 prompt
【免费下载链接】serenaA powerful MCP toolkit for coding, providing semantic retrieval and editing capabilities - the IDE for your agent项目地址: https://gitcode.com/GitHub_Trending/ser/serena
当你需要改变 Serena 提供给 LLM 的内置指令(比如精简system_prompt、调整工具使用策略)时,Serena 允许你用 Jinja2 模板完全自定义它的 prompt。本文的目标是:在 Serena 用户数据目录中创建 prompt 覆盖文件,让 Serena 在会话中改用你的版本,并验证覆盖已生效。适用前提是本机已安装 Serena 并能运行serenaCLI。
哪些 prompt 可以被覆盖
根据 配置文档,Serena 提供给 LLM 的所有 prompt 都是 Jinja2 模板,具体包括三类:
- Serena 的 system prompt(即 "Serena Instructions Manual"),定义在 prompt 模板
system_prompt中; - context 和 mode prompt,即 context/mode 定义文件中的
prompt字段; - project prompt,即
project.yml中的initial_prompt,在项目激活时提供给 LLM。
模板变量让 prompt 可以适配当前配置。以下变量在上述所有模板中可用:
| 变量 | 说明 |
|---|---|
available_tools | 当前暴露给 LLM 的工具名列表,可写条件分支,如{% if 'replace_content' in available_tools %}…{% endif %} |
available_markers | 已有至少一个工具暴露的工具标记名列表(如ToolMarkerSymbolicRead),适合按工具组做条件判断 |
tool_names | 规范工具名到有效工具名的映射(包含历史重命名和语言后端替换)。文档建议写{{ tool_names['find_symbol'] }}而不是硬编码工具名 |
另外,context、mode 和 project prompt(不包括Serena 的 system prompt)还支持embed_memory(name)函数,用于把指定 memory 的内容内联进 prompt。修改 system_prompt 时不能依赖这个函数。
内置 prompt 的默认定义在仓库的 src/serena/resources/config/prompt_templates/ 目录下(system_prompt.yml等),覆盖时建议以默认版本为起点修改。
第一步:查看可覆盖的 prompt
# 列出所有 prompt 名称及其当前来源(default 或你的覆盖文件) serena prompts listlist会显示两部分:各 prompt 名称(未覆盖时显示default),以及可以被覆盖的 prompt YAML 文件清单。先用它确认你要覆盖的 prompt 名字,再进入下一步。
第二步:创建覆盖文件
有两种方式,效果相同——都是在 Serena 数据目录的prompt_templates文件夹中放入与默认 prompt 同名的.yml文件。数据目录默认为~/.serena,通过环境变量SERENA_HOME修改后会跟随新位置。
方式一:用 CLI 创建(推荐)
# 复制对应的内置 prompt YAML 到用户 prompt_templates 目录并自动打开编辑器 serena prompts create-override system_prompt # 之后再编辑已有覆盖 serena prompts edit-override system_promptcreate-override的参数是 YAML 文件名,可以省略.yml后缀;如果对应覆盖文件已存在,命令会报错而不覆盖现有文件。
方式二:手动创建文件
在~/.serena/prompt_templates/下创建system_prompt.yml,顶层用prompts:键定义同名 prompt。文档给出的最小示例:
prompts: system_prompt: | Whatever you want ...实际内容建议从默认的 system_prompt.yml 复制后修改。该文件还包含connection_prompt等字段,其注释说明:部分客户端不允许配置真正的 system prompt,此时 Serena 会把system_prompt的内容通过initial_instructions工具作为普通消息下发——覆盖文件按同样的 YAML 结构编写即可。
模板写法上,默认模板大量使用{% if … in available_tools %}条件块和{{ tool_names['…'] }},保留这些结构可以让你的覆盖版在不同工具配置下都正确渲染。
验证覆盖已生效
# 重新列出:被覆盖的 prompt 会显示你的覆盖文件路径,而不是 default serena prompts list # 打印(未渲染的)模板内容,且会体现你的 YAML 覆盖,即 Serena 实际将使用的模板 serena prompts print-prompt-template system_prompt判断标准:prompts list中目标 prompt 一行显示的是覆盖文件路径而非default,且print-prompt-template输出的内容与你修改的 YAML 一致。之后在客户端中启动新的 Serena 会话即可使用新 prompt。
回退与其他常用命令
如果不想继续保留覆盖,可以删除覆盖文件,Serena 会回落到内置默认 prompt:
# 删除覆盖文件(只删除用户目录下的 override,不影响内置模板) serena prompts delete-override system_prompt # 列出当前所有已存在的覆盖文件 serena prompts list-overrides两个限制需要注意:embed_memory(name)不能用于 system prompt 模板;tool_names映射会随语言后端变化(例如启用 JetBrains 后端时find_symbol会被替换),所以覆盖模板中引用工具名时优先使用{{ tool_names['…'] }}而不是写死名字。
【免费下载链接】serenaA powerful MCP toolkit for coding, providing semantic retrieval and editing capabilities - the IDE for your agent项目地址: https://gitcode.com/GitHub_Trending/ser/serena
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考