optimize: use cache to optimize the performance of streaming rendering (#2312)
This commit is contained in:
@@ -18,6 +18,7 @@ local FileSelector = require("avante.file_selector")
|
||||
local LLMTools = require("avante.llm_tools")
|
||||
local HistoryMessage = require("avante.history_message")
|
||||
local Line = require("avante.ui.line")
|
||||
local LRUCache = require("avante.utils.lru_cache")
|
||||
|
||||
local RESULT_BUF_NAME = "AVANTE_RESULT"
|
||||
local VIEW_BUFFER_UPDATED_PATTERN = "AvanteViewBufferUpdated"
|
||||
@@ -1489,6 +1490,11 @@ function Sidebar:should_auto_scroll()
|
||||
return is_scrolled_to_bottom
|
||||
end
|
||||
|
||||
Sidebar.throttled_update_content = Utils.throttle(function(self, ...)
|
||||
local args = { ... }
|
||||
self:update_content(unpack(args))
|
||||
end, 50)
|
||||
|
||||
---@param content string concatenated content of the buffer
|
||||
---@param opts? {focus?: boolean, scroll?: boolean, backspace?: integer, callback?: fun(): nil} whether to focus the result view
|
||||
function Sidebar:update_content(content, opts)
|
||||
@@ -1629,7 +1635,7 @@ end
|
||||
---@param messages avante.HistoryMessage[]
|
||||
---@param ctx table
|
||||
---@return avante.ui.Line[]
|
||||
local function get_message_lines(message, messages, ctx)
|
||||
local function _get_message_lines(message, messages, ctx)
|
||||
if message.visible == false then return {} end
|
||||
local lines = Utils.message_to_lines(message, messages)
|
||||
if message.is_user_submission then
|
||||
@@ -1674,6 +1680,21 @@ local function get_message_lines(message, messages, ctx)
|
||||
return lines
|
||||
end
|
||||
|
||||
local _message_to_lines_lru_cache = LRUCache:new(100)
|
||||
|
||||
---@param message avante.HistoryMessage
|
||||
---@param messages avante.HistoryMessage[]
|
||||
---@param ctx table
|
||||
---@return avante.ui.Line[]
|
||||
local function get_message_lines(message, messages, ctx)
|
||||
if message.state == "generating" then return _get_message_lines(message, messages, ctx) end
|
||||
local cached_lines = _message_to_lines_lru_cache:get(message.uuid)
|
||||
if cached_lines then return cached_lines end
|
||||
local lines = _get_message_lines(message, messages, ctx)
|
||||
_message_to_lines_lru_cache:set(message.uuid, lines)
|
||||
return lines
|
||||
end
|
||||
|
||||
---@param history avante.ChatHistory
|
||||
---@return avante.ui.Line[]
|
||||
function Sidebar.get_history_lines(history)
|
||||
@@ -1922,7 +1943,12 @@ function Sidebar:new_chat(args, cb)
|
||||
vim.schedule(function() self:create_todos_container() end)
|
||||
end
|
||||
|
||||
function Sidebar:save_history() Path.history.save(self.code.bufnr, self.chat_history) end
|
||||
local debounced_save_history = Utils.debounce(
|
||||
function(self) Path.history.save(self.code.bufnr, self.chat_history) end,
|
||||
1000
|
||||
)
|
||||
|
||||
function Sidebar:save_history() debounced_save_history(self) end
|
||||
|
||||
---@param uuids string[]
|
||||
function Sidebar:delete_history_messages(uuids)
|
||||
@@ -1993,7 +2019,7 @@ function Sidebar:add_history_messages(messages)
|
||||
self.current_state = "generating"
|
||||
end
|
||||
end
|
||||
xpcall(function() self:update_content("") end, function(err)
|
||||
xpcall(function() self:throttled_update_content("") end, function(err)
|
||||
Utils.debug("Failed to update content:", err)
|
||||
return nil
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user