From 17c963ae53e371482e2c26e0510f90740feb2cd5 Mon Sep 17 00:00:00 2001 From: EdenQwQ Date: Tue, 4 Mar 2025 10:06:49 +0800 Subject: [PATCH] nixvim: add deepseek model --- home/programs/coding/nixvim/ai.nix | 175 +++++++++++++++++------------ secrets/age.nix | 1 + secrets/deepseek_token.age | 7 ++ secrets/secrets.nix | 4 + 4 files changed, 114 insertions(+), 73 deletions(-) create mode 100644 secrets/deepseek_token.age diff --git a/home/programs/coding/nixvim/ai.nix b/home/programs/coding/nixvim/ai.nix index 2c0e389..e666d57 100644 --- a/home/programs/coding/nixvim/ai.nix +++ b/home/programs/coding/nixvim/ai.nix @@ -14,89 +14,118 @@ copilot-chat.enable = true; codecompanion = { enable = true; - settings = { - adapters.copilot.__raw = - # lua - '' - function() - return require("codecompanion.adapters").extend("copilot", { - schema = { - model = { - default = "claude-3.7-sonnet", + 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, }, - max_tokens = { - default = 65536, + schema = { + model = { + default = "Pro/deepseek-ai/DeepSeek-V3", + } } - } - }) - end - ''; - adapters.siliconflow.__raw = - # lua - '' - function () - local siliconflow_token_file = io.open("${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 = "deepseek", - env = { - url = "https://api.siliconflow.cn", - api_key = siliconflow_api_key, - }, - schema = { - model = { - default = "Pro/deepseek-ai/DeepSeek-V3", + }) + 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 - ''; - adapters.gemini.__raw = - # lua - '' - function() - local gemini_token_file = io.open("${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, - } - }) - end - ''; - strategies = { - inline = { - adapter = "siliconflow"; - keymaps = { - accept_change.modes.n = "ca"; - reject_change.modes.n = "cr"; + }) + 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", + chat = { + adapter = "siliconflow"; + slash_commands.__raw = # lua + '' + { + ["file"] = { + opts = { + provider = "telescope", + }, }, }, - }, - { - ["buffer"] = { - opts = { - provider = "telescope", + { + ["buffer"] = { + opts = { + provider = "telescope", + }, }, }, - }, - ''; + ''; + }; + agent.adapter = "siliconflow"; }; - agent.adapter = "siliconflow"; }; - }; }; }; keymaps = [ diff --git a/secrets/age.nix b/secrets/age.nix index 8f6d201..a242e89 100644 --- a/secrets/age.nix +++ b/secrets/age.nix @@ -2,5 +2,6 @@ age.secrets = { siliconflow_token.file = ./siliconflow_token.age; gemini_token.file = ./gemini_token.age; + deepseek_token.file = ./deepseek_token.age; }; } diff --git a/secrets/deepseek_token.age b/secrets/deepseek_token.age new file mode 100644 index 0000000..e07c46d --- /dev/null +++ b/secrets/deepseek_token.age @@ -0,0 +1,7 @@ +age-encryption.org/v1 +-> ssh-ed25519 MpnI9A 4xxSWH3eQFCyMBPmaUq+tX8AkGS7m4S2lA2oRnMRcEo +XjMZQydQw5vVLQ4UThIx8G3y5EduJJnazK9CNNc+Nq8 +-> ssh-ed25519 6VlDkQ OkwnMmrklP8AKBfusZCa28wLLBvtKr6ZvIVDI9f2jzY +aNJXprFB4FB0mZhM+T7E4t8s5AxJwlm36hY6MNoSsho +--- p3rrTIgFlHr65N52qGY3/CcHAZXF82MRw1opFUMryvU +mfxrud[dnx,<+2e_5*uÉt4$jC» \ No newline at end of file diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 368f862..4cf784a 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -11,4 +11,8 @@ in eden eden-inspiron ]; + "deepseek_token.age".publicKeys = [ + eden + eden-inspiron + ]; }