diff --git a/lua/avante/llm.lua b/lua/avante/llm.lua index fc633b7..48c5844 100644 --- a/lua/avante/llm.lua +++ b/lua/avante/llm.lua @@ -246,9 +246,7 @@ function M.curl(opts) end local function parse_response_without_stream(data) - if provider.parse_response_without_stream then - provider:parse_response_without_stream(data, current_event_state, handler_opts) - end + provider:parse_response_without_stream(data, current_event_state, handler_opts) end local completed = false @@ -356,8 +354,8 @@ function M.curl(opts) end) end - -- Always handle the extra response outside of stream, such as the exceptions from bedrock - if result.status == 200 then + -- If stream is not enabled, then handle the response here + if provider:is_disable_stream() and result.status == 200 then vim.schedule(function() completed = true parse_response_without_stream(result.body) diff --git a/lua/avante/providers/azure.lua b/lua/avante/providers/azure.lua index e5849a2..477241b 100644 --- a/lua/avante/providers/azure.lua +++ b/lua/avante/providers/azure.lua @@ -16,6 +16,7 @@ M.api_key_name = "AZURE_OPENAI_API_KEY" M.parse_messages = O.parse_messages M.parse_response = O.parse_response M.parse_response_without_stream = O.parse_response_without_stream +M.is_disable_stream = O.is_disable_stream M.is_o_series_model = O.is_o_series_model M.role_map = O.role_map diff --git a/lua/avante/providers/bedrock/claude.lua b/lua/avante/providers/bedrock/claude.lua index 758373e..e5a16a5 100644 --- a/lua/avante/providers/bedrock/claude.lua +++ b/lua/avante/providers/bedrock/claude.lua @@ -17,6 +17,7 @@ M.role_map = { assistant = "assistant", } +M.is_disable_stream = Claude.is_disable_stream M.parse_messages = Claude.parse_messages M.parse_response = Claude.parse_response diff --git a/lua/avante/providers/claude.lua b/lua/avante/providers/claude.lua index aacf0b8..d70a95b 100644 --- a/lua/avante/providers/claude.lua +++ b/lua/avante/providers/claude.lua @@ -36,6 +36,8 @@ function M.transform_tool(tool) } end +function M:is_disable_stream() return false end + function M:parse_messages(opts) ---@type AvanteClaudeMessage[] local messages = {} diff --git a/lua/avante/providers/cohere.lua b/lua/avante/providers/cohere.lua index cc150bb..a67e10a 100644 --- a/lua/avante/providers/cohere.lua +++ b/lua/avante/providers/cohere.lua @@ -47,6 +47,8 @@ M.role_map = { assistant = "assistant", } +function M:is_disable_stream() return false end + function M:parse_messages(opts) local messages = { { role = "system", content = opts.system_prompt }, diff --git a/lua/avante/providers/copilot.lua b/lua/avante/providers/copilot.lua index b6b636e..7a48472 100644 --- a/lua/avante/providers/copilot.lua +++ b/lua/avante/providers/copilot.lua @@ -209,6 +209,8 @@ M.role_map = { assistant = "assistant", } +function M:is_disable_stream() return false end + M.parse_messages = OpenAI.parse_messages M.parse_response = OpenAI.parse_response diff --git a/lua/avante/providers/gemini.lua b/lua/avante/providers/gemini.lua index b215539..eafc2b8 100644 --- a/lua/avante/providers/gemini.lua +++ b/lua/avante/providers/gemini.lua @@ -12,6 +12,8 @@ M.role_map = { } -- M.tokenizer_id = "google/gemma-2b" +function M:is_disable_stream() return false end + function M:parse_messages(opts) local contents = {} local prev_role = nil diff --git a/lua/avante/providers/ollama.lua b/lua/avante/providers/ollama.lua index 66aa10b..9471b77 100644 --- a/lua/avante/providers/ollama.lua +++ b/lua/avante/providers/ollama.lua @@ -14,6 +14,8 @@ M.role_map = { M.parse_messages = P.openai.parse_messages M.is_o_series_model = P.openai.is_o_series_model +function M:is_disable_stream() return false end + function M:parse_stream_data(ctx, data, handler_opts) local ok, json_data = pcall(vim.json.decode, data) if not ok or not json_data then diff --git a/lua/avante/providers/openai.lua b/lua/avante/providers/openai.lua index 71d02a3..a29ac4d 100644 --- a/lua/avante/providers/openai.lua +++ b/lua/avante/providers/openai.lua @@ -13,6 +13,8 @@ M.role_map = { assistant = "assistant", } +function M:is_disable_stream() return false end + ---@param tool AvanteLLMTool ---@return AvanteOpenAITool function M.transform_tool(tool) diff --git a/lua/avante/providers/vertex.lua b/lua/avante/providers/vertex.lua index 0955082..ccd93af 100644 --- a/lua/avante/providers/vertex.lua +++ b/lua/avante/providers/vertex.lua @@ -11,6 +11,7 @@ M.role_map = { assistant = "model", } +M.is_disable_stream = Gemini.is_disable_stream M.parse_messages = Gemini.parse_messages M.parse_response = Gemini.parse_response diff --git a/lua/avante/providers/vertex_claude.lua b/lua/avante/providers/vertex_claude.lua index ab2ca0a..d6115b2 100644 --- a/lua/avante/providers/vertex_claude.lua +++ b/lua/avante/providers/vertex_claude.lua @@ -9,6 +9,7 @@ M.role_map = { assistant = "assistant", } +M.is_disable_stream = P.claude.is_disable_stream M.parse_messages = P.claude.parse_messages M.parse_response = P.claude.parse_response M.parse_api_key = Vertex.parse_api_key diff --git a/lua/avante/types.lua b/lua/avante/types.lua index 94288eb..3d152cf 100644 --- a/lua/avante/types.lua +++ b/lua/avante/types.lua @@ -261,6 +261,7 @@ vim.g.avante_login = vim.g.avante_login ---@field parse_messages AvanteMessagesParser ---@field parse_response AvanteResponseParser ---@field parse_curl_args AvanteCurlArgsParser +---@field is_disable_stream fun(self: AvanteProviderFunctor): boolean ---@field setup fun(): nil ---@field is_env_set fun(): boolean ---@field api_key_name string