diff --git a/lua/avante/providers/bedrock/claude.lua b/lua/avante/providers/bedrock/claude.lua index d018780..d9bf2ee 100644 --- a/lua/avante/providers/bedrock/claude.lua +++ b/lua/avante/providers/bedrock/claude.lua @@ -16,74 +16,7 @@ M.role_map = { assistant = "assistant", } -function M.parse_messages(opts) - ---@type AvanteBedrockClaudeMessage[] - local messages = {} - - for _, message in ipairs(opts.messages) do - table.insert(messages, { - role = M.role_map[message.role], - content = { - { - type = "text", - text = message.content, - }, - }, - }) - end - - if opts.tool_histories then - for _, tool_history in ipairs(opts.tool_histories) do - if tool_history.tool_use then - local msg = { - role = "assistant", - content = {}, - } - if tool_history.tool_use.thinking_contents then - for _, thinking_content in ipairs(tool_history.tool_use.thinking_contents) do - msg.content[#msg.content + 1] = { - type = "thinking", - thinking = thinking_content.content, - signature = thinking_content.signature, - } - end - end - if tool_history.tool_use.response_contents then - for _, response_content in ipairs(tool_history.tool_use.response_contents) do - msg.content[#msg.content + 1] = { - type = "text", - text = response_content, - } - end - end - msg.content[#msg.content + 1] = { - type = "tool_use", - id = tool_history.tool_use.id, - name = tool_history.tool_use.name, - input = vim.json.decode(tool_history.tool_use.input_json), - } - messages[#messages + 1] = msg - end - - if tool_history.tool_result then - messages[#messages + 1] = { - role = "user", - content = { - { - type = "tool_result", - tool_use_id = tool_history.tool_result.tool_use_id, - content = tool_history.tool_result.content, - is_error = tool_history.tool_result.is_error, - }, - }, - } - end - end - end - - return messages -end - +M.parse_messages = Claude.parse_messages M.parse_response = Claude.parse_response ---@param prompt_opts AvantePromptOptions diff --git a/lua/avante/providers/claude.lua b/lua/avante/providers/claude.lua index 5c0fcbe..035caac 100644 --- a/lua/avante/providers/claude.lua +++ b/lua/avante/providers/claude.lua @@ -89,12 +89,20 @@ function M.parse_messages(opts) role = "assistant", content = {}, } - if tool_history.tool_use.thinking_contents then - for _, thinking_content in ipairs(tool_history.tool_use.thinking_contents) do + if tool_history.tool_use.thinking_blocks then + for _, thinking_block in ipairs(tool_history.tool_use.thinking_blocks) do msg.content[#msg.content + 1] = { type = "thinking", - thinking = thinking_content.content, - signature = thinking_content.signature, + thinking = thinking_block.thinking, + signature = thinking_block.signature, + } + end + end + if tool_history.tool_use.redacted_thinking_blocks then + for _, redacted_thinking_block in ipairs(tool_history.tool_use.redacted_thinking_blocks) do + msg.content[#msg.content + 1] = { + type = "redacted_thinking", + data = redacted_thinking_block.data, } end end @@ -208,21 +216,32 @@ function M.parse_response(ctx, data_stream, event_state, opts) :filter(function(content_block_) return content_block_.stoppped and content_block_.type == "text" end) :map(function(content_block_) return content_block_.text end) :totable() - local thinking_contents = vim + local thinking_blocks = vim .iter(ctx.content_blocks) :filter(function(content_block_) return content_block_.stoppped and content_block_.type == "thinking" end) - :map( - function(content_block_) - return { content = content_block_.thinking, signature = content_block_.signature } - end - ) + :map(function(content_block_) + ---@type AvanteLLMThinkingBlock + return { thinking = content_block_.thinking, signature = content_block_.signature } + end) :totable() + local redacted_thinking_blocks = vim + .iter(ctx.content_blocks) + :filter( + function(content_block_) return content_block_.stoppped and content_block_.type == "redacted_thinking" end + ) + :map(function(content_block_) + ---@type AvanteLLMRedactedThinkingBlock + return { data = content_block_.data } + end) + :totable() + ---@type AvanteLLMToolUse return { name = content_block.name, id = content_block.id, input_json = content_block.input_json, response_contents = response_contents, - thinking_contents = thinking_contents, + thinking_blocks = thinking_blocks, + redacted_thinking_blocks = redacted_thinking_blocks, } end) :totable() diff --git a/lua/avante/types.lua b/lua/avante/types.lua index 0f2fc52..ad5e4ae 100644 --- a/lua/avante/types.lua +++ b/lua/avante/types.lua @@ -222,12 +222,20 @@ vim.g.avante_login = vim.g.avante_login ---@field cache_read_input_tokens number ---@field output_tokens number --- +---@class AvanteLLMThinkingBlock +---@field thinking string +---@field signature string +--- +---@class AvanteLLMRedactedThinkingBlock +---@field data string +--- ---@class AvanteLLMToolUse ---@field name string ---@field id string ---@field input_json string ---@field response_contents? string[] ----@field thinking_contents? { content: string, signature: string }[] +---@field thinking_blocks? AvanteLLMThinkingBlock[] +---@field redacted_thinking_blocks? AvanteLLMRedactedThinkingBlock[] --- ---@class AvanteLLMStartCallbackOptions ---@field usage? AvanteLLMUsage