diff --git a/lua/avante/config.lua b/lua/avante/config.lua index 5c08675..06cec3d 100644 --- a/lua/avante/config.lua +++ b/lua/avante/config.lua @@ -213,13 +213,15 @@ end M.BASE_PROVIDER_KEYS = { "endpoint", "model", - "local", "deployment", "api_version", "proxy", "allow_insecure", "api_key_name", "timeout", + -- internal + "local", + "_shellenv", } ---@return {width: integer, height: integer} diff --git a/lua/avante/providers/init.lua b/lua/avante/providers/init.lua index 57304f4..8e59b8a 100644 --- a/lua/avante/providers/init.lua +++ b/lua/avante/providers/init.lua @@ -47,6 +47,7 @@ local Dressing = require("avante.ui.dressing") ---@field proxy? string ---@field allow_insecure? boolean ---@field api_key_name? string +---@field _shellenv? string --- ---@class AvanteSupportedProvider: AvanteDefaultBaseProvider ---@field temperature? number @@ -108,7 +109,19 @@ E.parse_envvar = function(Opts) local cmd = api_key_name:match("^cmd:(.*)") local key = nil + if cmd ~= nil then + -- NOTE: in case api_key_name is cmd, and users still set envvar + -- We will try to get envvar first + if Opts._shellenv ~= nil and Opts._shellenv ~= M.AVANTE_INTERNAL_KEY then + key = os.getenv(Opts._shellenv) + if key ~= nil then + E.cache[Opts._shellenv] = key + E.cache[api_key_name] = key + end + return key + end + local result = vim.system(vim.split(cmd, " ", { trimempty = true }), { text = true }):wait() key = vim.split(result.stdout, "\n")[1] else @@ -210,7 +223,12 @@ M = setmetatable(M, { Opts.parse_response = Opts.parse_response_data t[k] = Opts else - t[k] = vim.tbl_deep_extend("keep", Opts, require("avante.providers." .. k)) + local ok, module = pcall(require, "avante.providers." .. k) + if not ok then + error("Failed to load provider: " .. k) + end + Opts._shellenv = module.api_key_name ~= M.AVANTE_INTERNAL_KEY and module.api_key_name or nil + t[k] = vim.tbl_deep_extend("keep", Opts, module) end t[k].parse_api_key = function()