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