{ config, ... }: { programs.nixvim = { plugins = { copilot-lua = { enable = true; settings.panel.enabled = false; settings.suggestion.enabled = false; settings.filetypes.markdown = true; }; copilot-chat.enable = true; codecompanion = { enable = true; settings = let get_base_secret = path: builtins.split "/" path |> builtins.tail |> builtins.filter (value: builtins.isString value) |> builtins.concatStringsSep "/"; in { adapters.copilot.__raw = # lua '' function() return require("codecompanion.adapters").extend("copilot", { schema = { model = { default = "claude-3.7-sonnet", }, max_tokens = { default = 65536, } } }) end ''; adapters.deepseek.__raw = # lua '' function() local deepseek_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.deepseek_token.path}", "r") local deepseek_api_key = deepseek_token_file:read() deepseek_token_file:close() return require("codecompanion.adapters").extend("deepseek", { env = { url = "https://api.deepseek.ai", api_key = deepseek_api_key, } }) end ''; adapters.siliconflow.__raw = # lua '' function () local siliconflow_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.siliconflow_token.path}", "r") local siliconflow_api_key = siliconflow_token_file:read() siliconflow_token_file:close() return require("codecompanion.adapters").extend("openai_compatible", { name = "siliconflow", env = { url = "https://api.siliconflow.cn", api_key = siliconflow_api_key, }, schema = { model = { default = "Pro/deepseek-ai/DeepSeek-V3", } } }) end ''; adapters.zjuchat.__raw = # lua '' function () local zjuchat_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.zjuchat_token.path}", "r") local zjuchat_api_key = zjuchat_token_file:read() zjuchat_token_file:close() return require("codecompanion.adapters").extend("openai_compatible", { name = "zjuchat", env = { url = "https://chat.zju.edu.cn/api/ai", api_key = zjuchat_api_key, }, schema = { model = { default = "deepseek-v3-671b", } } }) end ''; adapters.gemini.__raw = # lua '' function() local gemini_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.gemini_token.path}", "r") local gemini_api_key = gemini_token_file:read() gemini_token_file:close() return require("codecompanion.adapters").extend("gemini", { env = { api_key = gemini_api_key, }, schema = { model = { default = "gemini-2.0-flash-thinking-exp-01-21", } } }) end ''; strategies = { inline = { adapter = "siliconflow"; keymaps = { accept_change.modes.n = "ca"; reject_change.modes.n = "cr"; }; }; chat = { adapter = "siliconflow"; slash_commands.__raw = # lua '' { ["file"] = { opts = { provider = "telescope", }, }, }, { ["buffer"] = { opts = { provider = "telescope", }, }, }, ''; }; agent.adapter = "siliconflow"; }; }; }; }; keymaps = [ { mode = "n"; key = "ca"; action = ":CodeCompanionActions"; } { mode = "n"; key = "cc"; action = ":CodeCompanionChat Toggle"; } { mode = "n"; key = "ci"; action = ":CodeCompanion "; } ]; }; }