/hfcc.nvim

Hugging Face Code Completion for neovim

Primary LanguageLuaApache License 2.0Apache-2.0

🤗 Hugging Face Code Completion for Neovim

WIP: this is a PoC at the moment

hfcc.nvim is an autocompletion plugin similar to Copilot with the added benefit of letting you pick your model on the Hugging Face Hub.

You can also use any HTTP endpoint you want, provided it adheres to the API specified here.

This project is influenced by copilot.lua and tabnine-nvim

demonstration use of hfcc.nvim

Install

  1. Create and get your API token from here https://huggingface.co/settings/tokens.

  2. Define how the plugin will read your token. For this you have multiple options, in order of precedence:

    1. Pass api_token = <your token> in plugin opts - this is not recommended if you use a versioning tool for your configuration files
    2. Set the HUGGING_FACE_HUB_TOKEN environment variable
    3. You can define your HF_HOME environment variable and create a file containing your token at $HF_HOME/token
    4. Install the huggingface-cli and run huggingface-cli login - this will prompt you to enter your token and set it at the right path
  3. Choose your model on the Hugging Face Hub, and, in order of precedence, you can either:

    1. Set the HUGGING_FACE_HUB_MODEL environment variable
    2. Pass model = <model token> in plugin opts

Using packer

require("packer").startup(function(use)
  use {
    'huggingface/hfcc.nvim',
    config = function()
      require('hfcc').setup({
        -- cf Setup
      })
    end
  }
end)

Using lazy.nvim

require("lazy").setup({
  {
    'huggingface/hfcc.nvim',
    opts = {
      -- cf Setup
    }
  },
})

Using vim-plug

Plug 'huggingface/hfcc.nvim'
require('hfcc').setup({
  -- cf Setup
})

Setup

local hfcc = require('hfcc')

hfcc.setup({
  api_token = nil, -- cf Install paragraph
  model = "bigcode/starcoder", -- can be a model ID or an http(s) endpoint
  -- parameters that are added to the request body
  query_params = {
    max_new_tokens = 60,
    temperature = 0.2,
    top_p = 0.95,
    stop_token = "<|endoftext|>",
  },
  -- set this if the model supports fill in the middle
  fim = {
    enabled = true,
    prefix = "<fim_prefix>",
    middle = "<fim_middle>",
    suffix = "<fim_suffix>",
  },
  debounce_ms = 80,
  accept_keymap = "<Tab>",
  dismiss_keymap = "<S-Tab>",
  max_context_after = 5000,
  max_context_before = 5000,
  tls_skip_verify_insecure = false,
})

Commands

There are currently two commands:

  • HFccSuggestion which was left in case people depended on it, depending on feedback will probably be removed
  • HFccToggleAutoSuggest which enables/disables insert mode suggest-as-you-type suggestions