Files
avante.nvim/lua/avante/history/helpers.lua
Dmitry Torokhov 2d9f8fd252 refactor(sidebar): use helpers when working with history
Do not poke directly into avante.HistoryMessage instances, use
appropriate helpers instead.
2025-07-22 17:49:28 +08:00

105 lines
3.2 KiB
Lua

local Utils = require("avante.utils")
local M = {}
---If message is a text message return the text.
---@param message avante.HistoryMessage
---@return string | nil
function M.get_text_data(message)
local content = message.message.content
if type(content) == "table" then
assert(#content == 1, "more than one entry in message content")
local item = content[1]
if type(item) == "string" then
return item
elseif type(item) == "table" and item.type == "text" then
return item.content
end
elseif type(content) == "string" then
return content
end
end
---If message is a "tool use" message returns information about the tool invocation.
---@param message avante.HistoryMessage
---@return AvanteLLMToolUse | nil
function M.get_tool_use_data(message)
local content = message.message.content
if type(content) == "table" then
assert(#content == 1, "more than one entry in message content")
local item = content[1]
if item.type == "tool_use" then
---@cast item AvanteLLMToolUse
return item
end
end
end
---If message is a "tool result" message returns results of the tool invocation.
---@param message avante.HistoryMessage
---@return AvanteLLMToolResult | nil
function M.get_tool_result_data(message)
local content = message.message.content
if type(content) == "table" then
assert(#content == 1, "more than one entry in message content")
local item = content[1]
if item.type == "tool_result" then
---@cast item AvanteLLMToolResult
return item
end
end
end
---Attempts to locate result of a tool execution given tool invocation ID
---@param id string
---@param messages avante.HistoryMessage[]
---@return AvanteLLMToolResult | nil
function M.get_tool_result(id, messages)
for idx = #messages, 1, -1 do
local msg = messages[idx]
local result = M.get_tool_result_data(msg)
if result and result.tool_use_id == id then return result end
end
end
---Given a tool invocation ID locate corresponding tool use message
---@param id string
---@param messages avante.HistoryMessage[]
---@return avante.HistoryMessage | nil
function M.get_tool_use_message(id, messages)
for idx = #messages, 1, -1 do
local msg = messages[idx]
local use = M.get_tool_use_data(msg)
if use and use.id == id then return msg end
end
end
---Given a tool invocation ID locate corresponding tool result message
---@param id string
---@param messages avante.HistoryMessage[]
---@return avante.HistoryMessage | nil
function M.get_tool_result_message(id, messages)
for idx = #messages, 1, -1 do
local msg = messages[idx]
local result = M.get_tool_result_data(msg)
if result and result.tool_use_id == id then return msg end
end
end
---@param message avante.HistoryMessage
---@return boolean
function M.is_thinking_message(message)
local content = message.message.content
return type(content) == "table" and (content[1].type == "thinking" or content[1].type == "redacted_thinking")
end
---@param message avante.HistoryMessage
---@return boolean
function M.is_tool_result_message(message) return M.get_tool_result_data(message) ~= nil end
---@param message avante.HistoryMessage
---@return boolean
function M.is_tool_use_message(message) return M.get_tool_use_data(message) ~= nil end
return M