Template.from_string 在尾随的空行过度缩进或使用制表符缩进时会泄露杂乱的空行/空格
作者: BenAyedMedAla创建于 2026年8月7日更新于 2026年8月7日
请尽可能清楚地描述问题: `build_template_from_string`(由 `Template.from_string`/`Template.from_file` 和 `Application` 使用)的目的是将三重引号模板中的任何尾部空白行压缩为仅有一个尾部换行符 - 请参阅现有的 `test_template_from_str_with_extra_linebreaks` 测试。 这种压缩依赖于两个事物的对齐: 1. `inspect.cleandoc(content)` 删除尾部空白行。 2. `content.replace(" ", "").endswith("\n\n")` 重新添加了一个 `"\n"` 因为 `cleandoc` 否则会完全吞噬有意的空白行。 两者都会在尾部空白行的空格不再是 "纯空格,不超过模板的常用边距" 时崩溃: - `cleandoc` 只有在尾部空格行的(通过 tab 扩展)长度为 `<=` 其余内容的常用缩进边距时才完全清空该行。 如果更深 - 多余的空格,或是一个 tab,它扩展到一个完整的 tab 停止符 - `cleandoc` 会留下一个非空的剩余行而不是删除它。 - `ends_with_linebreak` 策略只会从 *原始* 内容中删除文本中的 `" "` 字符,然后检查是否存在 `"\n\n"`,因此它完全忽略了 tab(或任何其他横向空格),即使 `cleandoc` 确实成功完全清除了该行。 总体效果是: 多余的空白行和漏掉的尾部空格直接进入实际发送到模型的字符串 - 无声地,没有错误或警告。
内容来源: dottxt-ai/outlines