-- Choose default model from a list of preferred models. Fall back to first -- available. local function preferred_model_picker(preferred) return function(self) if self == nil then -- Debug:render() calls Adapter.schema.model.default() but doesn't pass -- in `self`. Just return an empty string in this case. return "" end local choices = self.schema.model.choices(self) for _, best in ipairs(preferred) do for _, choice in ipairs(choices) do if choice:find(best, 1, true) then return choice end end end return choices[1] end end local IS_DEV = false return { { dir = IS_DEV and "~/Projects/research/codecompanion.nvim" or nil, "olimorris/codecompanion.nvim", dependencies = { "nvim-lua/plenary.nvim", "nvim-treesitter/nvim-treesitter", "ibhagwan/fzf-lua", -- For fzf provider, file or buffer picker "jellydn/spinner.nvim", -- Show loading spinner when request is started { "echasnovski/mini.diff", config = function() local diff = require "mini.diff" diff.setup { source = diff.gen_source.none() } end, }, { "ravitemer/mcphub.nvim", dependencies = { "nvim-lua/plenary.nvim", }, build = "npm install -g mcp-hub@latest", -- Installs `mcp-hub` node binary globally config = function() require("mcphub").setup() end, }, }, opts = { log_level = "TRACE", -- or "DEBUG" adapters = { ollama = function() return require("codecompanion.adapters").extend("ollama", { name = "tinyllama", env = { url = "http://127.0.0.1:11434", -- api_key = "", }, headers = { ["Content-Type"] = "application/json", -- ["Authorization"] = "Bearer ${api_key}", }, parameters = { sync = true, }, schema = { model = { default = preferred_model_picker { "qwen2.5-coder:14b", "qwen2.5-coder:7b", "qwen2.5-coder:3b", "qwen2.5-coder:1.5b", "qwen2.5-coder:0.5b", }, }, }, }) end, anthropic = function() return require("codecompanion.adapters").extend("anthropic", { env = { api_key = "cmd:echo $ANTHROPIC_API_KEY", }, schema = { model = { default = "claude-3-opus-20240229", }, }, }) end, copilot = function() return require("codecompanion.adapters").extend("copilot", { schema = { model = { default = "gpt-4.1", }, }, }) end, gemini = function() return require("codecompanion.adapters").extend("gemini", { env = { api_key = "cmd:op read op://personal/Gemini_API/credential --no-newline", }, }) end, openai = function() return require("codecompanion.adapters").extend("openai", { env = { api_key = "cmd:echo $OPENAI_API_KEY", chat_url = "/v1/chat/completions", url = "https://api.openai.com", }, schema = { model = { default = function() return "gpt-4o-mini" end, }, }, }) end, openai_compatible = function() return require("codecompanion.adapters").extend("openai_compatible", { env = { api_key = "cmd:echo $OPENAI_API_KEY", chat_url = "/v1/chat/completions", url = "http://127.0.0.1:8012", }, headers = { ["Content-Type"] = "application/json", }, schema = { model = { default = function() return "davinci" end, }, }, }) end, xai = function() return require("codecompanion.adapters").extend("xai", { env = { api_key = "cmd:op read op://personal/xAI_API/credential --no-newline", }, }) end, deepseek = function() return require("codecompanion.adapters").extend("openai_compatible", { env = { api_key = "cmd:echo $AZ_DS_API_KEY", url = "https://DeepSeek-R1-ajfsk.eastus2.models.ai.azure.com", }, schema = { model = { default = "deepseek-chat", }, }, }) end, -- deepseek = function() -- return require("codecompanion.adapters").extend("deepseek", { -- env = { -- api_key = "cmd:echo $OPENAI_API_KEY", -- chat_url = "/v1/chat/completions", -- url = "http://127.0.0.1:8012", -- }, -- headers = { -- ["Content-Type"] = "application/json", -- }, -- schema = { -- model = { -- default = function() -- return "davinci" -- end, -- }, -- }, -- }) -- end, azure_openai = function() return require("codecompanion.adapters").extend("azure_openai", { env = { api_key = "cmd:echo $AZ_DS_API_KEY", endpoint = "https://DeepSeek-R1-nphob.eastus2.models.ai.azure.com", }, schema = { model = { default = "DeepSeek-R1-nphob", }, }, }) end, }, display = { diff = { provider = "mini_diff", }, }, strategies = { chat = { adapter = "copilot", -- roles = { llm = " Copilot Chat", user = "IT Man" }, }, inline = { adapter = "copilot" }, agent = { adapter = "copilot" }, }, }, config = function(_, options) require("codecompanion").setup(options) require("codecompanion").setup { extensions = { mcphub = { callback = "mcphub.extensions.codecompanion", opts = { make_vars = true, make_slash_commands = true, show_result_in_chat = true, }, }, }, } -- Show loading spinner when request is started local spinner = require "spinner" local group = vim.api.nvim_create_augroup("CodeCompanionHooks", {}) vim.api.nvim_create_autocmd({ "User" }, { pattern = "CodeCompanionRequest*", group = group, callback = function(request) if request.match == "CodeCompanionRequestStarted" then spinner.show() end if request.match == "CodeCompanionRequestFinished" then spinner.hide() end end, }) end, }, }