diff --git a/lua/CopilotChat/client.lua b/lua/CopilotChat/client.lua index 95db5bb8..7955691c 100644 --- a/lua/CopilotChat/client.lua +++ b/lua/CopilotChat/client.lua @@ -164,14 +164,12 @@ end ---@class CopilotChat.client.Client : Class ---@field private provider_resolver function():table ---@field private provider_cache table ----@field private model_cache table? ---@field private current_job string? local Client = class(function(self) self.provider_resolver = nil self.provider_cache = vim.defaulttable(function() return {} end) - self.model_cache = nil self.current_job = nil end) @@ -211,10 +209,6 @@ end --- Fetch models from the Copilot API ---@return table function Client:models() - if self.model_cache then - return self.model_cache - end - local models = {} local providers = self:get_providers() local provider_order = vim.tbl_keys(providers) @@ -222,24 +216,34 @@ function Client:models() for _, provider_name in ipairs(provider_order) do local provider = providers[provider_name] if not provider.disabled and provider.get_models then - notify.publish(notify.STATUS, 'Fetching models from ' .. provider_name) - local ok, headers = pcall(self.authenticate, self, provider_name) - if not ok then - log.warn('Failed to authenticate with ' .. provider_name .. ': ' .. headers) - goto continue - end - local ok, provider_models = pcall(provider.get_models, headers) - if not ok then - log.warn('Failed to fetch models from ' .. provider_name .. ': ' .. provider_models) - goto continue + local cache = self.provider_cache[provider_name] + local resolved_models = nil + if cache and cache.models then + resolved_models = cache.models + else + notify.publish(notify.STATUS, 'Fetching models from ' .. provider_name) + local ok, headers = pcall(self.authenticate, self, provider_name) + if not ok then + log.warn('Failed to authenticate with ' .. provider_name .. ': ' .. headers) + goto continue + end + local ok, provider_models = pcall(provider.get_models, headers) + if not ok then + log.warn('Failed to fetch models from ' .. provider_name .. ': ' .. provider_models) + goto continue + end + resolved_models = provider_models + cache.models = resolved_models end - for _, model in ipairs(provider_models) do - model.provider = provider_name - if models[model.id] then - model.id = model.id .. ':' .. provider_name + if resolved_models then + for _, model in ipairs(resolved_models) do + model.provider = provider_name + if models[model.id] then + model.id = model.id .. ':' .. provider_name + end + models[model.id] = model end - models[model.id] = model end ::continue:: @@ -247,8 +251,7 @@ function Client:models() end log.debug('Fetched models:', #vim.tbl_keys(models)) - self.model_cache = models - return self.model_cache + return models end --- Get information about all providers diff --git a/lua/CopilotChat/config/mappings.lua b/lua/CopilotChat/config/mappings.lua index 552e6c6b..2421c264 100644 --- a/lua/CopilotChat/config/mappings.lua +++ b/lua/CopilotChat/config/mappings.lua @@ -519,7 +519,7 @@ return { end table.insert(lines, header) - table.insert(lines, '```' .. resource.type) + table.insert(lines, '```' .. utils.mimetype_to_filetype(resource.mimetype)) for _, line in ipairs(preview) do table.insert(lines, line) end diff --git a/lua/CopilotChat/utils.lua b/lua/CopilotChat/utils.lua index 34e6ab23..54f4c6ae 100644 --- a/lua/CopilotChat/utils.lua +++ b/lua/CopilotChat/utils.lua @@ -240,6 +240,9 @@ function M.filetype_to_mimetype(filetype) if filetype == 'html' or filetype == 'css' then return 'text/' .. filetype end + if filetype:find('/') then + return filetype + end return 'text/x-' .. filetype end