feat: thinking 🤯
This commit is contained in:
parent
0d48b8f8e5
commit
2ead26f809
@ -170,11 +170,15 @@ end
|
|||||||
---@field current_filepath string
|
---@field current_filepath string
|
||||||
---@field is_searching boolean
|
---@field is_searching boolean
|
||||||
---@field is_replacing boolean
|
---@field is_replacing boolean
|
||||||
|
---@field is_thinking boolean
|
||||||
---@field last_search_tag_start_line integer
|
---@field last_search_tag_start_line integer
|
||||||
---@field last_replace_tag_start_line integer
|
---@field last_replace_tag_start_line integer
|
||||||
|
---@field last_think_tag_start_line integer
|
||||||
|
---@field last_think_tag_end_line integer
|
||||||
|
|
||||||
---@param selected_files {path: string, content: string, file_type: string | nil}[]
|
---@param selected_files {path: string, content: string, file_type: string | nil}[]
|
||||||
---@param result_content string
|
---@param result_content string
|
||||||
|
---@param prev_filepath string
|
||||||
---@return AvanteReplacementResult
|
---@return AvanteReplacementResult
|
||||||
local function transform_result_content(selected_files, result_content, prev_filepath)
|
local function transform_result_content(selected_files, result_content, prev_filepath)
|
||||||
local transformed_lines = {}
|
local transformed_lines = {}
|
||||||
@ -183,8 +187,11 @@ local function transform_result_content(selected_files, result_content, prev_fil
|
|||||||
|
|
||||||
local is_searching = false
|
local is_searching = false
|
||||||
local is_replacing = false
|
local is_replacing = false
|
||||||
|
local is_thinking = false
|
||||||
local last_search_tag_start_line = 0
|
local last_search_tag_start_line = 0
|
||||||
local last_replace_tag_start_line = 0
|
local last_replace_tag_start_line = 0
|
||||||
|
local last_think_tag_start_line = 0
|
||||||
|
local last_think_tag_end_line = 0
|
||||||
|
|
||||||
local search_start = 0
|
local search_start = 0
|
||||||
|
|
||||||
@ -286,6 +293,12 @@ local function transform_result_content(selected_files, result_content, prev_fil
|
|||||||
local prev_line = result_lines[i - 1]
|
local prev_line = result_lines[i - 1]
|
||||||
if not (prev_line and prev_line:match("^%s*```$")) then table.insert(transformed_lines, "```") end
|
if not (prev_line and prev_line:match("^%s*```$")) then table.insert(transformed_lines, "```") end
|
||||||
goto continue
|
goto continue
|
||||||
|
elseif line_content == "<think>" then
|
||||||
|
is_thinking = true
|
||||||
|
last_think_tag_start_line = i
|
||||||
|
elseif line_content == "</think>" then
|
||||||
|
is_thinking = false
|
||||||
|
last_think_tag_end_line = i
|
||||||
end
|
end
|
||||||
table.insert(transformed_lines, line_content)
|
table.insert(transformed_lines, line_content)
|
||||||
::continue::
|
::continue::
|
||||||
@ -297,8 +310,11 @@ local function transform_result_content(selected_files, result_content, prev_fil
|
|||||||
content = table.concat(transformed_lines, "\n"),
|
content = table.concat(transformed_lines, "\n"),
|
||||||
is_searching = is_searching,
|
is_searching = is_searching,
|
||||||
is_replacing = is_replacing,
|
is_replacing = is_replacing,
|
||||||
|
is_thinking = is_thinking,
|
||||||
last_search_tag_start_line = last_search_tag_start_line,
|
last_search_tag_start_line = last_search_tag_start_line,
|
||||||
last_replace_tag_start_line = last_replace_tag_start_line,
|
last_replace_tag_start_line = last_replace_tag_start_line,
|
||||||
|
last_think_tag_start_line = last_think_tag_start_line,
|
||||||
|
last_think_tag_end_line = last_think_tag_end_line,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -351,8 +367,22 @@ local function get_searching_hint()
|
|||||||
return "\n" .. spinner .. " Searching..."
|
return "\n" .. spinner .. " Searching..."
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local thinking_spinner_chars = {
|
||||||
|
"🤯",
|
||||||
|
"🙄",
|
||||||
|
}
|
||||||
|
local thinking_spinner_index = 1
|
||||||
|
|
||||||
|
local function get_thinking_spinner()
|
||||||
|
thinking_spinner_index = thinking_spinner_index + 1
|
||||||
|
if thinking_spinner_index > #thinking_spinner_chars then thinking_spinner_index = 1 end
|
||||||
|
local spinner = thinking_spinner_chars[thinking_spinner_index]
|
||||||
|
return "\n\n" .. spinner .. " Thinking..."
|
||||||
|
end
|
||||||
|
|
||||||
local function get_display_content_suffix(replacement)
|
local function get_display_content_suffix(replacement)
|
||||||
if replacement.is_searching then return get_searching_hint() end
|
if replacement.is_searching then return get_searching_hint() end
|
||||||
|
if replacement.is_thinking then return get_thinking_spinner() end
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -365,6 +395,25 @@ local function generate_display_content(replacement)
|
|||||||
"\n"
|
"\n"
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
if replacement.last_think_tag_start_line > 0 then
|
||||||
|
local lines = vim.split(replacement.content, "\n")
|
||||||
|
local last_think_tag_end_line = replacement.last_think_tag_end_line
|
||||||
|
if last_think_tag_end_line == 0 then last_think_tag_end_line = #lines + 1 end
|
||||||
|
local thinking_content_lines =
|
||||||
|
vim.list_slice(lines, replacement.last_think_tag_start_line + 2, last_think_tag_end_line - 1)
|
||||||
|
local formatted_thinking_content_lines = vim
|
||||||
|
.iter(thinking_content_lines)
|
||||||
|
:map(function(line)
|
||||||
|
if Utils.trim_spaces(line) == "" then return line end
|
||||||
|
return string.format(" > %s", line)
|
||||||
|
end)
|
||||||
|
:totable()
|
||||||
|
local result_lines =
|
||||||
|
vim.list_extend(vim.list_slice(lines, 1, replacement.last_search_tag_start_line), { "🤔 Thought content:" })
|
||||||
|
result_lines = vim.list_extend(result_lines, formatted_thinking_content_lines)
|
||||||
|
result_lines = vim.list_extend(result_lines, vim.list_slice(lines, last_think_tag_end_line + 1))
|
||||||
|
return table.concat(result_lines, "\n")
|
||||||
|
end
|
||||||
return replacement.content
|
return replacement.content
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1675,6 +1724,7 @@ function Sidebar:create_input_container(opts)
|
|||||||
local transformed_response = ""
|
local transformed_response = ""
|
||||||
local displayed_response = ""
|
local displayed_response = ""
|
||||||
local current_path = ""
|
local current_path = ""
|
||||||
|
local prev_is_thinking = false
|
||||||
|
|
||||||
local is_first_chunk = true
|
local is_first_chunk = true
|
||||||
local scroll = true
|
local scroll = true
|
||||||
@ -1708,8 +1758,10 @@ function Sidebar:create_input_container(opts)
|
|||||||
|
|
||||||
local selected_files = self.file_selector:get_selected_files_contents()
|
local selected_files = self.file_selector:get_selected_files_contents()
|
||||||
|
|
||||||
local transformed = transform_result_content(selected_files, transformed_response .. chunk, current_path)
|
local transformed =
|
||||||
|
transform_result_content(selected_files, transformed_response .. chunk, current_path, prev_is_thinking)
|
||||||
transformed_response = transformed.content
|
transformed_response = transformed.content
|
||||||
|
prev_is_thinking = transformed.is_thinking
|
||||||
if transformed.current_filepath and transformed.current_filepath ~= "" then
|
if transformed.current_filepath and transformed.current_filepath ~= "" then
|
||||||
current_path = transformed.current_filepath
|
current_path = transformed.current_filepath
|
||||||
end
|
end
|
||||||
@ -1727,10 +1779,12 @@ function Sidebar:create_input_container(opts)
|
|||||||
|
|
||||||
---@type AvanteCompleteParser
|
---@type AvanteCompleteParser
|
||||||
local on_complete = function(err)
|
local on_complete = function(err)
|
||||||
---remove keymaps
|
pcall(function()
|
||||||
vim.keymap.del("n", "j", { buffer = self.result_container.bufnr })
|
---remove keymaps
|
||||||
vim.keymap.del("n", "k", { buffer = self.result_container.bufnr })
|
vim.keymap.del("n", "j", { buffer = self.result_container.bufnr })
|
||||||
vim.keymap.del("n", "G", { buffer = self.result_container.bufnr })
|
vim.keymap.del("n", "k", { buffer = self.result_container.bufnr })
|
||||||
|
vim.keymap.del("n", "G", { buffer = self.result_container.bufnr })
|
||||||
|
end)
|
||||||
|
|
||||||
if err ~= nil then
|
if err ~= nil then
|
||||||
self:update_content(
|
self:update_content(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user