Update: Add Mistral API key and Parrot.nvim plugin

- Introduce Mistral API key
- Add Parrot.nvim plugin
- Implement a function to read the API key from a secrets file
- Set up Parrot.nvim with Mistral provider and custom hooks for code assistance and git commit generation
This commit is contained in:
Sam 2024-10-28 17:46:09 +00:00
parent a9f321a847
commit 13dad7b532
1 changed files with 98 additions and 0 deletions

View File

@ -1,10 +1,18 @@
{ {
pkgs, pkgs,
config, config,
lib,
inputs,
... ...
}: let }: let
user = config.home.username; user = config.home.username;
mistralAPIKey = lib.optionalString (lib.hasAttr "sops-nix" inputs) config.sops.secrets."mistral-api-key".path;
in { in {
sops.secrets = {
"mistral-api-key" = {
};
};
imports = [ imports = [
./cmp.nix ./cmp.nix
./colorizer.nix ./colorizer.nix
@ -32,6 +40,18 @@ in {
pkgs.vimPlugins.vim-dadbod-ui pkgs.vimPlugins.vim-dadbod-ui
pkgs.vimPlugins.vim-dadbod-completion pkgs.vimPlugins.vim-dadbod-completion
pkgs.vimPlugins.fugitive pkgs.vimPlugins.fugitive
(pkgs.vimUtils.buildVimPlugin
{
name = "parrot.nvim";
src = pkgs.fetchFromGitHub {
owner = "frankroeder";
repo = "parrot.nvim";
rev = "c992483";
sha256 = "sha256-P899qNY/h5LTW0pp3sAmcSDsDGWQedXa20J7EggL7F8=";
};
})
(pkgs.vimUtils.buildVimPlugin (pkgs.vimUtils.buildVimPlugin
{ {
name = "buffer_manager.nvim"; name = "buffer_manager.nvim";
@ -58,6 +78,18 @@ in {
pkgs.vimPlugins.vim-devicons pkgs.vimPlugins.vim-devicons
]; ];
programs.nixvim.extraConfigLua = '' programs.nixvim.extraConfigLua = ''
-- function to read api key from secrets file
local function read_api_key(file_path)
local file = io.open(file_path, "r")
if file then
local api_key = file:read("*all")
file:close()
return api_key
else
error("Failed to open file: " .. file_path)
end
end
-- buffer_manager.nvim -- buffer_manager.nvim
local opts = {noremap = true} local opts = {noremap = true}
@ -123,5 +155,71 @@ in {
end end
require("conform").format({ async = true, lsp_format = "fallback", range = range }) require("conform").format({ async = true, lsp_format = "fallback", range = range })
end, { range = true }) end, { range = true })
-- parrot.nvim setup
require("parrot").setup {
toggle_target = "popup",
providers = {
mistral = {
api_key = read_api_key("${mistralAPIKey}"),
params = {
chat = { temperature = 0, top_p = 1, max_tokens = 16384 },
command = { temperature = 0, top_p = 1, max_tokens = 16384 },
},
-- api_key = os.getenv "MISTRAL_API_KEY",
},
},
hooks = {
AskCoder = function(prt, params)
local prompt = [[
You are a code assistent. Answer my question carefully and concisely.
Answer with code snippets only. Do not give a summary or include any
code comments in your response. Never repeate code from a prevous
response or write obvious or unnecessary code, instead refer to such
code like: "**rest of code here**", or something to that effect.
Tokens are expensive, to we need to be very consice. If you uses
excessive tokens, then I will send you the invoice to pay the bill.
Question: {{command}}
```
]]
prt.ChatNew(params, prompt)
end,
AskCoderSel = function(parrot, params)
local template = [[
You are an expert programmer. Here is a code snippet along with a
question. Give me a short, accurate and consice answer.
```{{filetype}}
{{selection}}
```
]]
local model_obj = parrot.get_model("command")
parrot.logger.info("Asking model: " .. model_obj.name)
parrot.Prompt(params, parrot.ui.Target.popup, model_obj, "🤖 Ask ~ ", template)
end,
GitCommit = function(parrot, params)
local template = [[
You are a git commit generator. You will be provided with a git diff file.
Your role is to create a concise commit message that outlines all of the
most relevant and impactful changes in the diff. You only output a commit
message, do not write anything else not related to the commit. Use
imperative mood for you writing style. Your message should include a
short summary in the first line followed by more detailed descriptions of
the changes on subsequent lines. The first line summary should be no more
than 70 characters, not end with a period, and a blank line should
separate the summary from the body of the message. There should only be 1
summary line, and 1 body with the description. The body should include no
more than 3 bullet points with more detailed descriptions of the files
and functions that have been modified. Do not output any code.
Diff: {{selection}}
]]
local model_obj = parrot.get_model("command")
parrot.logger.info("Asking model: " .. model_obj.name)
parrot.Prompt(params, parrot.ui.Target.popup, model_obj, nil, template)
end,
}
}
''; '';
} }