Compare commits

...

4 Commits

Author SHA1 Message Date
Sam 8561f44963 update flake.lock 2024-10-28 17:52:45 +00:00
Sam dde54c9aa7 Add lib to configuration 2024-10-28 17:52:29 +00:00
Sam 16436da1e4 Update nixvim configuration to use unstable Neovim package 2024-10-28 17:51:42 +00:00
Sam 13dad7b532 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
2024-10-28 17:46:09 +00:00
4 changed files with 107 additions and 8 deletions

View File

@ -427,11 +427,11 @@
}, },
"nix-secrets": { "nix-secrets": {
"locked": { "locked": {
"lastModified": 1729849584, "lastModified": 1730130467,
"narHash": "sha256-byrCBtIcqFLEUoLCAli5g4w1allf4kPrxFV7+3jenCI=", "narHash": "sha256-mcyG1iu8hNmkDjgDEdFQyCZ3bBxBHFKd4nxT8NreMmY=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "97c60da5f7e750b8d4cdcaacee4dfab393cabb94", "rev": "c82ff6f7e995503acabb9cf2478e5b4e401968ce",
"revCount": 187, "revCount": 188,
"type": "git", "type": "git",
"url": "ssh://git@git.bitlab21.com/sam/nix-secrets.git" "url": "ssh://git@git.bitlab21.com/sam/nix-secrets.git"
}, },
@ -549,11 +549,11 @@
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1729100089, "lastModified": 1729945968,
"narHash": "sha256-B44+e/cYjrzgaDvCNz9TyHQy0q9Q6WaDISV57jxejJ8=", "narHash": "sha256-4u+nbBSMuXWGCtXxUPPEflRm54+y/HLIbhIep9do8Ew=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixvim", "repo": "nixvim",
"rev": "341dbb1b5867adb95d75e6dabef6627eb0eae38e", "rev": "c05ac01070425ed0797b1ff678dc690c333cea74",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -1,4 +1,4 @@
{ pkgs, inputs, outputs, ... }: { pkgs, inputs, outputs, lib, ... }:
{ {
imports = [ imports = [
inputs.nix-colors.homeManagerModules.default inputs.nix-colors.homeManagerModules.default

View File

@ -28,6 +28,7 @@
]; ];
programs.nixvim = { programs.nixvim = {
enable = true; enable = true;
package = pkgs.unstable.neovim-unwrapped;
enableMan = true; # install man pages for nixvim options enableMan = true; # install man pages for nixvim options
clipboard.register = "unnamedplus"; # use system clipboard instead of internal registers clipboard.register = "unnamedplus"; # use system clipboard instead of internal registers
globals.mapleader = " "; globals.mapleader = " ";

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,
}
}
''; '';
} }