-
-
Notifications
You must be signed in to change notification settings - Fork 297
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d4ae1e3
commit 277dbeb
Showing
2 changed files
with
1,244 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,259 @@ | ||
{ lib, ... }: | ||
let | ||
inherit (lib.nixvim) | ||
defaultNullOpts | ||
mkNullOrStr' | ||
mkNullOrStr | ||
; | ||
inherit (lib) types; | ||
in | ||
lib.nixvim.neovim-plugin.mkNeovimPlugin { | ||
name = "codecompanion"; | ||
originalName = "codecompanion.nvim"; | ||
package = "codecompanion-nvim"; | ||
|
||
maintainers = [ lib.maintainers.GaetanLepage ]; | ||
|
||
settingsOptions = { | ||
adapters = defaultNullOpts.mkAttrsOf' { | ||
type = types.anything; | ||
pluginDefault = { | ||
anthropic = "anthropic"; | ||
azure_openai = "azure_openai"; | ||
copilot = "copilot"; | ||
gemini = "gemini"; | ||
ollama = "ollama"; | ||
openai = "openai"; | ||
xai = "xai"; | ||
non_llms = { | ||
jina = "jina"; | ||
}; | ||
opts = { | ||
allow_insecure = false; | ||
proxy = null; | ||
}; | ||
}; | ||
example = { | ||
openai.__raw = '' | ||
function() | ||
return require("codecompanion.adapters").extend("openai", { | ||
schema = { | ||
model = { | ||
default = "gpt-4o" | ||
} | ||
} | ||
}) | ||
end | ||
''; | ||
ollama.__raw = '' | ||
function() | ||
return require("codecompanion.adapters").extend("ollama", { | ||
schema = { | ||
model = { | ||
default = "llama3:latest" | ||
} | ||
} | ||
}) | ||
end | ||
''; | ||
}; | ||
description = '' | ||
In CodeCompanion, adapters are interfaces that act as a bridge between the plugin's | ||
functionality and an LLM. | ||
Refer to the [documentation](https://github.com/olimorris/codecompanion.nvim/blob/main/doc/ADAPTERS.md) | ||
to learn about the adapters spec. | ||
''; | ||
}; | ||
|
||
strategies = defaultNullOpts.mkAttrsOf' { | ||
type = types.anything; | ||
pluginDefault = lib.literalExpression "See upstream documentation"; | ||
example = { | ||
chat.adapter = "ollama"; | ||
inline.adapter = "ollama"; | ||
agent.adapter = "ollama"; | ||
}; | ||
description = '' | ||
The plugin utilises objects called Strategies. | ||
These are the different ways that a user can interact with the plugin. | ||
- The _chat_ strategy harnesses a buffer to allow direct conversation with the LLM. | ||
- The _inline_ strategy allows for output from the LLM to be written directly into a | ||
pre-existing Neovim buffer. | ||
- The _agent_ and _workflow_ strategies are wrappers for the _chat_ strategy, allowing | ||
for tool use and agentic workflows. | ||
''; | ||
}; | ||
|
||
prompt_library = defaultNullOpts.mkAttrsOf' { | ||
type = types.submodule { | ||
freeformType = with types; attrsOf anything; | ||
options = { | ||
strategy = mkNullOrStr '' | ||
The plugin utilises objects called Strategies. | ||
These are the different ways that a user can interact with the plugin. | ||
- The _chat_ strategy harnesses a buffer to allow direct conversation with the LLM. | ||
- The _inline_ strategy allows for output from the LLM to be written directly into a | ||
pre-existing Neovim buffer. | ||
- The _agent_ and _workflow_ strategies are wrappers for the _chat_ strategy, allowing | ||
for tool use and agentic workflows. | ||
''; | ||
|
||
description = mkNullOrStr' { | ||
description = '' | ||
A description for this recipe. | ||
''; | ||
example = "Explain the LSP diagnostics for the selected code"; | ||
}; | ||
}; | ||
}; | ||
pluginDefault = lib.literalExpression "See upstream documentation"; | ||
example = { | ||
"Custom Prompt" = { | ||
strategy = "inline"; | ||
description = "Prompt the LLM from Neovim"; | ||
opts = { | ||
index = 3; | ||
is_default = true; | ||
is_slash_cmd = false; | ||
user_prompt = true; | ||
}; | ||
prompts = [ | ||
{ | ||
role.__raw = "system"; | ||
content.__raw = '' | ||
function(context) | ||
return fmt( | ||
[[I want you to act as a senior %s developer. I will ask you specific questions and I want you to return raw code only (no codeblocks and no explanations). If you can't respond with code, respond with nothing]], | ||
context.filetype | ||
) | ||
end | ||
''; | ||
opts = { | ||
visible = false; | ||
tag = "system_tag"; | ||
}; | ||
} | ||
]; | ||
}; | ||
"Generate a Commit Message" = { | ||
strategy = "chat"; | ||
description = "Generate a commit message"; | ||
opts = { | ||
index = 10; | ||
is_default = true; | ||
is_slash_cmd = true; | ||
short_name = "commit"; | ||
auto_submit = true; | ||
}; | ||
prompts = [ | ||
{ | ||
role = "user"; | ||
content.__raw = '' | ||
function() | ||
return fmt( | ||
[[You are an expert at following the Conventional Commit specification. Given the git diff listed below, please generate a commit message for me: | ||
```diff | ||
%s | ||
``` | ||
]], | ||
vim.fn.system("git diff --no-ext-diff --staged") | ||
) | ||
end | ||
''; | ||
opts = { | ||
contains_code = true; | ||
}; | ||
} | ||
]; | ||
}; | ||
}; | ||
description = '' | ||
The plugin comes with a number of pre-built prompts. | ||
As per the config, these can be called via keymaps or via the cmdline. | ||
These prompts have been carefully curated to mimic those in GitHub's Copilot Chat. | ||
Of course, you can create your own prompts and add them to the Action Palette or even to the | ||
slash command completion menu in the chat buffer. | ||
Please see the [RECIPES](https://github.com/olimorris/codecompanion.nvim/blob/main/doc/RECIPES.md) | ||
guide for more information. | ||
''; | ||
}; | ||
|
||
display = defaultNullOpts.mkNullable' { | ||
type = types.submodule { | ||
freeformType = with types; attrsOf anything; | ||
}; | ||
example = { | ||
display = { | ||
action_palette = { | ||
provider = "default"; | ||
opts.show_default_prompt_library = true; | ||
}; | ||
chat = { | ||
window = { | ||
layout = "vertical"; | ||
opts.breakindent = true; | ||
}; | ||
}; | ||
}; | ||
}; | ||
pluginDefault = lib.literalExpression "See upstream documentation"; | ||
description = '' | ||
Appearance settings. | ||
''; | ||
}; | ||
|
||
opts = defaultNullOpts.mkNullable' { | ||
type = types.submodule { | ||
freeformType = with types; attrsOf anything; | ||
}; | ||
description = '' | ||
General settings for the plugin. | ||
''; | ||
example = { | ||
log_level = "TRACE"; | ||
send_code = true; | ||
use_default_actions = true; | ||
use_default_prompts = true; | ||
}; | ||
pluginDefault = lib.literalExpression "See upstream documentation"; | ||
}; | ||
}; | ||
|
||
settingsExample = { | ||
adapters = { | ||
ollama.__raw = '' | ||
function() | ||
return require('codecompanion.adapters').extend('ollama', { | ||
env = { | ||
url = "http://127.0.0.1:11434", | ||
}, | ||
schema = { | ||
model = { | ||
default = 'qwen2.5-coder:latest', | ||
-- default = "llama3.1:8b-instruct-q8_0", | ||
}, | ||
num_ctx = { | ||
default = 32768, | ||
}, | ||
}, | ||
}) | ||
end | ||
''; | ||
}; | ||
strategies = { | ||
chat.adapter = "ollama"; | ||
inline.adapter = "ollama"; | ||
agent.adapter = "ollama"; | ||
}; | ||
opts = { | ||
log_level = "TRACE"; | ||
send_code = true; | ||
use_default_actions = true; | ||
use_default_prompts = true; | ||
}; | ||
}; | ||
} |
Oops, something went wrong.