refactor: Support model listing now is capabilities flag

This commit is contained in:
Petr Mironychev
2026-03-31 02:15:38 +02:00
parent 1c12d6d45c
commit 666aa94e81
23 changed files with 22 additions and 71 deletions

View File

@ -176,7 +176,7 @@ void ConfigurationManager::selectModel()
: m_generalSettings.caModel); : m_generalSettings.caModel);
if (auto provider = m_providersManager.getProviderByName(providerName)) { if (auto provider = m_providersManager.getProviderByName(providerName)) {
if (!provider->supportsModelListing()) { if (!provider->capabilities().testFlag(PluginLLMCore::ProviderCapability::ModelListing)) {
m_generalSettings.showModelsNotSupportedDialog(*targetSettings); m_generalSettings.showModelsNotSupportedDialog(*targetSettings);
return; return;
} }

View File

@ -40,9 +40,10 @@ class QJsonObject;
namespace QodeAssist::PluginLLMCore { namespace QodeAssist::PluginLLMCore {
enum class ProviderCapability { enum class ProviderCapability {
Tools = 0x1, Tools = 0x1,
Thinking = 0x2, Thinking = 0x2,
Image = 0x4, Image = 0x4,
ModelListing = 0x8,
}; };
Q_DECLARE_FLAGS(ProviderCapabilities, ProviderCapability) Q_DECLARE_FLAGS(ProviderCapabilities, ProviderCapability)
Q_DECLARE_OPERATORS_FOR_FLAGS(ProviderCapabilities) Q_DECLARE_OPERATORS_FOR_FLAGS(ProviderCapabilities)
@ -59,7 +60,6 @@ public:
virtual QString url() const = 0; virtual QString url() const = 0;
virtual QString completionEndpoint() const = 0; virtual QString completionEndpoint() const = 0;
virtual QString chatEndpoint() const = 0; virtual QString chatEndpoint() const = 0;
virtual bool supportsModelListing() const = 0;
virtual void prepareRequest( virtual void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -64,11 +64,6 @@ QString ClaudeProvider::chatEndpoint() const
return "/v1/messages"; return "/v1/messages";
} }
bool ClaudeProvider::supportsModelListing() const
{
return true;
}
void ClaudeProvider::prepareRequest( void ClaudeProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,
@ -252,7 +247,8 @@ void ClaudeProvider::sendRequest(
PluginLLMCore::ProviderCapabilities ClaudeProvider::capabilities() const PluginLLMCore::ProviderCapabilities ClaudeProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking
| PluginLLMCore::ProviderCapability::Image; | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void ClaudeProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void ClaudeProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -37,7 +37,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -33,9 +33,9 @@ QString CodestralProvider::url() const
return "https://codestral.mistral.ai"; return "https://codestral.mistral.ai";
} }
bool CodestralProvider::supportsModelListing() const PluginLLMCore::ProviderCapabilities CodestralProvider::capabilities() const
{ {
return false; return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image;
} }
QString CodestralProvider::apiKey() const QString CodestralProvider::apiKey() const

View File

@ -28,8 +28,8 @@ class CodestralProvider : public MistralAIProvider
public: public:
QString name() const override; QString name() const override;
QString url() const override; QString url() const override;
bool supportsModelListing() const override;
QString apiKey() const override; QString apiKey() const override;
PluginLLMCore::ProviderCapabilities capabilities() const override;
}; };
} // namespace QodeAssist::Providers } // namespace QodeAssist::Providers

View File

@ -64,11 +64,6 @@ QString GoogleAIProvider::chatEndpoint() const
return {}; return {};
} }
bool GoogleAIProvider::supportsModelListing() const
{
return true;
}
void GoogleAIProvider::prepareRequest( void GoogleAIProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,
@ -268,7 +263,8 @@ void GoogleAIProvider::sendRequest(
PluginLLMCore::ProviderCapabilities GoogleAIProvider::capabilities() const PluginLLMCore::ProviderCapabilities GoogleAIProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking
| PluginLLMCore::ProviderCapability::Image; | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void GoogleAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void GoogleAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -37,7 +37,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -63,11 +63,6 @@ QString LMStudioProvider::chatEndpoint() const
return "/v1/chat/completions"; return "/v1/chat/completions";
} }
bool LMStudioProvider::supportsModelListing() const
{
return true;
}
QFuture<QList<QString>> LMStudioProvider::getInstalledModels(const QString &url) QFuture<QList<QString>> LMStudioProvider::getInstalledModels(const QString &url)
{ {
m_client->setUrl(url); m_client->setUrl(url);
@ -179,7 +174,8 @@ void LMStudioProvider::sendRequest(
PluginLLMCore::ProviderCapabilities LMStudioProvider::capabilities() const PluginLLMCore::ProviderCapabilities LMStudioProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image; return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void LMStudioProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void LMStudioProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -36,7 +36,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -61,11 +61,6 @@ QString LlamaCppProvider::chatEndpoint() const
return "/v1/chat/completions"; return "/v1/chat/completions";
} }
bool LlamaCppProvider::supportsModelListing() const
{
return false;
}
void LlamaCppProvider::prepareRequest( void LlamaCppProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -37,7 +37,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -62,11 +62,6 @@ QString MistralAIProvider::chatEndpoint() const
return "/v1/chat/completions"; return "/v1/chat/completions";
} }
bool MistralAIProvider::supportsModelListing() const
{
return true;
}
QFuture<QList<QString>> MistralAIProvider::getInstalledModels(const QString &url) QFuture<QList<QString>> MistralAIProvider::getInstalledModels(const QString &url)
{ {
m_client->setUrl(url); m_client->setUrl(url);
@ -191,7 +186,8 @@ void MistralAIProvider::sendRequest(
PluginLLMCore::ProviderCapabilities MistralAIProvider::capabilities() const PluginLLMCore::ProviderCapabilities MistralAIProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image; return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void MistralAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void MistralAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -36,7 +36,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -63,11 +63,6 @@ QString OllamaProvider::chatEndpoint() const
return "/api/chat"; return "/api/chat";
} }
bool OllamaProvider::supportsModelListing() const
{
return true;
}
void OllamaProvider::prepareRequest( void OllamaProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,
@ -275,7 +270,8 @@ void OllamaProvider::sendRequest(
PluginLLMCore::ProviderCapabilities OllamaProvider::capabilities() const PluginLLMCore::ProviderCapabilities OllamaProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking
| PluginLLMCore::ProviderCapability::Image; | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void OllamaProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void OllamaProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -37,7 +37,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -62,11 +62,6 @@ QString OpenAICompatProvider::chatEndpoint() const
return "/v1/chat/completions"; return "/v1/chat/completions";
} }
bool OpenAICompatProvider::supportsModelListing() const
{
return false;
}
void OpenAICompatProvider::prepareRequest( void OpenAICompatProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -36,7 +36,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -62,11 +62,6 @@ QString OpenAIProvider::chatEndpoint() const
return "/v1/chat/completions"; return "/v1/chat/completions";
} }
bool OpenAIProvider::supportsModelListing() const
{
return true;
}
void OpenAIProvider::prepareRequest( void OpenAIProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,
@ -256,7 +251,8 @@ void OpenAIProvider::sendRequest(
PluginLLMCore::ProviderCapabilities OpenAIProvider::capabilities() const PluginLLMCore::ProviderCapabilities OpenAIProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image; return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void OpenAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void OpenAIProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -36,7 +36,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -62,11 +62,6 @@ QString OpenAIResponsesProvider::chatEndpoint() const
return "/v1/responses"; return "/v1/responses";
} }
bool OpenAIResponsesProvider::supportsModelListing() const
{
return true;
}
void OpenAIResponsesProvider::prepareRequest( void OpenAIResponsesProvider::prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,
@ -295,7 +290,8 @@ void OpenAIResponsesProvider::sendRequest(
PluginLLMCore::ProviderCapabilities OpenAIResponsesProvider::capabilities() const PluginLLMCore::ProviderCapabilities OpenAIResponsesProvider::capabilities() const
{ {
return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking return PluginLLMCore::ProviderCapability::Tools | PluginLLMCore::ProviderCapability::Thinking
| PluginLLMCore::ProviderCapability::Image; | PluginLLMCore::ProviderCapability::Image
| PluginLLMCore::ProviderCapability::ModelListing;
} }
void OpenAIResponsesProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) void OpenAIResponsesProvider::cancelRequest(const PluginLLMCore::RequestID &requestId)

View File

@ -36,7 +36,6 @@ public:
QString url() const override; QString url() const override;
QString completionEndpoint() const override; QString completionEndpoint() const override;
QString chatEndpoint() const override; QString chatEndpoint() const override;
bool supportsModelListing() const override;
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
PluginLLMCore::PromptTemplate *prompt, PluginLLMCore::PromptTemplate *prompt,

View File

@ -62,8 +62,6 @@ public:
QString url() const override { return "https://mock_url"; } QString url() const override { return "https://mock_url"; }
QString completionEndpoint() const override { return "/v1/completions"; } QString completionEndpoint() const override { return "/v1/completions"; }
QString chatEndpoint() const override { return "/v1/chat/completions"; } QString chatEndpoint() const override { return "/v1/chat/completions"; }
bool supportsModelListing() const override { return false; }
void prepareRequest( void prepareRequest(
QJsonObject &request, QJsonObject &request,
LLMCore::PromptTemplate *promptTemplate, LLMCore::PromptTemplate *promptTemplate,