Gered
4871f87d97
matching what the continue.dev plugin code specifies for this. seems to work ok (but starcoder still seems poor overall)
229 lines
8.7 KiB
Lua
229 lines
8.7 KiB
Lua
return {
|
||
{ -- Autocompletion
|
||
'hrsh7th/nvim-cmp',
|
||
event = 'InsertEnter',
|
||
dependencies = {
|
||
-- Snippet Engine & its associated nvim-cmp source
|
||
{
|
||
'L3MON4D3/LuaSnip',
|
||
build = (function()
|
||
-- Build Step is needed for regex support in snippets.
|
||
-- This step is not supported in many windows environments.
|
||
-- Remove the below condition to re-enable on windows.
|
||
if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then
|
||
return
|
||
end
|
||
return 'make install_jsregexp'
|
||
end)(),
|
||
dependencies = {
|
||
-- `friendly-snippets` contains a variety of premade snippets.
|
||
-- See the README about individual language/framework/plugin snippets:
|
||
-- https://github.com/rafamadriz/friendly-snippets
|
||
-- {
|
||
-- 'rafamadriz/friendly-snippets',
|
||
-- config = function()
|
||
-- require('luasnip.loaders.from_vscode').lazy_load()
|
||
-- end,
|
||
-- },
|
||
},
|
||
},
|
||
'saadparwaiz1/cmp_luasnip',
|
||
|
||
-- Adds other completion capabilities.
|
||
-- nvim-cmp does not ship with all sources by default. They are split
|
||
-- into multiple repos for maintenance purposes.
|
||
'hrsh7th/cmp-nvim-lsp',
|
||
'hrsh7th/cmp-path',
|
||
'hrsh7th/cmp-nvim-lsp-signature-help',
|
||
|
||
{
|
||
-- 'milanglacier/minuet-ai.nvim',
|
||
-- dir = '~/code/minuet-ai.nvim',
|
||
url = 'ssh://git@code.blarg.ca:2250/gered/minuet-ai.git',
|
||
branch = 'openai_fim_fn_customizations',
|
||
config = function()
|
||
local function get_stop_tokens(model)
|
||
if model:match '^codellama' then
|
||
return { '\n\n', '<EOT>' }
|
||
elseif model:match '^qwen' then
|
||
return { '<|endoftext|>' }
|
||
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 nil
|
||
end
|
||
end
|
||
|
||
local function get_fim_prompt(model, prefix, suffix)
|
||
if model:match '^codellama' then
|
||
return '<PRE> ' .. prefix .. ' <SUF>' .. suffix .. ' <MID>'
|
||
elseif model:match '^qwen' then
|
||
return '<|fim_prefix|>' .. prefix .. '<|fim_suffix|>' .. suffix .. '<|fim_middle|>'
|
||
elseif model:match '^starcoder' then
|
||
return '<fim_prefix>' .. prefix .. '<fim_suffix>' .. suffix .. '<fim_middle>'
|
||
elseif model:match '^codestral' then
|
||
return '[SUFFIX]' .. suffix .. '[PREFIX]' .. prefix
|
||
elseif model:match '^deepseek%-coder' then
|
||
return '<|fim▁begin|>' .. prefix .. '<|fim▁hole|>' .. suffix .. '<|fim▁end|>'
|
||
end
|
||
end
|
||
|
||
local llama_base_url = os.getenv 'LLAMA_API_BASE' or 'http://localhost:11434'
|
||
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'
|
||
|
||
require('minuet').setup {
|
||
enabled = true,
|
||
provider = 'openai_fim_compatible',
|
||
context_window = 12800,
|
||
context_ratio = 0.75,
|
||
throttle = 1000,
|
||
debounce = 400,
|
||
notify = 'verbose',
|
||
request_timeout = 60,
|
||
add_single_line_entry = false,
|
||
n_completions = 1,
|
||
provider_options = {
|
||
openai_fim_compatible = {
|
||
model = model,
|
||
end_point = llama_base_url .. '/v1/chat/completions',
|
||
api_key = 'LLAMA_API_KEY',
|
||
name = 'Ollama',
|
||
stream = false,
|
||
optional = {
|
||
stop = get_stop_tokens(model),
|
||
max_tokens = 256,
|
||
temperature = 0.2,
|
||
n = 1,
|
||
},
|
||
prompt_fn = function(data, options, prefix, suffix)
|
||
data.messages = {
|
||
{
|
||
role = 'user',
|
||
content = get_fim_prompt(model, prefix, suffix),
|
||
},
|
||
}
|
||
--data.prompt = prefix
|
||
--data.suffix = suffix
|
||
end,
|
||
get_text_fn = function(json)
|
||
return json.choices[1].message.content
|
||
--return json.choices[1].text
|
||
end,
|
||
},
|
||
},
|
||
}
|
||
end,
|
||
},
|
||
},
|
||
config = function()
|
||
-- See `:help cmp`
|
||
local cmp = require 'cmp'
|
||
local types = require 'cmp.types'
|
||
local luasnip = require 'luasnip'
|
||
luasnip.config.setup {}
|
||
|
||
cmp.setup {
|
||
snippet = {
|
||
expand = function(args)
|
||
luasnip.lsp_expand(args.body)
|
||
end,
|
||
},
|
||
completion = { completeopt = 'menu,menuone,noinsert' },
|
||
|
||
-- For an understanding of why these mappings were
|
||
-- chosen, you will need to read `:help ins-completion`
|
||
--
|
||
-- No, but seriously. Please read `:help ins-completion`, it is really good!
|
||
mapping = cmp.mapping.preset.insert {
|
||
-- Disable use of <Up> and <Down> for navigation within a completion list.
|
||
['<Down>'] = cmp.mapping.close(),
|
||
['<Up>'] = cmp.mapping.close(),
|
||
|
||
-- Identical to old <Down> key behavior
|
||
['<C-j>'] = cmp.mapping.select_next_item { behavior = types.cmp.SelectBehavior.Select },
|
||
-- Identical to old <Up> key behavior
|
||
['<C-k>'] = cmp.mapping.select_prev_item { behavior = types.cmp.SelectBehavior.Select },
|
||
|
||
-- Select the [n]ext item
|
||
['<C-n>'] = cmp.mapping.select_next_item(),
|
||
-- Select the [p]revious item
|
||
['<C-p>'] = cmp.mapping.select_prev_item(),
|
||
|
||
-- Scroll the documentation window [b]ack / [f]orward
|
||
['<C-b>'] = cmp.mapping.scroll_docs(-4),
|
||
['<C-f>'] = cmp.mapping.scroll_docs(4),
|
||
|
||
-- Accept ([y]es) the completion.
|
||
-- This will auto-import if your LSP supports it.
|
||
-- This will expand snippets if the LSP sent a snippet.
|
||
['<C-y>'] = cmp.mapping.confirm { select = true },
|
||
|
||
-- Cancel/abort any selected/partial completion and close the completion list.
|
||
['<C-c>'] = cmp.mapping.abort(),
|
||
|
||
-- If you prefer more traditional completion keymaps,
|
||
-- you can uncomment the following lines
|
||
--['<CR>'] = cmp.mapping.confirm { select = true },
|
||
--['<Tab>'] = cmp.mapping.select_next_item(),
|
||
--['<S-Tab>'] = cmp.mapping.select_prev_item(),
|
||
|
||
-- Manually trigger a completion from nvim-cmp.
|
||
-- Generally you don't need this, because nvim-cmp will display
|
||
-- completions whenever it has completion options available.
|
||
['<C-Space>'] = cmp.mapping.complete {},
|
||
|
||
-- Think of <c-l> as moving to the right of your snippet expansion.
|
||
-- So if you have a snippet that's like:
|
||
-- function $name($args)
|
||
-- $body
|
||
-- end
|
||
--
|
||
-- <c-l> will move you to the right of each of the expansion locations.
|
||
-- <c-h> is similar, except moving you backwards.
|
||
['<C-l>'] = cmp.mapping(function()
|
||
if luasnip.expand_or_locally_jumpable() then
|
||
luasnip.expand_or_jump()
|
||
end
|
||
end, { 'i', 's' }),
|
||
['<C-h>'] = cmp.mapping(function()
|
||
if luasnip.locally_jumpable(-1) then
|
||
luasnip.jump(-1)
|
||
end
|
||
end, { 'i', 's' }),
|
||
|
||
-- explicit keybinding for minuet-ai completions
|
||
['<C-x>'] = require('minuet').make_cmp_map(),
|
||
|
||
-- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see:
|
||
-- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps
|
||
},
|
||
sources = {
|
||
{
|
||
name = 'lazydev',
|
||
-- set group index to 0 to skip loading LuaLS completions as lazydev recommends it
|
||
group_index = 0,
|
||
},
|
||
{
|
||
name = 'nvim_lsp',
|
||
entry_filter = function(entry, ctx)
|
||
-- do not show snippets in the completion list
|
||
return require('cmp').lsp.CompletionItemKind.Snippet ~= entry:get_kind()
|
||
end,
|
||
},
|
||
{ name = 'luasnip' },
|
||
{ name = 'path' },
|
||
{ name = 'nvim_lsp_signature_help' },
|
||
},
|
||
}
|
||
end,
|
||
},
|
||
}
|
||
|
||
-- vim: ts=2 sts=2 sw=2 et
|