必须通过Lua脚本模拟API调用并注入补全结果到LSP流程中才能启用Fitten Code的AI补全,否则Neovim无法识别任何建议;需验证API端点可用、配置有效API密钥、手动构造HTTP请求,并正确解析嵌套在choices[1].message.content中的completion字段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Neovim中启用Fitten Code的AI补全能力,必须绕过其官方不支持Neovim的限制,通过Lua脚本模拟API调用并注入补全结果到LSP流程中,否则编辑器无法识别任何AI建议。
确认Fitten Code服务可访问
打开终端执行 curl -s -o /dev/null -w "%{http_code}" https://api.fittentech.com/v1/chat/completions --head,返回 200 表示基础API端点可用;若返回 401 或 403,说明未配置有效 API Key 或账户未激活。
在 ~/.config/nvim/lua/config/fitten.lua 中创建空文件,准备写入集成逻辑。
这一步不可跳过——Fitten Code 的 Neovim 集成无官方 SDK,所有通信必须手动构造 HTTP 请求头与 payload,缺少认证将导致后续所有补全请求静默失败。
配置API密钥与基础请求参数
在 fitten.lua 中写入以下内容:
local api_key = os.getenv("FITEN_CODE_API_KEY") or "sk-xxx"
if not api_key or api_key == "sk-xxx" then error("FITEN_CODE_API_KEY 环境变量未设置或值为默认占位符") end
vim.g.fitten_api_key = api_key
【必须使用环境变量传入密钥,硬编码在配置中会导致Git泄露风险】
构建异步补全提供器
方法一:基于 nvim-cmp 的 source 扩展
确保已安装 nvim-cmp 和 cmp_lsp 插件;在 fitten.lua 中追加:
local cmp = require("cmp")
local json = vim.fn.json_encode
local function make_fitten_request(bufnr, input)
local payload = {
model = "fitten-pro",
messages = { { role = "user", content = "补全当前代码行末尾,只返回纯代码,不要解释:" .. input } },
temperature = 0.1,
max_tokens = 32
}
-- 构造curl命令并异步执行
local cmd = string.format('curl -s -X POST https://api.fittentech.com/v1/chat/completions -H "Authorization: Bearer %s" -H "Content-Type: application/json" -d %s', api_key, json(payload))
vim.fn.jobstart({ "sh", "-c", cmd }, { on_stdout = function(_, data) ... end })
end
方法二:复用 LSP 的 completion handler 接口(更轻量)
直接在 on_complete 回调中拦截 request,并用 vim.loop.spawn 启动子进程调用 curl,避免阻塞主线程。此方式无需额外插件依赖,但要求 Neovim ≥ 0.9。
Fitten Code 1.0.3是一款由清华博士团队打造的AI编程助手,基于国产计图(Jittor)深度学习框架开发。它支持VS Code、JetBrains系列等主流IDE及80多种编程语言。核心功能包括智能代码补全、注释生成、代码解释、Bug检测、单元测试生成等,旨在全方位提升开发效率。该工具对个人用户免费开放。
注意:Fitten Code 的响应格式与 OpenAI 兼容,但 completion 字段嵌套在 choices[1].message.content 内,解析时务必逐层取值,错一层就会返回 nil。
注册为 cmp source 并启用触发
第一步:定义 source 结构
local fitten_source = {
get_trigger_characters = function() return { "." } end,
get_priority = function() return 1000 end,
get_completions = function(fallback, snippet, ctx)
local line = vim.api.nvim_get_current_line()
local input = line:sub(1, ctx.col - 1):match(".*%S+") or ""
if #input
make_fitten_request(vim.api.nvim_get_current_buf(), input)
end
}
第二步:注入 cmp 配置
require("cmp").setup({
sources = {
{ name = "fitten", option = fitten_source },
{ name = "nvim_lsp" },
},
preselect = "none",
})
第三步:添加自动触发规则
vim.api.nvim_create_autocmd("TextChangedI", {
pattern = "*",
callback = function() vim.schedule(function() require("cmp").refresh() end) end,
})
这三步缺一不可——缺少 autocommand 将导致补全不会随输入实时刷新;缺少 get_trigger_characters 则无法在点号后自动唤起;而 priority 值低于 lsp 源会导致 AI 建议永远排在最后,肉眼不可见。

















