return {
  {
    "milanglacier/minuet-ai.nvim",
    dependencies = {
      "nvim-treesitter/nvim-treesitter",
      "hrsh7th/nvim-cmp",
    },
    opts = {
      -- -- Enable or disable auto-completion. Note that you still need to add
      -- -- Minuet to your cmp sources. This option controls whether cmp will
      -- -- attempt to invoke minuet when minuet is included in cmp sources. This
      -- -- setting has no effect on manual completion; Minuet will always be
      -- -- enabled when invoked manually.
      enabled = true,
      provider = "codestral",
      -- provider = "gemini",
      -- -- the maximum total characters of the context before and after the cursor
      -- -- 12,800 characters typically equate to approximately 4,000 tokens for
      -- -- LLMs.
      -- context_window = 12800,
      -- -- when the total characters exceed the context window, the ratio of
      -- -- context before cursor and after cursor, the larger the ratio the more
      -- -- context before cursor will be used. This option should be between 0 and
      -- -- 1, context_ratio = 0.75 means the ratio will be 3:1.
      -- context_ratio = 0.75,
      -- throttle = 1000, -- only send the request every x milliseconds, use 0 to disable throttle.
      -- -- debounce the request in x milliseconds, set to 0 to disable debounce
      -- debounce = 400,
      -- -- show notification when request is sent or request fails. options:
      -- -- false to disable notification. Note that you should use false, not "false".
      -- -- "verbose" for all notifications.
      -- -- "warn" for warnings and above.
      -- -- "error" just errors.
      -- notify = "verbose",
      -- -- The request timeout, measured in seconds. When streaming is enabled
      -- -- (stream = true), setting a shorter request_timeout allows for faster
      -- -- retrieval of completion items, albeit potentially incomplete.
      -- -- Conversely, with streaming disabled (stream = false), a timeout
      -- -- occurring before the LLM returns results will yield no completion items.
      -- request_timeout = 3,
      -- -- if completion item has multiple lines, create another completion item only containing its first line.
      -- add_single_line_entry = true,
      -- -- The number of completion items (encoded as part of the prompt for the
      -- -- chat LLM) requested from the language model. It's important to note that
      -- -- when 'add_single_line_entry' is set to true, the actual number of
      -- -- returned items may exceed this value. Additionally, the LLM cannot
      -- -- guarantee the exact number of completion items specified, as this
      -- -- parameter serves only as a prompt guideline.
      -- n_completions = 3,
      -- -- Defines the length of non-whitespace context after the cursor used to
      -- -- filter completion text. Set to 0 to disable filtering.
      -- --
      -- -- Example: With after_cursor_filter_length = 3 and context:
      -- --
      -- -- "def fib(n):\n|\n\nfib(5)" (where | represents cursor position),
      -- --
      -- -- if the completion text contains "fib", then "fib" and subsequent text
      -- -- will be removed. This setting filters repeated text generated by the
      -- -- LLM. A large value (e.g., 15) is recommended to avoid false positives.
      -- after_cursor_filter_length = 15,
      -- -- proxy port to use
      -- proxy = nil,
      -- provider_options = {
      --   -- see the documentation in each provider in the following part.
      -- },
      -- -- see the documentation in the `System Prompt` section
      -- default_template = {
      --   template = "...",
      --   prompt = "...",
      --   guidelines = "...",
      --   n_completion_template = "...",
      -- },
      -- default_few_shots = { "..." },
    },
    config = function()
      require("minuet").setup({
        -- Your configuration options here
      })
    end,
  },
  {
    "hrsh7th/nvim-cmp",
    optional = true,
    opts = function(_, opts)
      opts.mapping = vim.tbl_extend("force", opts.mapping, {
        ["<M-y>"] = require("minuet").make_cmp_map(),
      })
      -- cmp.setup({
      --   mapping = {
      --     ["<M-y>"] = require("minuet").make_cmp_map(),
      --   },
      -- })

      -- For auto-completion, use `gemini-1.5-flash`
      -- table.insert(opts.sources, 1, { name = "minuet" })
      -- It is recommended to increase the timeout duration due to
      -- the typically slower response speed of LLMs compared to
      -- other completion sources. This is not needed when you only
      -- need manual completion.
      -- opts.performance.fetching_timeout = 2000
    end,
  },
  {
    "saghen/blink.cmp",
    optional = true,
    opts = {
      keymap = {
        ["<A-y>"] = {
          function(cmp)
            cmp.show({ providers = { "minuet" } })
          end,
        },
      },
      sources = {
        -- if you want to use auto-complete
        default = { "minuet" },
        providers = {
          minuet = {
            name = "minuet",
            module = "minuet.blink",
            score_offset = 100,
          },
        },
      },
    },
  },
}
