-
Notifications
You must be signed in to change notification settings - Fork 0
AI Writing
TeXLeaf 0.8.11 提供一套可选、默认关闭的 AI 写作工作流,可使用 DeepSeek 官方/自定义的 Chat Completions API,或 OpenAI 官方/自定义的 Responses API,为 LaTeX 正文提供拼写、语法、标点、措辞、清晰度、风格与一致性建议,也支持安全改写和行内续写。
这项功能借鉴 Grammarly 一类写作助手的交互方式,但不等同于 Grammarly,也不承诺功能、词典、判断结果或服务质量等价。它没有 Grammarly 的专有词典、个人/团队风格指南、浏览器与办公套件生态或账号服务;模型建议也不能代替作者、导师、期刊编辑、事实核查或 LaTeX 编译。
开启后,TeXLeaf 可以:
- 停止键入后,优先自动局部检查本次改动的正文句子,并保留其他仍有效的问题;
- 手动检查当前选区、当前段落或整篇
.tex文档; - 用编辑器装饰线标出问题范围,不发布原生 Diagnostic,也不重复进入 Problems;
- 在 TeXLeaf 专用 Hover 中显示问题类别、简要说明、解释、替换预览和“应用这条建议”链接;
- 在 TeXLeaf 活动栏的“AI 写作问题”列表中集中显示检查状态、建议与安全忽略摘要;点击条目会以主题自适应背景和轮廓突出对应正文,其他问题仍保留下划线;
- 通过 Hover 的“应用这条建议”、灯泡 Quick Fix 或问题树应用单条建议,或在本次扩展宿主会话中忽略它;
- 改写连续的纯正文选区;没有选区时,可改写光标所在的安全正文句子;
- 提供词语或句子的 VS Code 原生行内补全,也可以从 Command Palette 手动触发;
- 在设置变化、继续编辑、关闭功能或清除 Key 时取消不再有效的请求,并拒绝把过期结果应用到新版本文档。
检查的问题类别包括:
| 类别 | 用途 |
|---|---|
| 拼写 | 拼写错误或明显的单词形式问题 |
| 语法 | 主谓一致、冠词、时态、句法等 |
| 标点 | 标点缺失、误用或中英文标点问题 |
| 措辞 | 更准确、自然或符合上下文的词语 |
| 清晰度 | 含混、指代不清或难以理解的表达 |
| 风格 | 学术、通用或简洁写作目标下的表达建议 |
| 一致性 | 同一段落中的术语、形式或表达不一致 |
texleaf.aiWriting.provider 支持两个值:
-
deepseek(默认):调用texleaf.aiWriting.deepseekBaseUrl规范化后的{Base URL}/chat/completions。默认 Base URL 是 DeepSeek 官方https://api.deepseek.com; -
openai:调用texleaf.aiWriting.openaiBaseUrl规范化后的{Base URL}/responses。默认 Base URL 是 OpenAI 官方https://api.openai.com/v1,默认模型是gpt-5.6-luna。
两者都需要用户自己的可用 API Key。ChatGPT Plus/Pro/Codex 订阅与 OpenAI API 是分别管理和计费的产品,不能直接作为 OpenAI API 额度;DeepSeek API 也独立于上述产品。OpenAI Responses 的接口说明见 Responses API,结构化响应说明见 Structured Outputs。
创建当前服务商的 Key 后,不要把它写进:
-
settings.json; -
.tex、.bib或其他项目文件; - Git 仓库、Issue、截图或日志;
- TeXLeaf Snippet JSONC;
- Wiki 或聊天消息。
DeepSeek 的认证、接口和当前模型说明以 DeepSeek API 文档 为准;OpenAI 模型与接口以 OpenAI API 文档 为准。
texleaf.aiWriting.language 是用户设置枚举,不会把一整段提示直接传给客户端。自 0.8.6 起,auto、english、chinese 统一映射为最长 7 个字符的协议标签 auto、English、Chinese,自动检查、手动段落/选区检查、整篇检查、改写和行内补全都复用这一个映射,DeepSeek 与 OpenAI Provider 的行为一致。Review 的固定 system prompt 仍单独要求 message/explanation 使用简体中文、replacement 保持正文原语言;缩短协议标签不会把论文翻译成中文,也不会把建议说明改回英文。
自定义地址只表示“与 TeXLeaf 当前 Provider 请求契约兼容的服务”,不表示该服务由 DeepSeek、OpenAI 或 TeXLeaf 运营或背书。DeepSeek 只请求 {Base URL}/chat/completions,并要求兼容 Chat Completions 与 JSON Output;OpenAI 只请求 {Base URL}/responses,并要求兼容本插件使用的 Responses JSON 结构与 Structured Outputs。两个 Provider 不会自动互换 endpoint 或跨协议回退。
Base URL 的安全规则是:
- 远程地址必须使用 HTTPS;
- 只有
localhost、127.0.0.1和[::1]回环地址可使用 HTTP; - 禁止 URL 用户名、密码、查询参数、fragment 和主机名尾随点;
- DeepSeek Base URL 的路径不得已经以
/chat/completions结尾,OpenAI Base URL 的路径不得已经以/responses结尾,TeXLeaf 会在规范化后追加对应 endpoint; - 请求不会跟随 HTTP 重定向,重定向目标不会成为隐式的新接收者;
- 主机名、默认端口和末尾斜杠会规范化,因此语义相同的地址会指向同一套本机凭据;主机、端口或路径实际变化时则视为新的接收目标。
自定义服务的兼容程度、可用模型、费用、日志、数据保留、训练与隐私政策由其运营方决定。TeXLeaf 会在 OpenAI Responses 请求中发送 store:false,但这只是客户端请求,无法保证第三方服务遵守或采用 OpenAI 的数据政策;DeepSeek 兼容服务也以其运营方政策为准。
- 打开受信任工作区中一个已有文件名和路径的
.tex文件;URI 必须是本地file:或 Remote 的vscode-remote:。 - 按
Ctrl+Shift+P/Cmd+Shift+P打开 Command Palette。 - 在 Settings 选择
texleaf.aiWriting.provider,并检查该 Provider 的模型与 Base URL。 - 运行 TeXLeaf: 切换 AI 写作助手。
- 核对提示中显示的实际正文接收目标、数据边界和计费说明,确认后继续。
- 在密码输入框粘贴当前服务商/当前规范化 Base URL对应的 API Key。
- 状态栏出现
TeXLeaf AI启用状态后,在普通正文段落中输入或运行手动检查命令。
也可以先运行 TeXLeaf: 设置当前 AI 服务商 API Key,然后再开启总开关。
API Key 通过 VS Code 扩展 API 的 SecretStorage 保存,不写入普通设置、工作区文件、Git、Output 日志、TeXLeaf Snippet 库或 Snippet Settings Sync 数据。Key 输入框使用密码模式。DeepSeek 与 OpenAI 都按规范化 Base URL分别派生 Secret 与正文传输 consent。默认 https://api.deepseek.com 继续兼容此前版本的 v1 DeepSeek Key/consent;切换到任何自定义 DeepSeek 地址时使用新的目标专用记录,绝不会复用官方 Key。OpenAI 官方地址、不同代理地址以及两个 Provider 之间同样互相隔离;缺少当前目标 Key 时不会回退使用其他地址的 Key。
SecretStorage 不会通过普通 VS Code Settings Sync 跨设备同步。以下环境也可能各自持有独立的 SecretStorage:
- VS Code Stable 与 Insiders;
- 不同 VS Code Profile;
- 本地扩展宿主与 WSL/SSH/Dev Container Remote 扩展宿主;
- 不同电脑或系统账户。
因此,在实际运行 TeXLeaf AI 的每个环境中分别设置 Key 是正常现象。全部 14 个 texleaf.aiWriting.* 普通设置都是 application 级用户/Profile 配置,可以由 VS Code Settings Sync 同步;工作区、工作区文件夹和 .vscode/settings.json 不能开启 AI、重定向 Base URL、切换 Provider/模型或改变费用相关限制。Key 与 consent 不随普通设置跨设备复制;同步到另一台机器后,在该机确认当前目标并设置 Key 之前不会联网。需要撤销当前目标的凭据时,运行 TeXLeaf: 清除当前 AI 服务商 API Key;该操作还会取消当前 AI 请求并持久清除 AI 问题。
每个检查、改写或补全入口都必须同时满足以下条件:
-
texleaf.enabled=true; -
texleaf.aiWriting.enabled=true; - 用户已经针对当前 Provider 和当前规范化接收地址确认正文传输提示;
- 当前 VS Code 窗口的工作区已受信任;
- SecretStorage 中存在当前目标专用的 API Key;
- 文档已有文件名和路径,URI scheme 是本地
file:或 VS Code Remote 的vscode-remote:; - 文件后缀是
.tex; - language ID 是
latex或tex。
这里的“已有文件名和路径”不是 document.isDirty === false:自动检查、手动检查、改写和补全使用的是当前编辑器内存中的正文,因此可能发送尚未按 Ctrl+S / Cmd+S 写入磁盘的最新编辑。Untitled 没有文件路径,始终被排除。
以下情况不会发送正文:
- 安装或升级后尚未主动开启 AI,总开关保持默认
false; - 未信任工作区;
- Untitled/尚未保存的编辑器;
-
.bib、.md或其他后缀; - Git、扩展生成或其他虚拟文档 URI;
- Key 不存在;
- 总开关已关闭;
- 当前光标或选区不在可提取的自然语言正文中。
仅在 Settings 中把 texleaf.aiWriting.enabled 改成 true,但从未确认传输提示时,也不会静默联网。建议始终用 Command Palette 的切换命令完成首次开启。
TeXLeaf 不把整个 .tex 文件原样交给模型。每次请求前,它先在本地扫描文档,把可审阅正文与 TeX 结构分离。
只有明确认可为普通语言内容的区域才会保留。例如:
- 文档、摘要、proof、theorem、definition、remark、quote、itemize、enumerate、figure、table、frame 等已知正文环境中的普通文字;
-
\section{...}、\subsection{...}、\title{...}、\caption{...}、\footnote{...}、\emph{...}、\textbf{...}、\textit{...}等已知正文参数; - 普通段落中不属于受保护结构的自然语言。
allowlist 并不意味着模型可以编辑外围命令。比如 \caption{Clear result} 中只把 Clear result 视为正文,命令名和大括号仍受保护。
以下非数学内容会在本地用等长空格遮罩,换行位置保持不变,以便模型返回的位置可以安全映射回原文:
-
%注释; -
\verb、verbatim、Verbatim、lstlisting、minted; - citation、reference、label、tag;
- URL、路径、图片与文件参数;
- bibliography、package、document class 和宏/环境定义参数;
- 其他明确属于 TeX 数据或控制结构的参数。
$...$、$$...$$、\(...\)、\[...\] 与已知数学环境采用更有语义、但同样受保护的处理:公式源码在本地替换成与原范围 UTF-16 长度完全相同 的固定标记与 padding,例如 ⟦INLINE_FORMULA⟧ 或 ⟦DISPLAYED_FORMULA⟧;非常短的畸形数学范围只会使用短占位字符。模型不会收到公式内容,也被禁止把标记或 padding 放进 original/replacement,本地可编辑区校验会再次拒绝任何命中占位符的建议。
语义占位让模型知道句中确实存在一个不可编辑的数学表达式,而不是一块凭空消失的空白。系统提示明确要求把 inline/display formula 当作周围句子的名词短语或宾语,因此 Take 后紧接行间公式时,不应再仅因为公式内容被保护就误报“缺少宾语”。占位符只改善语法上下文,不放宽公式保护或 offset 校验。
扫描器对未知内容采取 fail-closed:未知命令后紧跟的可选/必选参数默认视为数据或控制代码并遮罩;未知环境的内容默认不发送。只有进入明确 allowlist 的正文区域才开放。
这能显著减少意外发送 TeX 结构和元数据的机会,但低延迟扫描器不是完整 TeX 编译器。复杂自定义宏、宏生成的环境、非常规 catcode 或不完整 TeX 附近仍应人工复核。对敏感或结构复杂的内容,优先选中一小段连续纯正文再手动检查;不希望发送的文档应保持总开关关闭。
服务商返回的 JSON 不会直接变成文件编辑。协议要求模型使用零基 UTF-16 code-unit offset,但实际模型或兼容接口偶尔会按 Unicode code point、UTF-8 byte,或把 CRLF 当成一个换行计数。TeXLeaf 会在本地尝试有限的坐标解释,然后验证:
-
start/end是可安全解释的整数范围; -
original是非空、单行的原文锚点,并与最终范围逐字一致; - 修改完全落在正文 allowlist 的可编辑区;
- 多条建议互不重叠;
- replacement 长度受限,且不含会引入 LaTeX 结构的换行、反斜杠、美元号、百分号或花括号;
- 文档 URI、版本、原文和当前运行条件仍与请求发出时一致。
如果模型给出的范围在所有支持的坐标解释下都不匹配,TeXLeaf 只允许把 original 重定位到全文中唯一的逐字匹配。如果不同解释指向不同位置,或缺少可信 offset 且相同原文出现多次,就返回歧义而不是猜测。它不会做 Unicode 规范化、大小写/引号替换、空白折叠、CRLF 文本替换或模糊相似度匹配;CRLF 兼容只改变 offset 的计数解释,不改变待匹配内容。请求协议要求模型不要使用空 original 或零长度范围表示纯插入,而要选择相邻不变文字作锚点,并在 replacement 中保留该锚点。本地验证非空 exact 锚点与 replacement 的安全字符;由于普通替换本来就不需要包含 original,它不会用“replacement 必须包含 original”这种规则臆测模型意图。反过来,如果当前源码已由候选的 original 范围加紧邻上下文组成完整 replacement,例如范围只锚定当前 takes 的 take 前缀却仍建议 takes,该截短候选会被拒绝,而不是显示一个实际已经成立的修改。
只有通过全部检查的结果才会进入编辑器装饰线、专用 Hover 和问题列表。顶层 JSON/issues 结构无效、空白结果或截断输出会让整个响应失败;数组中单条建议越界、找不到、位置歧义、字段无效或落入受保护区时只丢弃该条,独立且不重叠的有效建议仍可显示。真正相交的区间按连通冲突组整组丢弃,避免按顺序选择其中一条;字段和范围完全相同的重复 issue 则去重保留一条,并把多余项记为 duplicate-issue。Review 系统提示要求 message 和 explanation 使用简洁的简体中文,既有技术术语可保留英文;replacement 必须保持 payload.language 与来源正文的原语言,不能为了中文解释而翻译作者文字。显示建议本身不修改文件;只有用户主动应用单条 Quick Fix/列表建议,或确认“应用全部”后才可能编辑正文。
DeepSeek JSON 模式有一条受限恢复路径:只有响应正文为空或 JSON 语法无效时才自动重试一次;schema、字段、offset、原文锚点和重叠等安全失败不会重试。解析器只接受纯 JSON,或完整包住全部响应、仅单层且语言标记为 json 的一个 Markdown fence;夹带说明文字、多个 fence、嵌套 fence 或不完整 fence 都会被拒绝。单条建议被丢弃时,日志只记录拒绝数量和去重后的安全子码;不会回显服务端原始错误 body、Key、请求正文、响应正文或 original。
排查 DeepSeek 结构化响应时,常见安全子码包括:
| 安全子码 | 含义与处理 |
|---|---|
empty-content |
响应正文为空;只自动重试一次 |
invalid-json-output |
响应不是合法 JSON;只自动重试一次 |
content-too-large |
模型正文超过本地响应长度上限;拒绝,不重试 |
invalid-issues |
issues 不是受限数组或条目数越界;拒绝,不重试 |
invalid-original |
original 缺失、为空、只有空白、过长、跨行或含不允许的控制字符;丢弃该条,不重试 |
invalid-issue-offset |
start / end 不是安全整数、为负数,或 end <= start;丢弃该条,不重试 |
issue-original-not-found |
在支持的坐标解释和全文中都找不到 original 的逐字匹配;丢弃该条,不重试 |
issue-location-ambiguous |
多种坐标解释或重复原文产生多个可能位置;丢弃该条,不猜测、不重试 |
duplicate-issue |
完全相同的建议重复出现;保留一条,多余项去重,不重试 |
overlapping-issues |
不同建议的范围真正相交;整个连通冲突组丢弃,不重试 |
http-body-too-large |
HTTP 成功响应整体超过本地字节/字符上限;拒绝,不重试 |
这些子码由 TeXLeaf 本地生成,只说明失败类别;它们不包含服务端原始 message 或论文内容。
可安全映射的问题由 TeXLeaf 编辑器装饰线标出。装饰线本身不携带原生 Diagnostic 消息或严重性;鼠标悬停时由 TeXLeaf 自己的 HoverProvider 只显示一份类别、中文 message/explanation、替换预览和“应用这条建议”,活动栏问题树则保留模型建议的真实严重性。Hover 的命令信任范围只包含 TeXLeaf 白名单中的内部应用命令;AI 返回的 message、explanation、original 与 replacement 都只是转义后的不受信任文字,不能构造或运行命令。建议仍应由作者审阅。
自 0.8.7 起,TeXLeaf 不把 AI 问题发布到 VS Code DiagnosticCollection,因此这些 AI 项不会出现在 View → Problems,也不会先出现一份原生诊断 Hover、再叠加 TeXLeaf Hover。TeXLeaf 不包含音频文件,也不会主动播放检查音效;由于没有 AI Error/Warning marker,检查完成或点击问题也不会由 TeXLeaf 引入对应的 accessibility signal。其他扩展或 VS Code 自身提示仍由用户的全局辅助功能设置控制。
把光标放到波浪线上,可以点击 Hover 的“应用这条建议”,也可以使用灯泡或 Quick Fix:
- 选择替换/删除建议时,无论入口来自 Hover、灯泡还是问题树,TeXLeaf 都会在后端再次确认当前文档版本、问题身份、范围、exact
original与 editable prose; - 单条或批量 WorkspaceEdit 成功后,对应问题会立即从装饰线、Hover、列表与本机缓存中消费,不依赖稍后到达的文档变更回调;
- 已经证明未受当前编辑影响、只是因前方文字增删而安全平移的问题会保留稳定 lineage ID;刷新前已经显示的树节点或 Quick Fix 仍可解析到当前范围,并在 exact
original等校验通过后应用; - 选择“本次会话忽略此建议”只影响当前扩展宿主会话;
- 运行 TeXLeaf: 清除 AI 写作问题 会持久清除当前问题标记,不修改文档;既有命令 ID 仍为
texleaf.aiWriting.clearDiagnostics; - 真正已经失效的旧节点不会被强行应用;TeXLeaf 会刷新问题树、装饰线与状态,并只在状态栏短暂显示“问题列表已更新;旧建议已失效”,不弹出误导性信息通知,也不播放音效。
Windows 的微软拼音在中文模式下会优先把 Ctrl+. 用于切换中文/英文标点,所以这个组合键可能根本没有送到 VS Code;此时 Hover 已经出现但按 Ctrl+. 没反应,不表示 TeXLeaf 的 Code Action Provider 返回了空结果。可以按 Shift 把输入法切到英文模式后再按 Ctrl+.,也可以从 F1 / Command Palette 或右键菜单运行“快速修复...”、点击灯泡,或者直接点击 Hover 的“应用这条建议”。TeXLeaf 0.8.9 没有新增或接管其他系统级快捷键。
点击活动栏中的 TeXLeaf 图标,再展开“AI 写作问题”,可以集中审阅当前活动 .tex 文档。状态栏的 TeXLeaf AI 项或命令 TeXLeaf: 显示 AI 写作问题列表 也会打开该视图。列表会明确显示正在检查、已调度、多少个改动句子等待局部复检、AI 未开启、不支持当前编辑器或没有可审阅问题等状态;pending 状态同时说明其他问题仍保留,标题徽标与视图说明会同步当前问题数和检查状态。
每条建议显示:
- 源码行号、问题类别和真实严重性;
-
原文 → 替换; - 简要诊断与模型解释。
点击条目会把对应源码范围滚动到可见区域,并给当前问题叠加主题自适应背景与轮廓;其他问题仍保留原有下划线。这个选中高亮不移动编辑器主光标、不夺走问题列表焦点,也不发布原生 Diagnostic 或触发对应音效。安全平移的问题保留稳定 issue lineage,因此只在它前方发生无关编辑时,高亮会跟随当前范围;该问题被应用、忽略、清除或判定失效,或者 AI 被关闭后,高亮会自动移除。使用上下文菜单可以应用单条建议或在本次会话忽略它。视图工具栏还能重新检查当前文档、清除问题和切换 AI。模型提供的 message、explanation、original 与 replacement 都按不受信任文本处理,不会被当作可执行 Markdown 命令。
运行 TeXLeaf: 应用当前全部 AI 建议,或使用视图工具栏的“应用全部”,会先显示模态确认。确认前 TeXLeaf 保存当前安全问题的稳定 ID;确认后从最新状态逐条重新解析它们,再验证文档版本、每条范围、当前原文和建议之间的重叠。仅创建了内容等价的新 state 对象不会让操作误失败;正文版本已变、任一捕获问题已移除/失效/无法唯一解析,或者范围、原文或重叠校验失败时仍会整批停止,不进行部分冒险修改。确认后才出现、未被确认的其他建议不属于这一批。
视图中的“安全忽略 N 条无法可靠定位的建议”是 fail-closed 汇总。例如通知显示“42 条可审阅,另安全忽略 20 条”,表示模型候选中 42 条完成了精确、无歧义的本地映射,20 条因完全重复、范围重叠、字段无效、找不到原文或无法唯一定位而丢弃。这不是 API Key、余额、认证或网络错误;被忽略的候选不会修改原文,摘要也不会暴露被拒绝的论文文字。
自动句子检查默认等待 900 毫秒,设置范围为 500–10000 毫秒。连续键入会重置计时并取消旧请求;本次编辑涉及的句子进入 pending 局部复检队列,尚未处理的编辑目标始终优先于纯光标导航,因此写完一句后立即按 Enter、输入空行或点击别处不会漏掉刚编辑的句子。没有 pending 改动句子时,光标导航才会选择附近的安全正文句子。
句子边界使用等长 TeX 遮罩后的 UTF-16 源码位置。英文 .?! 通常要求后面是空白或正文结尾,以减少对小数和点号标识符的误拆;中文 。!? 不要求句间空格,因此 第一句。第二句!第三句? 会成为三句。句末中英文闭合引号、书名号和括号归入前句,不会破坏源码 offset。
一次能精确重建的文本事务会计算两组彼此不同的范围:旧句子与新句子并集只用于给 provider 提供完整自然语言上下文和调度 pending;真正决定旧问题是否失效的是实际编辑加累计未复检区域形成的精确 UTF-16 dirty ranges。old ∪ new 上下文覆盖:
- 在句内替换、插入或删除正文;
- 插入/删除句号,把一个旧句拆成多个新句或反向合并;
- 插入/删除空行,改变正文段边界;
- 同一个 VS Code
contentChanges事务中的多处编辑。
同一句中与 dirty ranges 不相交的问题不会因为整句被发送而清空:TeXLeaf 只在 original 与当前正文逐字一致、仍位于可编辑 prose,并能通过整个事务严格 UTF-16 remap 时保留它。安全保留项的 lineage ID 不随前方文字造成的 offset 平移改变,fingerprint、文档版本、范围和 offset 则继续更新到当前正文,因此旧树节点不会只因位置移动而丢失操作身份。在问题范围右端点追加词尾属于与该问题相关的编辑;给 take 追加 s 后,旧词形建议会失效,而同句其他真正不相交的问题仍保留。自动复检回应到达后,也只替换命中 dirty ranges 或与新返回问题相交的旧项;同句其余有效建议继续显示。手动段落/全文检查属于显式刷新,仍按所检查的完整正文段替换旧结果。保存、dirty-state/编码转换等没有正文 contentChanges 的通知不会清除已有问题或 pending 队列;同文本版本推进时状态安全迁移。只有事务无法无歧义重建、范围越界、文档超过 100 万 UTF-16 字符、单事务超过 1024 个 change,或映射无法证明安全时,才 fail closed 丢弃不再可靠的结果。
每个自动句子成功返回后会立即与现有列表合并,并从 pending 队列移除。如果同批后续 API 请求失败,前面已经成功的句子不会回滚,也不会因为重试而再次产生同一句费用;剩余句子继续显示为“等待局部复检”,其他全文问题仍留在列表。每个自动批次最多处理 8 个改动句子;同一文档版本、同一句子内容和相同 Provider、模型、语言、风格组合去重,每版本最多自动请求 64 个不同句子。达到上限后不会把旧去重记录当作 LRU 逐出再收费。
显式检查多段选区或整篇文档,除 maxDocumentLength 和单段长度外,还有单次最多 32 个正文段的硬上限。每个正文段成功后立即合并,后续段失败不撤销前段;达到任一上限后会停止并提示,其余正文不发送。即使选区或文件包含上万个极短正文段,也不会由一次命令产生无界数量的 API 请求。
这套调度不是每按一个键就发起一次网络调用:防抖、取消、去重和上限会合并、约束连续操作。但 AI Provider 的网络延迟、频率限制、处理时间和 API 费用仍然存在,因此这里的“自动”只能提供近实时反馈,不能保证像纯本地拼写器那样无延迟。AI 总开关仍默认关闭;只有用户显式开启、确认当前接收者并设置对应 Key 后,自动检查或补全才可能产生请求和费用。
运行 TeXLeaf: AI 检查当前段落或选区:
- 有选区时,只取选区与正文 allowlist 的交集;
- 没有选区时,检查光标所在正文段落;
- 单段超过
texleaf.aiWriting.maxParagraphLength时拒绝发送,并提示缩小选区; - 数学或受保护 TeX 不计入可发送正文。
运行 TeXLeaf: AI 检查当前文档 会按正文段落顺序逐段请求。它不会突破长度限制:
- 超过单段上限的段落会跳过;
- 正文累计达到
texleaf.aiWriting.maxDocumentLength后停止; - 截断时会明确提示,其余正文不发送;
- 进度通知可以取消。
整篇检查可能产生较多请求与 token 用量。长论文建议先按章节或选区检查。
运行 TeXLeaf: AI 改写选区或当前句:
- 有选区时要求它是一段连续纯正文;
- 没有选区时尝试定位光标所在的安全正文句;
- 可以选择更学术、更简洁、更清晰、修正语法等预设目标,或输入短的自定义要求;
- 请求期间如果文档或 AI 设置改变,结果会取消;
- 返回内容必须通过纯正文与范围检查,不能引入 LaTeX 命令或结构;
- 未通过检查时原文不变。
包含 citation、数学、命令边界或其他受保护标记的整段选区可能被拒绝。此时只选中命令之间的自然语言片段,不要把 \cite{...}、$...$ 或外围大括号一起选入。
开启 texleaf.aiWriting.inlineCompletions 后,TeXLeaf 可在安全正文光标位置请求简短续写,并以 VS Code 原生 Inline Suggest 显示。通常按 Tab 接受,具体键位由 VS Code 当前 Inline Suggest 配置决定。
行内补全有以下保护:
- 光标必须位于正文 allowlist 的可插入边界;
- 当前上下文必须包含足够的自然语言;
- 数学、命令或受保护参数中不请求;
- 普通 Suggest 已选中候选时不抢占;
- 自动触发会等待
completionDelayMs;继续键入会使旧结果失效; - 返回内容必须是短的单行纯文本,不能引入 TeX/Markdown 结构。
如需显式请求,运行 TeXLeaf: 触发 AI 行内补全。如果只想使用检查而不要续写,把 texleaf.aiWriting.inlineCompletions 设为 false。
AI 写作精确包含 14 个设置,scope 全部是 application:只能在用户/Profile 层控制,并可随普通 VS Code Settings Sync 同步。工作区、工作区文件夹和 .vscode/settings.json 不能覆盖它们;扩展运行时也只读取全局值作为纵深防护。总开关默认关闭;automaticReview 和 inlineCompletions 的默认 true 只有在总开关开启、consent 与 Key 都齐备后才有意义。
| 设置 | 默认值 / 范围 | 作用 |
|---|---|---|
texleaf.aiWriting.enabled |
false |
AI 写作总开关;未信任工作区中仍强制停用 |
texleaf.aiWriting.automaticReview |
true |
停止键入后自动局部检查本次改动的正文句子 |
texleaf.aiWriting.inlineCompletions |
true |
提供词语和句子行内补全 |
texleaf.aiWriting.provider |
deepseek;deepseek / openai
|
选择 DeepSeek Chat Completions 或 OpenAI Responses 服务 |
texleaf.aiWriting.deepseekModel |
deepseek-v4-flash;deepseek-v4-flash / deepseek-v4-pro
|
DeepSeek 模型;flash 优先低延迟/低成本,pro 优先质量 |
texleaf.aiWriting.deepseekBaseUrl |
https://api.deepseek.com |
DeepSeek Chat Completions Base URL;请求目标为规范化后的 {Base URL}/chat/completions
|
texleaf.aiWriting.openaiModel |
gpt-5.6-luna;1–128 字符的安全模型 ID |
OpenAI Responses 模型;自定义服务可填其模型 ID |
texleaf.aiWriting.openaiBaseUrl |
https://api.openai.com/v1 |
OpenAI Responses Base URL;请求目标为规范化后的 {Base URL}/responses
|
texleaf.aiWriting.language |
auto;auto / english / chinese
|
自动识别、英语论文检查(中文解释)或中文学术写作检查 |
texleaf.aiWriting.style |
academic;academic / general / concise
|
学术、通用或简洁写作目标 |
texleaf.aiWriting.reviewDelayMs |
900;500–10000
|
停止键入后,多久调度改动句子的自动检查 |
texleaf.aiWriting.completionDelayMs |
500;100–5000
|
自动行内补全请求前的额外等待 |
texleaf.aiWriting.maxParagraphLength |
6000;500–20000
|
单个自动检查句子或手动正文段最多发送的 UTF-16 字符数;设置名为兼容旧配置而保留 |
texleaf.aiWriting.maxDocumentLength |
30000;1000–100000
|
一次手动整篇检查最多发送的正文 UTF-16 字符数 |
示例:保留手动检查,关闭两个自动入口并控制长度:
完整设置索引见 配置参考。
| Command Palette 名称 | Command ID | 作用 |
|---|---|---|
| TeXLeaf: 切换 AI 写作助手 | texleaf.aiWriting.toggle |
完成首次传输确认,并开启或关闭总开关 |
| TeXLeaf: 设置当前 AI 服务商 API Key | texleaf.aiWriting.setApiKey |
保存当前 Provider/规范化 Base URL 专用的 Key |
| TeXLeaf: 清除当前 AI 服务商 API Key | texleaf.aiWriting.clearApiKey |
删除当前目标的 Key、取消请求并持久清除问题 |
| TeXLeaf: AI 检查当前段落或选区 | texleaf.aiWriting.reviewParagraph |
手动检查选区或当前正文段落 |
| TeXLeaf: AI 检查当前文档 | texleaf.aiWriting.reviewDocument |
按限制分段检查当前 .tex
|
| TeXLeaf: 显示 AI 写作问题列表 | texleaf.aiWriting.showIssues |
打开活动栏列表,查看当前文档状态、建议与安全忽略摘要 |
| TeXLeaf: 应用当前全部 AI 建议 | texleaf.aiWriting.applyAll |
经确认和整批重新校验后应用当前全部有效建议 |
| TeXLeaf: AI 改写选区或当前句 | texleaf.aiWriting.rewriteSelection |
安全改写连续纯正文 |
| TeXLeaf: 触发 AI 行内补全 | texleaf.aiWriting.triggerCompletion |
触发 VS Code 原生 Inline Suggest |
| TeXLeaf: 清除 AI 写作问题 | texleaf.aiWriting.clearDiagnostics |
持久清除当前问题标记,不修改正文;命令 ID 保持兼容 |
DeepSeek API、OpenAI API、ChatGPT Plus/Pro/Codex 订阅以及任何自定义 Chat Completions/Responses 服务都是各自管理的产品。ChatGPT 订阅不等于 OpenAI API 额度。TeXLeaf 不代理账户、不赠送额度、不读取余额,也不能替你设置充值、预算或第三方服务政策。
API 费用通常与输入/输出 token、所选模型及服务端当时的计费政策有关。DeepSeek 的准确价格、缓存 token 规则和模型可用性见 DeepSeek Models & Pricing;OpenAI 的当前价格见 OpenAI API Pricing。TeXLeaf 的 DeepSeek Provider 向当前规范化 Base URL 的 /chat/completions 发送 JSON Output 请求,默认官方目标为 https://api.deepseek.com/chat/completions;接口行为见 Create Chat Completion 与 JSON Output。OpenAI Provider 只使用当前规范化 Base URL 的 Responses API 与 Structured Outputs,默认模型 gpt-5.6-luna 面向成本敏感的高频工作负载。
自动检查使用 900 毫秒默认防抖、取消和同版本同句子去重,不会为每一个按键都发起请求;每批最多 8 个改动句子,每版本最多自动请求 64 个不同句子,手动整篇每次最多 32 个正文段。网络延迟、限额和计费意味着它是近实时服务,不能作为免费、零延迟的本地校验器理解。
控制费用的实用方法:
- DeepSeek 可使用默认
deepseek-v4-flash;OpenAI 可使用默认gpt-5.6-luna。切换模型前查看对应服务的价格和可用性。 - 关闭
automaticReview,按段落/选区手动检查。 - 不需要续写时关闭
inlineCompletions;自动补全可能比手动检查更频繁。 - 提高
reviewDelayMs和completionDelayMs,减少连续键入时的请求。 - 降低单段与整篇长度上限;长论文按章节或小选区处理。
- 不使用 AI 时关闭总开关;关闭会取消正在进行的请求并持久清除问题。
- 在实际服务商控制台自行检查余额、账单与 Key 使用情况;自定义服务以其运营方政策为准。
根据操作不同,请求可能包含:
- 被提取和遮罩后的当前改动句子、手动选区或多段正文;
- 改写目标与所选/自定义改写指令;
- 行内补全光标附近的正文 prefix/suffix;
- 当前语言和写作风格选项;
- 为获得结构化结果而附加的系统提示。
请求由当前选择的 Provider、模型和实际 endpoint 处理。TeXLeaf 对 OpenAI Responses 请求发送 store:false,请求服务不要存储该响应;这只是客户端请求,自定义服务是否识别该字段、如何记录、保留、训练或处理数据由其运营方决定。DeepSeek、OpenAI 或第三方服务的数据处理都不由 TeXLeaf 控制,应以实际接收者当时的条款、隐私政策和 API 文档为准。涉及未公开论文、保密审稿、个人信息、敏感研究数据或受合同限制的内容时,应先确认你有权把相关文字发送给该目标。
- API Key 按每个规范化 DeepSeek/OpenAI Base URL 分别存在当前扩展环境的 SecretStorage;TeXLeaf 不把 Key 写入普通设置、问题缓存或 Snippet 同步数据。默认 DeepSeek 官方目标继续兼容旧
v1记录,自定义 DeepSeek 目标绝不复用它。全部 14 个 application 级普通设置可以随 Settings Sync,而 Key 与 consent 不会随其跨设备同步;工作区配置不能覆盖 AI 设置。 - 已通过安全校验的问题会以版本化 JSON 记录写入当前 VS Code Profile/扩展宿主私有的
globalStorageUri/ai-writing-issues-v1/。这样关闭文档或重启 VS Code 后可以恢复问题树、装饰线、专用 Hover 与 Quick Fix。 - 问题缓存不写入工作区,不注册 Settings Sync,也不保存论文全文。每条记录包含文档 URI、全文 UTF-16 长度与 SHA-256、文档版本、保存时间,以及应用建议所必需的单条 ID/fingerprint、offset、短
original锚点、replacement、中文 message/explanation、类别与严重性。URI 会先哈希成缓存文件名,但记录内部仍含 URI,因此缓存属于本机隐私数据,不应公开上传。 - 只有当前完整源文的 UTF-16 长度与 SHA-256 都和快照完全一致时,恢复才按原 offset 逐条验证
original、editable prose 与截短 replacement。源文被离线/外部修改、hash/长度不匹配时会安全丢弃缓存并要求重新检查,不跨源搜索相同短语;即使全文一致,单条范围、原文、可编辑区失效,或replacement已经由该范围与紧邻上下文完整存在,也会丢弃该条。因此旧精确 source-hash 缓存不能让已经成立的词尾建议复活。 - 单文档最多保存/显示 2048 条问题,单个 JSON 记录最多 2 MiB;每个 Profile 最多保留 256 个文档记录且总量最多 32 MiB,超限时按最近修改时间清理旧记录。写入以 750 毫秒防抖,并采用同目录临时文件后 rename;这是 Profile-local 的 best-effort 原子快照,不宣称提供跨窗口事务或强 CAS。扩展停用时会等待已排队快照尽力 flush。
- 缓存读取仍执行与在线结果同等级的字段长度、类别、严重性、控制字符、TeX replacement 和可编辑区校验。无效 UTF-8、损坏 JSON、超限或被篡改记录会被拒绝并清理,不能借重启缓存绕过安全边界。
- pending 句子、检查中/已调度状态、“本次会话忽略”和正在进行的请求仍只属于当前扩展宿主会话,不跨重启恢复。清除问题、关闭 AI、切换 Provider/模型/Base URL、修改相关设置或清除 Key 会写入空记录,避免已明确清除的问题在重启后复活。
- Output 只记录经过整理的操作/错误类别和 API 返回的用量数字,不记录 Key、请求正文、响应正文、
original或原始错误 body。
- 本地扫描器不是完整 TeX 编译器;复杂宏边界可能需要人工确认。
- AI 可能误改术语、专名、符号含义、数字或论证语气。
- “通过安全校验”只表示修改没有越过当前 TeX 保护边界,不表示语义、事实或学术规范必然正确。
- 应用建议后仍应查看 Git diff、重新编译并运行论文自己的检查流程。
-
$(circle-slash) TeXLeaf AI:总开关关闭,点击状态栏或运行切换命令。 -
$(shield) TeXLeaf AI:当前工作区未信任,先审阅项目内容,再由 VS Code 的 Workspace Trust 流程决定是否信任。 -
$(key) TeXLeaf AI:尚未确认正文传输或当前环境没有 Key,运行设置 Key/切换命令。 -
$(sparkle) TeXLeaf AI:运行条件已满足;tooltip 会显示当前模型和风格。
运行 TeXLeaf: 设置当前 AI 服务商 API Key 重新输入。确认没有前后多余字符、Key 未撤销,并且它属于当前 Provider 与当前规范化 Base URL。切换任一 Provider 的 Base URL 后必须为新目标单独确认并设置 Key;只有默认 DeepSeek 官方地址兼容旧 v1 凭据,自定义地址不会复用。ChatGPT 账号或订阅不能代替 OpenAI API Key。TeXLeaf 不会把服务端原始错误正文回显到日志。
在当前 API 服务商控制台检查余额、项目权限和计费状态。ChatGPT/Codex 订阅不能补充 DeepSeek 余额,也不等于 OpenAI API 额度。
服务端返回限流时稍后再试。可以提高两个防抖时间、关闭自动检查或行内补全,并减少整篇检查频率。DeepSeek 的错误说明见 API Error Codes;OpenAI 的错误分类见 API Error Codes。
确认当前扩展宿主能访问状态栏/consent 中显示的规范化目标。DeepSeek 访问当前 Base URL 下的 /chat/completions;OpenAI 访问当前 Base URL 下的 /responses。在 Remote/WSL/SSH/Dev Container 中,请求从运行扩展的宿主发出,代理、防火墙、证书或容器网络设置可能与本机不同。
自定义地址返回 404/405 或“不支持参数/响应格式”时,先按 Provider 确认协议:DeepSeek 目标必须实现 Chat Completions + JSON Output,OpenAI 目标必须实现 Responses + Structured Outputs。远程 HTTP、包含用户信息/查询/fragment、主机名尾随点,或路径已经以对应 /chat/completions//responses endpoint 结尾的 Base URL 会在本地被拒绝;只有 loopback 地址允许 HTTP,协议不兼容时不会回退到另一个 endpoint。
这是 0.8.5 的本地参数回归,不是服务端响应。旧控制器把包含中文输出要求的长说明误作 language 标签,而 DeepSeek/OpenAI 客户端会在 fetch 之前拒绝超过 64 字符的标签,因此两种 Provider 的自动检查、手动段落/选区检查、整篇检查、改写和行内补全都会失败;被拦截的尝试没有发送正文,也不会产生该次 API 请求费用。
安装当前 0.8.11(或任何 0.8.6+ 版本)并 Reload Window 后,设置只会映射为 auto、English、Chinese。不要通过更换 Key、充值或放宽 Base URL 来绕过这个错误。客户端仍会在联网前拒绝真正超过 64 字符或含换行/控制字符的直接标签;对应回归测试断言非法输入时 mock fetch 调用数为 0。
原文不会因此被自动修改。DeepSeek 仅对空内容或 JSON 语法无效自动重试一次;第二次仍失败即停止,schema/范围等安全错误不会自动重试。它只会剥离一个完整包住全部响应的单层 json fence,其他说明文字、多个/嵌套/不完整 fence 都会被拒绝。反复发生时缩小选区、使用较短段落或稍后重试。结构化响应仍会经过严格字段、长度、offset 与原文检查;单条坏建议被静默丢弃时,独立有效项仍可进入装饰线、专用 Hover 和问题树,Output 只报告丢弃数量和安全子码,不包含原始响应正文。
这表示 API 已返回候选,TeXLeaf 成功把其中 42 条精确映射到当前原文,并按 fail-closed 规则丢弃了 20 条重复、重叠、字段不安全或无法唯一定位的候选。它不表示 Key 无效、余额不足或请求认证失败,也不需要因此重设 Key 或充值。被忽略的候选从未进入可应用集合,原文没有被它们修改;可以在活动栏“AI 写作问题”中查看可审阅项和不含正文的拒绝摘要。
依次检查:
- 当前是否是受信任窗口中已有文件名和路径的
file:/vscode-remote:.tex,language ID 为latex/tex;注意发送的是当前编辑器内容,可能尚未落盘; -
texleaf.enabled与texleaf.aiWriting.enabled是否都开启; - 当前环境是否已经设置 Key;
-
automaticReview是否开启,或手动运行段落检查; - 当前段落是否只有数学、citation、命令或其他受保护内容;
- 段落是否超过上限;
- Output → TeXLeaf 是否报告认证、余额、限流、超时或响应错误;
- 模型也可能判断当前文本没有需要安全映射的问题。
AI 问题不进入 Problems 是当前 0.8.11 的设计边界,不是检查失败;请查看 TeXLeaf 活动栏“AI 写作问题”和编辑器中的装饰线。若公式附近误报“缺少宾语”,确认已升级到 0.8.11 并 Reload Window;请求中应只出现等长的 ⟦INLINE_FORMULA⟧ / ⟦DISPLAYED_FORMULA⟧ 一类语义占位,不能出现公式源码。
选区必须是连续纯正文,不能跨越数学、citation、命令、大括号或其他遮罩范围。缩小到命令之间的一句话再试。如果返回结果含 TeX 控制字符或请求期间文档已改变,TeXLeaf 会保留原文。
- 确认
inlineCompletions=true,以及 VS Code Inline Suggest 没有被全局关闭; - 把光标放在有足够上下文的普通正文末尾;
- 等待
completionDelayMs; - 普通 Suggest 正在选择候选时先关闭它;
- 尝试运行 TeXLeaf: 触发 AI 行内补全;
- 数学、命令和受保护参数中不显示是预期行为。
更多跨功能排查见 故障排查。
安装或升级到 0.8.11 后,建议用不含隐私的临时 .tex 做以下检查:
- 保持默认关闭,输入正文并等待,确认没有 AI 问题标记或任何 AI Provider 请求迹象;检查 14 个 AI 设置都只允许用户/Profile application 配置,并在工作区/文件夹/
.vscode/settings.json尝试注入总开关、Provider、两个 Base URL、模型、防抖和长度上限,确认运行时仍采用全局值。 - 在未信任工作区尝试手动命令,确认提示被阻止。
- 在 Untitled、
.bib和虚拟文档中尝试,确认不会发送。 - 分别使用 DeepSeek 官方/测试 Chat Completions endpoint 和 OpenAI 官方/测试 Responses endpoint 的非生产 Key,在
This result are clear.一类明显错误上运行段落检查,查看装饰线、TeXLeaf 专用 Hover、活动栏问题树与 Quick Fix;确认 Hover 显示“应用这条建议”,点击后仍经过后端版本、身份、范围、exactoriginal与 editable prose 校验,并确认 Problems 中没有重复 AI 项。 - 在
$x^2$、\cite{private-key}、\label{sec:test}、URL、注释和minted中放入可辨识测试字符串,确认它们不成为建议范围。 - 测试
\section{Bad sentence}或\caption{Bad sentence},确认只检查正文参数,不修改外围命令。 - 发出请求后立刻继续编辑,确认旧结果不覆盖新文档。
- 测试本次会话忽略、清除问题、关闭总开关和清除当前目标的 Key;分别切换 DeepSeek/OpenAI Base URL,确认不会复用上一地址或另一 Provider 的 Key/consent,并确认默认 DeepSeek 官方地址仍兼容旧
v1记录、自定义 DeepSeek 地址绝不兼容该记录。 - 测试纯正文选区改写,以及包含 citation/数学的选区被安全拒绝。
- 分别测试自动和手动行内补全,再关闭
inlineCompletions确认不再请求。 - 降低长度上限,确认超长段落/整篇检查会提示跳过或截断。
- 查看 Output → TeXLeaf,确认没有 API Key、请求正文或响应正文。
- 打开活动栏“AI 写作问题”,核对行号、类别、真实严重性、
原文 → 替换、简体中文 message/explanation、单条应用/忽略、pending 状态和安全忽略摘要;replacement 必须保持来源正文原语言。点击条目只滚动、不移动主光标。确认 TeXLeaf 不播放音频、不发布原生 Diagnostic、Problems 没有 AI 重复项,专用 Hover 只出现一份且树中真实严重性不变。 - 分别从 Command Palette 与视图工具栏运行“应用当前全部 AI 建议”,确认先弹出确认;确认前继续编辑时,过期结果不得产生任何修改。
- 用 mock/测试服务构造 42 条安全建议和 20 条重复、重叠或歧义候选,确认 UI 显示“42 条可审阅 + 20 条安全忽略”,且不报告 Key/余额错误、不自动改原文。
- 保持默认 900 毫秒,连续键入确认旧请求取消且不会每键联网;验证无 pending 时光标导航可选择附近句子,同版本同句子不会重复,每批不超过 8 句、每版本不超过 64 个不同句子。
- 先检查整篇,并在同一句制造两个相距较远的问题;只编辑其中一处后,old ∪ new 句子作为 pending/provider 上下文,但另一个不相交问题必须在 exact
original、strict remap 与 editable prose 成立时保留。再覆盖同事务多处编辑、零宽边界、累计 pending、句号/空行 split/merge 和第一句。第二句!第三句?;保存/空 change 不清结果,自动回应只替换命中 dirty range 或与新问题相交的旧项。 - 构造
one take→one takes一类词尾追加建议,分别应用单条和“应用全部”:写入成功后相应装饰线、Hover、Quick Fix、树项与缓存必须立即消失,同句其他不相交问题保留,重启后已消费项不得复活。再让在线结果及旧精确 hash 缓存用original: "take"、replacement: "takes"锚定当前takes的截短前缀,确认两条路径都逐条拒绝。 - 让 mock 批次前句成功、后句失败,确认成功句立即合并且不回滚,剩余句明确等待局部复检;手动整篇确认逐段保留成功结果且单次最多 32 个正文段。
- 记录
Take\n\\[C_{PRIVATE}=42\\]\nas the starting point.的 mock 请求:公式源码必须缺席,等长 display-formula 占位符必须仍位于同句上下文;命中 marker/padding 的建议必须拒绝,不能仅因保护公式而误报Take缺少宾语。 - 关闭文档并重启隔离扩展宿主,确认问题从当前 Profile 的
globalStorage恢复,但工作区、Settings Sync 和缓存中都没有论文全文。只有完整源码长度与 SHA-256 完全一致时才按原 offset 逐条恢复;离线/外部修改、hash/长度不匹配应整份丢弃并要求重检,禁止跨源 unique-original 搜索。再覆盖单条 exact/editable/截短 replacement 校验、2048 条/2 MiB/256 文档/32 MiB 上限、损坏缓存、停用 flush 和持久清除后的不复活。 - 在 Windows 微软拼音中文模式下把光标放在已有 Hover 的问题范围内,确认
Ctrl+.被输入法用于切换中英文标点并不代表 Provider 返回空;切换到英文输入模式后再试,同时验证F1/ Command Palette、右键、灯泡和 Hover 链接均能进入同一套安全应用路径。
创建 Issue 时请提供:
- TeXLeaf、VS Code、操作系统版本;
- Local/WSL/SSH/Dev Container 和扩展实际运行位置;
- 所选 Provider、模型、已匿名化的 Base URL 主机、语言、风格和相关长度/防抖设置;
- 错误类别、最小且已经匿名化的
.tex示例; - Output → TeXLeaf 中相关但已检查脱敏的日志;
- 是否能在新 Profile 中复现。
请勿提供 API Key、完整未公开论文、敏感研究数据、原始请求/响应、环境变量或整个 VS Code 用户目录。
开始
片段
AI 写作
文献
预览
贡献与发布
{ "texleaf.aiWriting.enabled": true, "texleaf.aiWriting.automaticReview": false, "texleaf.aiWriting.inlineCompletions": false, "texleaf.aiWriting.provider": "deepseek", "texleaf.aiWriting.deepseekModel": "deepseek-v4-flash", "texleaf.aiWriting.deepseekBaseUrl": "https://api.deepseek.com", "texleaf.aiWriting.language": "english", "texleaf.aiWriting.style": "academic", "texleaf.aiWriting.maxParagraphLength": 3000, "texleaf.aiWriting.maxDocumentLength": 12000 }