add llm.nvim plugin
This commit is contained in:
parent
b14f61daaa
commit
e1a2c551ed
|
@ -16,6 +16,7 @@
|
||||||
"indent-blankline.nvim": { "branch": "master", "commit": "e7a4442e055ec953311e77791546238d1eaae507" },
|
"indent-blankline.nvim": { "branch": "master", "commit": "e7a4442e055ec953311e77791546238d1eaae507" },
|
||||||
"lazy.nvim": { "branch": "main", "commit": "1159bdccd8910a0fd0914b24d6c3d186689023d9" },
|
"lazy.nvim": { "branch": "main", "commit": "1159bdccd8910a0fd0914b24d6c3d186689023d9" },
|
||||||
"lazydev.nvim": { "branch": "main", "commit": "491452cf1ca6f029e90ad0d0368848fac717c6d2" },
|
"lazydev.nvim": { "branch": "main", "commit": "491452cf1ca6f029e90ad0d0368848fac717c6d2" },
|
||||||
|
"llm.nvim": { "branch": "main", "commit": "9832a149bdcf0709433ca9c2c3a1c87460e98d13" },
|
||||||
"lualine.nvim": { "branch": "master", "commit": "b431d228b7bbcdaea818bdc3e25b8cdbe861f056" },
|
"lualine.nvim": { "branch": "master", "commit": "b431d228b7bbcdaea818bdc3e25b8cdbe861f056" },
|
||||||
"luvit-meta": { "branch": "main", "commit": "ce76f6f6cdc9201523a5875a4471dcfe0186eb60" },
|
"luvit-meta": { "branch": "main", "commit": "ce76f6f6cdc9201523a5875a4471dcfe0186eb60" },
|
||||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "25c11854aa25558ee6c03432edfa0df0217324be" },
|
"mason-lspconfig.nvim": { "branch": "main", "commit": "25c11854aa25558ee6c03432edfa0df0217324be" },
|
||||||
|
|
140
nvim/lua/plugins/llm.lua
Normal file
140
nvim/lua/plugins/llm.lua
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
'huggingface/llm.nvim',
|
||||||
|
config = function()
|
||||||
|
local function get_stop_tokens(model)
|
||||||
|
if model:match '^codellama' then
|
||||||
|
return { '<PRE>', '<SUF>', '<MID>', '<EOT>' }
|
||||||
|
elseif model:match '^qwen' then
|
||||||
|
return {
|
||||||
|
'<|endoftext|>',
|
||||||
|
'<|fim_prefix|>',
|
||||||
|
'<|fim_middle|>',
|
||||||
|
'<|fim_suffix|>',
|
||||||
|
'<|fim_pad|>',
|
||||||
|
'<|repo_name|>',
|
||||||
|
'<|file_sep|>',
|
||||||
|
'<|im_start|>',
|
||||||
|
'<|im_end|>',
|
||||||
|
}
|
||||||
|
elseif model:match '^starcoder' then
|
||||||
|
return { '<fim_prefix>', '<fim_suffix>', '<fim_middle>', '<file_sep>', '<|endoftext|>' }
|
||||||
|
elseif model:match '^codestral' then
|
||||||
|
return { '[INST]', '[/INST]', '[PREFIX]', '[MIDDLE]', '[SUFFIX]' }
|
||||||
|
elseif model:match '^deepseek%-coder' then
|
||||||
|
return { '<|fim▁begin|>', '<|fim▁hole|>', '<|fim▁end|>', '<|end▁of▁sentence|>' }
|
||||||
|
elseif model:match '^granite%-code' then
|
||||||
|
return { 'System:', 'Question:', 'Answer:' }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_fim_options(model)
|
||||||
|
if model:match '^codellama' then
|
||||||
|
--return '<PRE> ' .. prefix .. ' <SUF>' .. suffix .. ' <MID>'
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '<PRE> ',
|
||||||
|
suffix = ' <SUF>',
|
||||||
|
middle = ' <MID>',
|
||||||
|
}
|
||||||
|
elseif model:match '^qwen' then
|
||||||
|
-- return '<|fim_prefix|>' .. prefix .. '<|fim_suffix|>' .. suffix .. '<|fim_middle|>'
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '<|fim_prefix|>',
|
||||||
|
suffix = '<|fim_suffix|>',
|
||||||
|
middle = '<|fim_middle|>',
|
||||||
|
}
|
||||||
|
elseif model:match '^starcoder' then
|
||||||
|
-- return '<fim_prefix>' .. prefix .. '<fim_suffix>' .. suffix .. '<fim_middle>'
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '<fim_prefix>',
|
||||||
|
suffix = '<fim_suffix>',
|
||||||
|
middle = '<fim_middle>',
|
||||||
|
}
|
||||||
|
elseif model:match '^codestral' then
|
||||||
|
-- return '[SUFFIX]' .. suffix .. '[PREFIX]' .. prefix
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '[PREFIX]',
|
||||||
|
suffix = '[SUFFIX]',
|
||||||
|
middle = '',
|
||||||
|
}
|
||||||
|
elseif model:match '^deepseek%-coder' then
|
||||||
|
-- return '<|fim▁begin|>' .. prefix .. '<|fim▁hole|>' .. suffix .. '<|fim▁end|>'
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '<|fim▁begin|>',
|
||||||
|
suffix = '<|fim▁hole|>',
|
||||||
|
middle = '<|fim▁end|>',
|
||||||
|
}
|
||||||
|
elseif model:match '^granite%-code' then
|
||||||
|
-- return '<fim_prefix> ' .. prefix .. '<fim_suffix> ' .. suffix .. '<fim_middle>'
|
||||||
|
return {
|
||||||
|
enabled = true,
|
||||||
|
prefix = '<fim_prefix> ',
|
||||||
|
suffix = '<fim_suffix> ',
|
||||||
|
middle = '<fim_middle>',
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local llama_base_url = os.getenv 'LLAMA_API_BASE' or 'http://localhost:11434'
|
||||||
|
local llama_api_key = os.getenv 'LLAMA_API_KEY'
|
||||||
|
local model = 'codellama:13b-code-q4_K_M'
|
||||||
|
-- local model = 'qwen2.5-coder:7b-base-q4_K_M'
|
||||||
|
-- local model = 'starcoder2:7b-q4_K_M'
|
||||||
|
-- local model = 'codestral:22b-v0.1-q4_K_M'
|
||||||
|
-- local model = 'deepseek-coder-v2:16b-lite-base-q4_K_M-fixed'
|
||||||
|
-- local model = 'granite-code:8b-base-q4_K_M'
|
||||||
|
|
||||||
|
require('llm').setup {
|
||||||
|
enable_suggestions_on_startup = false,
|
||||||
|
accept_keymap = '<Tab>',
|
||||||
|
dismiss_keymap = '<S-Tab>',
|
||||||
|
api_token = llama_api_key,
|
||||||
|
model = model,
|
||||||
|
backend = 'ollama',
|
||||||
|
url = llama_base_url .. '/api/generate',
|
||||||
|
tokens_to_clear = get_stop_tokens(model),
|
||||||
|
fim = get_fim_options(model),
|
||||||
|
debounce_ms = 500,
|
||||||
|
request_body = {
|
||||||
|
temperature = 0.2,
|
||||||
|
n = 1,
|
||||||
|
-- max_tokens = 256,
|
||||||
|
-- stop = get_stop_tokens(model),
|
||||||
|
},
|
||||||
|
lsp = {
|
||||||
|
-- NOTE: custom fork of llm-ls is required to use api keys with ollama (e.g. via open webui)
|
||||||
|
-- to install:
|
||||||
|
-- git clone https://code.blarg.ca/gered/llm-ls.git
|
||||||
|
-- cd llm-ls/
|
||||||
|
-- cargo install --path ./crates/llm-ls/ --locked
|
||||||
|
bin_path = os.getenv 'HOME' .. '/.cargo/bin/llm-ls',
|
||||||
|
-- host = '127.0.0.1',
|
||||||
|
-- port = 12345,
|
||||||
|
-- cmd_env = { LLM_LOG_LEVEL = 'INFO' },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local function map(mode, lhs, rhs, desc)
|
||||||
|
local opts = { silent = true, noremap = true, desc = desc or '' }
|
||||||
|
vim.keymap.set(mode, lhs, rhs, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
map('i', '<C-x>', '<Cmd>LLMSuggestion<CR>', 'Request LLM suggestion')
|
||||||
|
map('n', '<leader>ta', '<Cmd>LLMToggleAutoSuggest<CR>', 'Toggle: LLM [A]uto Suggestions')
|
||||||
|
map('i', '<Tab>', function()
|
||||||
|
local llm = require 'llm.completion'
|
||||||
|
if llm.shown_suggestion ~= nil then
|
||||||
|
llm.complete()
|
||||||
|
else
|
||||||
|
local keys = vim.api.nvim_replace_termcodes('<Tab>', true, false, true)
|
||||||
|
vim.api.nvim_feedkeys(keys, 'n', false)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in a new issue