refactor: refactor planning prompts to resolve line number issues and indentation issues (#382)

This commit is contained in:
yetone
2024-08-30 18:53:49 +08:00
committed by GitHub
parent 07c1d707da
commit 2997d4669a
11 changed files with 339 additions and 324 deletions

View File

@@ -7,54 +7,24 @@ local M = {}
M.api_key_name = "ANTHROPIC_API_KEY"
M.parse_message = function(opts)
local code_prompt_obj = {
type = "text",
text = string.format("<code>```%s\n%s```</code>", opts.code_lang, opts.code_content),
}
---@param prompt_opts AvantePromptOptions
M.parse_message = function(prompt_opts)
local message_content = {}
if Utils.tokens.calculate_tokens(code_prompt_obj.text) > 1024 then
code_prompt_obj.cache_control = { type = "ephemeral" }
end
if opts.selected_code_content then
code_prompt_obj.text = string.format("<code_context>```%s\n%s```</code_context>", opts.code_lang, opts.code_content)
end
local message_content = {
code_prompt_obj,
}
if opts.selected_code_content then
local selected_code_obj = {
type = "text",
text = string.format("<code>```%s\n%s```</code>", opts.code_lang, opts.selected_code_content),
}
if Utils.tokens.calculate_tokens(selected_code_obj.text) > 1024 then
selected_code_obj.cache_control = { type = "ephemeral" }
if Clipboard.support_paste_image() and prompt_opts.image_paths then
for _, image_path in ipairs(prompt_opts.image_paths) do
table.insert(message_content, {
type = "image",
source = {
type = "base64",
media_type = "image/png",
data = Clipboard.get_base64_content(image_path),
},
})
end
table.insert(message_content, selected_code_obj)
end
if Clipboard.support_paste_image() and opts.image_path then
table.insert(message_content, {
type = "image",
source = {
type = "base64",
media_type = "image/png",
data = Clipboard.get_base64_content(opts.image_path),
},
})
end
table.insert(message_content, {
type = "text",
text = string.format("<question>%s</question>", opts.question),
})
local user_prompt = opts.base_prompt
local user_prompt = prompt_opts.user_prompt
local user_prompt_obj = {
type = "text",
@@ -91,9 +61,9 @@ M.parse_response = function(data_stream, event_state, opts)
end
---@param provider AvanteProviderFunctor
---@param code_opts AvantePromptOptions
---@param prompt_opts AvantePromptOptions
---@return table
M.parse_curl_args = function(provider, code_opts)
M.parse_curl_args = function(provider, prompt_opts)
local base, body_opts = P.parse_config(provider)
local headers = {
@@ -112,7 +82,14 @@ M.parse_curl_args = function(provider, code_opts)
headers = headers,
body = vim.tbl_deep_extend("force", {
model = base.model,
messages = M.parse_message(code_opts),
system = {
{
type = "text",
text = prompt_opts.system_prompt,
cache_control = { type = "ephemeral" },
},
},
messages = M.parse_message(prompt_opts),
stream = true,
}, body_opts),
}

View File

@@ -31,37 +31,9 @@ local M = {}
M.api_key_name = "CO_API_KEY"
M.parse_message = function(opts)
local user_prompt = opts.base_prompt
.. "\n\nCODE:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.code_content
.. "\n```"
.. "\n\nQUESTION:\n"
.. opts.question
if opts.selected_code_content ~= nil then
user_prompt = opts.base_prompt
.. "\n\nCODE CONTEXT:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.code_content
.. "\n```"
.. "\n\nCODE:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.selected_code_content
.. "\n```"
.. "\n\nQUESTION:\n"
.. opts.question
end
return {
preamble = opts.system_prompt,
message = user_prompt,
message = opts.user_prompt,
}
end

View File

@@ -8,41 +8,24 @@ local M = {}
M.api_key_name = "GEMINI_API_KEY"
M.parse_message = function(opts)
local code_prompt_obj = {
text = string.format("<code>```%s\n%s```</code>", opts.code_lang, opts.code_content),
}
local message_content = {}
if opts.selected_code_content then
code_prompt_obj.text = string.format("<code_context>```%s\n%s```</code_context>", opts.code_lang, opts.code_content)
end
if Clipboard.support_paste_image() and opts.image_paths then
for _, image_path in ipairs(opts.image_paths) do
local image_data = {
inline_data = {
mime_type = "image/png",
data = Clipboard.get_base64_content(image_path),
},
}
-- parts ready
local message_content = {
code_prompt_obj,
}
if opts.selected_code_content then
local selected_code_obj = {
text = string.format("<code>```%s\n%s```</code>", opts.code_lang, opts.selected_code_content),
}
table.insert(message_content, selected_code_obj)
end
if Clipboard.support_paste_image() and opts.image_path then
local image_data = {
inline_data = {
mime_type = "image/png",
data = Clipboard.get_base64_content(opts.image_path),
},
}
table.insert(message_content, image_data)
table.insert(message_content, image_data)
end
end
-- insert a part into parts
table.insert(message_content, {
text = string.format("<question>%s</question>", opts.question),
text = opts.user_prompt,
})
return {
@@ -50,7 +33,7 @@ M.parse_message = function(opts)
role = "user",
parts = {
{
text = opts.system_prompt .. "\n" .. opts.base_prompt,
text = opts.system_prompt,
},
},
},

View File

@@ -9,13 +9,9 @@ local Dressing = require("avante.ui.dressing")
---@field on_complete AvanteCompleteParser
---
---@class AvantePromptOptions: table<[string], string>
---@field base_prompt AvanteBasePrompt
---@field system_prompt AvanteSystemPrompt
---@field question string
---@field image_path? string
---@field code_lang string
---@field code_content string
---@field selected_code_content? string
---@field system_prompt string
---@field user_prompt string
---@field image_paths? string[]
---
---@class AvanteBaseMessage
---@field role "user" | "system"
@@ -34,7 +30,7 @@ local Dressing = require("avante.ui.dressing")
---@alias AvanteMessageParser fun(opts: AvantePromptOptions): AvanteChatMessage[]
---
---@class AvanteCurlOutput: {url: string, proxy: string, insecure: boolean, body: table<string, any> | string, headers: table<string, string>}
---@alias AvanteCurlArgsParser fun(opts: AvanteProvider, code_opts: AvantePromptOptions): AvanteCurlOutput
---@alias AvanteCurlArgsParser fun(opts: AvanteProvider | AvanteProviderFunctor, code_opts: AvantePromptOptions): AvanteCurlOutput
---
---@class ResponseParser
---@field on_chunk fun(chunk: string): any
@@ -337,7 +333,7 @@ M.commands = function()
})
end
---@param opts AvanteProvider | AvanteSupportedProvider
---@param opts AvanteProvider | AvanteSupportedProvider | AvanteProviderFunctor
---@return AvanteDefaultBaseProvider, table<string, any>
M.parse_config = function(opts)
---@type AvanteDefaultBaseProvider

View File

@@ -27,53 +27,22 @@ local M = {}
M.api_key_name = "OPENAI_API_KEY"
---@param opts AvantePromptOptions
M.get_user_message = function(opts)
local user_prompt = opts.base_prompt
.. "\n\nCODE:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.code_content
.. "\n```"
.. "\n\nQUESTION:\n"
.. opts.question
if opts.selected_code_content ~= nil then
user_prompt = opts.base_prompt
.. "\n\nCODE CONTEXT:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.code_content
.. "\n```"
.. "\n\nCODE:\n"
.. "```"
.. opts.code_lang
.. "\n"
.. opts.selected_code_content
.. "\n```"
.. "\n\nQUESTION:\n"
.. opts.question
end
return user_prompt
end
M.parse_message = function(opts)
---@type string | OpenAIMessage[]
local user_content
if Config.behaviour.support_paste_from_clipboard and opts.image_path then
if Config.behaviour.support_paste_from_clipboard and opts.image_paths then
user_content = {}
table.insert(user_content, {
type = "image_url",
image_url = {
url = "data:image/png;base64," .. Clipboard.get_base64_content(opts.image_path),
},
})
table.insert(user_content, { type = "text", text = M.get_user_message(opts) })
for _, image_path in ipairs(opts.image_paths) do
table.insert(user_content, {
type = "image_url",
image_url = {
url = "data:image/png;base64," .. Clipboard.get_base64_content(image_path),
},
})
end
table.insert(user_content, { type = "text", text = opts.user_prompt })
else
user_content = M.get_user_message(opts)
user_content = opts.user_prompt
end
return {