Skip to content

feat(completion): 基于 DeepSeek FIM 实现行内代码补全 - #223

Open
liuwanwan1 wants to merge 1 commit into
Vizards:mainfrom
liuwanwan1:feat/fim-inline-completion
Open

feat(completion): 基于 DeepSeek FIM 实现行内代码补全#223
liuwanwan1 wants to merge 1 commit into
Vizards:mainfrom
liuwanwan1:feat/fim-inline-completion

Conversation

@liuwanwan1

Copy link
Copy Markdown

关联 Issue

Close #83

背景与思路

Issue #83 希望本扩展支持代码补全。两条可行路线:

  1. 等 Copilot 官方把 Inline Completions 开放给 BYOK 模型(microsoft/vscode#263535)——该 issue 至今仍为 open,短期不可行;
  2. 在扩展内自行实现——DeepSeek 官方提供专为代码补全设计的 FIM(Fill-In-the-Middle)接口,官方文档也推荐将其接入 Continue 等第三方插件。Continue / Tabby 已验证第三方扩展独立实现补全可达到可用水平。

因此本 PR 选择路线 2:基于 VS Code 稳定InlineCompletionItemProvider API(无需 proposed API)+ DeepSeek FIM 接口实现行内补全(幽灵文本,Tab 接受)。

实现方案

文件 改动
src/client/core.ts 新增非流式 fimCompletion() 方法:官方端点请求 /beta/completions,自定义 baseUrl 的兼容服务请求 /completions;复用现有错误归一化层与 AbortController 取消机制
src/types.ts 新增 DeepSeekFimRequest / DeepSeekFimResponse 类型
src/completion/provider.ts(新增) DeepSeekInlineCompletionProvider:截取光标前 8000 字符为 prompt、后 2000 字符为 suffix;300ms 防抖 + 取消;前缀延续缓存(用户接受部分建议后继续打字时直接复用剩余建议,不再发起请求)
src/runtime/completion.ts(新增)、src/runtime/lifecycle.ts 激活时对全部文件注册 Provider
src/config.tspackage.jsonpackage.nls*.json 新增 4 个配置项(见下),中英双语描述

新增配置项

  • deepseek-copilot.completion.enabled:是否启用补全,默认 开启,读取于每次请求,开关即时生效无需重启;
  • deepseek-copilot.completion.modelId:FIM 请求模型,默认 deepseek-v4-pro(官方 FIM 文档示例所用模型);
  • deepseek-copilot.completion.maxTokens:单次补全最大 token 数,默认 128(FIM 接口上限 4K);
  • deepseek-copilot.completion.debounceDelay:输入停顿后触发请求的延迟,默认 300ms。

关键取舍

  • 错误静默处理:补全在每次输入停顿时触发,若失败弹窗会非常干扰,因此失败仅写入日志(DeepSeek: 显示日志 可查),不打扰用户;
  • 未配置 API Key 时静默跳过,不主动弹配置引导;
  • 成本控制:防抖 + 前缀延续缓存最大限度减少请求次数;maxTokens 默认较小;
  • 默认模型选 pro 而非 flash:官方 FIM 文档示例仅出现 deepseek-v4-pro,flash 是否支持 FIM 未经证实,故默认保守,用户可自行切换。

验证

  • npm run compilenpm run lint 通过;
  • npm run format:check 全仓库(含未改动的 main)在 Windows 本地均报存量格式问题(疑似 CRLF 检出导致,上游 main 的 CI 为 success),本 PR 新增代码不在其列;
  • ⚠️ 诚实说明:我尚未在真实 VS Code 环境中运行验证补全交互效果,烦请 review 时帮忙实测:配置 API Key 后,在编辑器中输入代码停顿片刻,确认幽灵文本出现且 Tab 可接受。

后续可拓展(本 PR 不含)

  • 状态栏补全开关 / 补全请求计数;
  • 相邻文件(recently opened tabs)上下文,提升补全相关性;
  • microsoft/vscode#263535 落地,可迁移至 Copilot 官方补全管线。

Implement inline (ghost text) code completion using the DeepSeek FIM
endpoint (https://api-docs.deepseek.com/guides/fim_completion), closing
the feature requested in Vizards#83.

- Add non-streaming fimCompletion() to DeepSeekClient (/beta/completions
  on the official endpoint, /completions for compatible providers)
- Add DeepSeekInlineCompletionProvider with debounce, cancellation,
  prefix-continuation caching, and prefix/suffix context window
- Register the provider for all files; errors are logged, never shown
  as popups since completion fires on typing pauses
- New settings: completion.enabled (default on), completion.modelId
  (default deepseek-v4-pro), completion.maxTokens (128),
  completion.debounceDelay (300ms), with en/zh-cn descriptions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

不用用于代码补全么? Could not use this for code complete?

1 participant