return {
  'saghen/blink.cmp',
  version = '*',
  enabled = function()
    return not vim.tbl_contains({
      "NvimTree",
      "Telescope",
      "TelescopePrompt",
    }, vim.bo.filetype) and vim.bo.buftype ~= "prompt" and vim.b.completion ~= false
  end,
  dependencies = {
    "fang2hou/blink-copilot",
    'Kaiser-Yang/blink-cmp-avante',
  },
  opts = {
    cmdline = {
      keymap = {
        preset = 'default',
        ['<Tab>'] = { 'show', 'accept' },
      },
      completion = { menu = { auto_show = true } },
    },

    -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept)
    -- 'super-tab' for mappings similar to vscode (tab to accept)
    -- 'enter' for enter to accept
    -- 'none' for no mappings
    --
    -- All presets have the following mappings:
    -- C-space: Open menu or open docs if already open
    -- C-n/C-p or Up/Down: Select next/previous item
    -- C-e: Hide menu
    -- C-k: Toggle signature help (if signature.enabled = true)
    --
    -- See :h blink-cmp-config-keymap for defining your own keymap
    keymap = {
      preset = 'default',
      ['<C-y>'] = { 'show', 'show_documentation', 'hide_documentation' },
      ['<Tab>'] = {
        function(cmp)
          if cmp.snippet_active() then return cmp.accept()
          else return cmp.select_and_accept() end
        end,
        'snippet_forward',
        'fallback'
      },
      ['<CR>'] = { 'accept', 'fallback' },
    },

    appearance = {
      -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font'
      -- Adjusts spacing to ensure icons are aligned
      nerd_font_variant = 'mono'
    },

    -- (Default) Only show the documentation popup when manually triggered
    completion = {
      list = {
        selection = { preselect = false, auto_insert = true }
      },
      documentation = { auto_show = true, window = { border = 'single' } },
      ghost_text = { enabled = false },
      menu = {
        border = 'single',
        draw = {
          padding = 2,
          treesitter = { 'lsp' },
          columns = {
            { "label", "label_description", gap = 2 },
            { "kind_icon", "kind", gap = 1}
          },
        }
      }
    },

    -- Default list of enabled providers defined so that you can extend it
    -- elsewhere in your config, without redefining it, due to `opts_extend`
    sources = {
      default = { 'avante', 'copilot', 'lsp', 'snippets', 'buffer' },
      providers = {
        copilot = {
          name = "copilot",
          module = "blink-copilot",
          score_offset = 100,
          async = true,
          opts = {
            kind_icon = "",
          }
        },
        avante = {
          module = 'blink-cmp-avante',
          name = 'Avante',
          opts = {
            -- options for blink-cmp-avante
          }
        }
      },
    },

    signature = {
      enabled = true,
      window = {
        border = "rounded",
      }
    },

    -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance
    -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation,
    -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"`
    --
    -- See the fuzzy documentation for more information
    fuzzy = { implementation = "prefer_rust_with_warning" }
  },
  opts_extend = { "sources.default" }
}
