AI stuff
This commit is contained in:
@@ -2,117 +2,94 @@ vim.cmd [[cab cc CodeCompanion]]
|
||||
|
||||
return {
|
||||
'olimorris/codecompanion.nvim',
|
||||
opts = function(_, opts)
|
||||
opts.adapters = {
|
||||
gpt = function()
|
||||
return require('codecompanion.adapters').extend('copilot', {
|
||||
schema = {
|
||||
model = {
|
||||
default = 'gpt-4.1',
|
||||
},
|
||||
max_tokens = {
|
||||
default = 1000000,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
flash = function()
|
||||
return require('codecompanion.adapters').extend('copilot', {
|
||||
schema = {
|
||||
model = {
|
||||
default = 'gemini-2.0-flash-001',
|
||||
},
|
||||
max_tokens = {
|
||||
default = 1000000,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
gemini = function()
|
||||
return require('codecompanion.adapters').extend('copilot', {
|
||||
schema = {
|
||||
model = {
|
||||
default = 'gemini-2.5-pro',
|
||||
},
|
||||
max_tokens = {
|
||||
default = 1000000,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
sonnet = function()
|
||||
return require('codecompanion.adapters').extend('copilot', {
|
||||
schema = {
|
||||
model = {
|
||||
default = 'claude-3.7-sonnet',
|
||||
},
|
||||
max_tokens = {
|
||||
default = 1000000,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
|
||||
opts.display = {
|
||||
chat = {
|
||||
show_settings = true,
|
||||
start_in_insert_mode = false,
|
||||
},
|
||||
}
|
||||
|
||||
opts.strategies = {
|
||||
chat = {
|
||||
adapter = 'gpt',
|
||||
slash_commands = {
|
||||
-- codebase = require('vectorcode.integrations').codecompanion.chat.make_slash_command(),
|
||||
},
|
||||
tools = {
|
||||
-- vectorcode = {
|
||||
-- description = 'Run VectorCode to retrieve the project context.',
|
||||
-- callback = require('vectorcode.integrations').codecompanion.chat.make_tool(),
|
||||
-- },
|
||||
['cmd_runner'] = {
|
||||
opts = {
|
||||
requires_approval = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
roles = {
|
||||
---@type string|fun(adapter: CodeCompanion.Adapter): string
|
||||
llm = function(adapter)
|
||||
return 'CodeCompanion (' .. adapter.formatted_name .. ': ' .. adapter.parameters.model .. ')'
|
||||
config = function()
|
||||
require('codecompanion').setup {
|
||||
adapters = {
|
||||
http = {
|
||||
openrouter = function()
|
||||
return require('codecompanion.adapters').extend('openai_compatible', {
|
||||
env = {
|
||||
url = vim.env.DEFAULT_OPENAI_API_BASE,
|
||||
api_key = vim.env.DEFAULT_OPENAI_API_KEY,
|
||||
chat_url = '/v1/chat/completions',
|
||||
},
|
||||
schema = {
|
||||
model = {
|
||||
default = vim.env.DEFAULT_AI_MODEL,
|
||||
},
|
||||
max_tokens = {
|
||||
default = 1000000,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
},
|
||||
keymaps = {
|
||||
send = {
|
||||
modes = { n = '<C-s>', i = '<C-s>' },
|
||||
},
|
||||
display = {
|
||||
chat = {
|
||||
show_settings = true,
|
||||
start_in_insert_mode = false,
|
||||
},
|
||||
},
|
||||
strategies = {
|
||||
chat = {
|
||||
adapter = 'openrouter',
|
||||
slash_commands = {
|
||||
-- codebase = require('vectorcode.integrations').codecompanion.chat.make_slash_command(),
|
||||
},
|
||||
close = {
|
||||
modes = { n = '<C-c>', i = '<C-c>' },
|
||||
tools = {
|
||||
-- vectorcode = {
|
||||
-- description = 'Run VectorCode to retrieve the project context.',
|
||||
-- callback = require('vectorcode.integrations').codecompanion.chat.make_tool(),
|
||||
-- },
|
||||
['cmd_runner'] = {
|
||||
opts = {
|
||||
requires_approval = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
roles = {
|
||||
---@type string|fun(adapter: CodeCompanion.Adapter): string
|
||||
llm = function(adapter)
|
||||
return 'CodeCompanion (' .. adapter.formatted_name .. ': ' .. adapter.parameters.model .. ')'
|
||||
end,
|
||||
},
|
||||
keymaps = {
|
||||
send = {
|
||||
modes = { n = '<C-s>', i = '<C-s>' },
|
||||
},
|
||||
close = {
|
||||
modes = { n = '<C-c>', i = '<C-c>' },
|
||||
},
|
||||
},
|
||||
},
|
||||
inline = {
|
||||
adapter = {
|
||||
name = 'openrouter',
|
||||
model = vim.env.FAST_MODEL,
|
||||
},
|
||||
},
|
||||
cmd = {
|
||||
adapter = {
|
||||
name = 'openrouter',
|
||||
model = vim.env.FAST_MODEL,
|
||||
},
|
||||
},
|
||||
},
|
||||
inline = {
|
||||
adapter = 'flash',
|
||||
},
|
||||
}
|
||||
|
||||
opts.extensions = {
|
||||
mcphub = {
|
||||
callback = 'mcphub.extensions.codecompanion',
|
||||
opts = {
|
||||
show_result_in_chat = true,
|
||||
make_vars = true,
|
||||
make_slash_commands = true,
|
||||
extensions = {
|
||||
mcphub = {
|
||||
callback = 'mcphub.extensions.codecompanion',
|
||||
opts = {
|
||||
show_result_in_chat = true,
|
||||
make_vars = true,
|
||||
make_slash_commands = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
opts.system_prompt = function(opts)
|
||||
local language = opts.language or 'English'
|
||||
return string.format(
|
||||
[[You are an AI programming assistant named "CodeCompanion". You are currently plugged into the Neovim text editor on a user's machine.
|
||||
system_prompt = function(opts)
|
||||
local language = opts.language or 'English'
|
||||
return string.format(
|
||||
[[You are an AI programming assistant named "CodeCompanion". You are currently plugged into the Neovim text editor on a user's machine.
|
||||
|
||||
Your core tasks include:
|
||||
- Answering general programming questions.
|
||||
@@ -147,54 +124,53 @@ When given a task:
|
||||
3. End your response with a short suggestion for the next user turn that directly supports continuing the conversation.
|
||||
4. Provide exactly one complete reply per conversation turn.
|
||||
5. If necessary, execute multiple tools in a single turn.]],
|
||||
language
|
||||
)
|
||||
end
|
||||
|
||||
opts.prompt_library = {
|
||||
['Code Expert'] = {
|
||||
strategy = 'chat',
|
||||
description = 'Get some special advice from an LLM.',
|
||||
opts = {
|
||||
mapping = '<Leader>ce',
|
||||
modes = { 'v' },
|
||||
short_name = 'expert',
|
||||
auto_submit = true,
|
||||
stop_context_insertion = true,
|
||||
user_prompt = true,
|
||||
},
|
||||
prompts = {
|
||||
{
|
||||
role = 'system',
|
||||
content = function(context)
|
||||
return 'I want you to act as a senior'
|
||||
.. context.filetype
|
||||
.. 'developer I will ask you specific questions and I want you to return concise explanations and codeblock examples.'
|
||||
end,
|
||||
language
|
||||
)
|
||||
end,
|
||||
prompt_library = {
|
||||
['Code Expert'] = {
|
||||
strategy = 'chat',
|
||||
description = 'Get some special advice from an LLM.',
|
||||
opts = {
|
||||
mapping = '<Leader>ce',
|
||||
modes = { 'v' },
|
||||
short_name = 'expert',
|
||||
auto_submit = true,
|
||||
stop_context_insertion = true,
|
||||
user_prompt = true,
|
||||
},
|
||||
{
|
||||
role = 'user',
|
||||
content = function(context)
|
||||
local text = require('codecompanion.helpers.actions').get_code(context.start_line, context.end_line)
|
||||
prompts = {
|
||||
{
|
||||
role = 'system',
|
||||
content = function(context)
|
||||
return 'I want you to act as a senior'
|
||||
.. context.filetype
|
||||
.. 'developer I will ask you specific questions and I want you to return concise explanations and codeblock examples.'
|
||||
end,
|
||||
},
|
||||
{
|
||||
role = 'user',
|
||||
content = function(context)
|
||||
local text = require('codecompanion.helpers.actions').get_code(context.start_line, context.end_line)
|
||||
|
||||
return 'I have the following code:\n\n```' .. context.filetype .. '\n' .. text .. '\n```\n\n'
|
||||
end,
|
||||
opts = {
|
||||
contains_code = true,
|
||||
return 'I have the following code:\n\n```' .. context.filetype .. '\n' .. text .. '\n```\n\n'
|
||||
end,
|
||||
opts = {
|
||||
contains_code = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
['Games Master'] = {
|
||||
strategy = 'chat',
|
||||
description = 'A personal Games Master Assistant.',
|
||||
opts = {
|
||||
user_prompt = false,
|
||||
},
|
||||
prompts = {
|
||||
{
|
||||
role = 'system',
|
||||
content = [[
|
||||
['Games Master'] = {
|
||||
strategy = 'chat',
|
||||
description = 'A personal Games Master Assistant.',
|
||||
opts = {
|
||||
user_prompt = false,
|
||||
},
|
||||
prompts = {
|
||||
{
|
||||
role = 'system',
|
||||
content = [[
|
||||
You are a personal Games Master Assistant. You are currently plugged in to the Neovim text editor on a user's machine.
|
||||
|
||||
Your core tasks include:
|
||||
@@ -228,58 +204,58 @@ When given a task:
|
||||
2. Provide exactly one complete reply per conversation turn.
|
||||
3. If necessary, execute multiple tools in a single turn.
|
||||
]],
|
||||
},
|
||||
{
|
||||
role = 'user',
|
||||
content = '',
|
||||
},
|
||||
},
|
||||
},
|
||||
['PHPStan Fixer'] = {
|
||||
strategy = 'workflow',
|
||||
description = 'Use a workflow to fix PHPStan errors until there are none left.',
|
||||
opts = {
|
||||
short_name = 'phpstan',
|
||||
},
|
||||
prompts = {
|
||||
{
|
||||
},
|
||||
{
|
||||
name = 'Run PHPStan',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
content = '',
|
||||
},
|
||||
},
|
||||
},
|
||||
['PHPStan Fixer'] = {
|
||||
strategy = 'workflow',
|
||||
description = 'Use a workflow to fix PHPStan errors until there are none left.',
|
||||
opts = {
|
||||
short_name = 'phpstan',
|
||||
},
|
||||
prompts = {
|
||||
{
|
||||
{
|
||||
name = 'Run PHPStan',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
|
||||
return [[PHPStan is a static analysis tool for PHP. It is currently reporting errors in the code. Your task is to fix these errors and run PHPStan again until there are no errors left.
|
||||
return [[PHPStan is a static analysis tool for PHP. It is currently reporting errors in the code. Your task is to fix these errors and run PHPStan again until there are no errors left.
|
||||
|
||||
First of all use the @cmd_runner tool to run the `composer type-check` command. This will run PHPStan and output type errors in the code.]]
|
||||
end,
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
name = 'Fetch files',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
{
|
||||
name = 'Fetch files',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
|
||||
return 'PHPStan has reported errors. Look at the output and see where the files are reported. Use the @mcp tool to read all the offending files so you can implement the fixes.'
|
||||
end,
|
||||
return 'PHPStan has reported errors. Look at the output and see where the files are reported. Use the @mcp tool to read all the offending files so you can implement the fixes.'
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
name = 'Fix errors and run',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
{
|
||||
name = 'Fix errors and run',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
content = function()
|
||||
-- Enable turbo mode!!!
|
||||
vim.g.codecompanion_auto_tool_mode = true
|
||||
|
||||
return [[### Instructions
|
||||
return [[### Instructions
|
||||
Now you have the errors and the appropriate context you can fix the errors.
|
||||
|
||||
### Steps to Follow
|
||||
@@ -311,31 +287,32 @@ We'll repeat this cycle until there are no errors. Ensure no deviations from the
|
||||
- pick<T, TKeys> will create an array from T with only the keys in TKeys (e.g. pick<array{a: int, b: int, c: int}, 'a'|'b'> will create array{a: int, b: int})
|
||||
- except<T, TKeys> works like pick only it excludes the keys in TKeys (e.g. except<array{a: int, b: int, c: int}, 'a'|'b'> will create array{c: int})
|
||||
- union<T, U> creates a union array of T and U (e.g. union<array{a: int}, array{b: int}> will create array{a: int, b: int})]]
|
||||
end,
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
{
|
||||
name = 'Repeat On Failure',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
-- Scope this prompt to the cmd_runner tool
|
||||
condition = function()
|
||||
return _G.codecompanion_current_tool == 'cmd_runner'
|
||||
end,
|
||||
-- Repeat until the tests pass, as indicated by the testing flag
|
||||
-- which the cmd_runner tool sets on the chat buffer
|
||||
repeat_until = function(chat)
|
||||
-- Check if the last message in the chat buffer contains "[ERROR] found"
|
||||
local messages = chat.messages
|
||||
local last_message = messages[#messages]
|
||||
if last_message and last_message.role == 'assistant' then
|
||||
local content = last_message.content
|
||||
return not content:find '[ERROR] found'
|
||||
end
|
||||
return true
|
||||
end,
|
||||
content = 'PHPStan is still reporting errors. Edit the code to fix the errors and run PHPStan again.',
|
||||
{
|
||||
name = 'Repeat On Failure',
|
||||
role = 'user',
|
||||
opts = { auto_submit = false },
|
||||
-- Scope this prompt to the cmd_runner tool
|
||||
condition = function()
|
||||
return _G.codecompanion_current_tool == 'cmd_runner'
|
||||
end,
|
||||
-- Repeat until the tests pass, as indicated by the testing flag
|
||||
-- which the cmd_runner tool sets on the chat buffer
|
||||
repeat_until = function(chat)
|
||||
-- Check if the last message in the chat buffer contains "[ERROR] found"
|
||||
local messages = chat.messages
|
||||
local last_message = messages[#messages]
|
||||
if last_message and last_message.role == 'assistant' then
|
||||
local content = last_message.content
|
||||
return not content:find '[ERROR] found'
|
||||
end
|
||||
return true
|
||||
end,
|
||||
content = 'PHPStan is still reporting errors. Edit the code to fix the errors and run PHPStan again.',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user