fix: LM Studio url and endpoints

This commit is contained in:
Petr Mironychev
2026-05-15 21:55:07 +02:00
parent b1ca6823b8
commit a06320d1c4
5 changed files with 41 additions and 14 deletions

View File

@@ -1,10 +1,5 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
# list(APPEND CMAKE_PREFIX_PATH "/Users/palm1r/Qt/Qt Creator 20.0.0-beta1.app/Contents/Resources")
list(APPEND CMAKE_PREFIX_PATH "/Users/palm1r/Qt/Qt Creator 20.0.0-beta1.sdk/lib/cmake/QtCreator")
# list(APPEND CMAKE_PREFIX_PATH "/Users/palm1r/Qt/Qt Creator 20.0.0-beta1.sdk")
# list(APPEND CMAKE_PREFIX_PATH "/Users/palm1r/Qt/Qt Creator 20.0.0-beta1.app/Contents/Resources")
project(QodeAssist) project(QodeAssist)
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
@@ -98,6 +93,7 @@ add_qtc_plugin(QodeAssist
templates/Qwen3CoderFIM.hpp templates/Qwen3CoderFIM.hpp
templates/OpenAIResponses.hpp templates/OpenAIResponses.hpp
providers/Providers.hpp providers/Providers.hpp
providers/ProviderUrlUtils.hpp
providers/OllamaProvider.hpp providers/OllamaProvider.cpp providers/OllamaProvider.hpp providers/OllamaProvider.cpp
providers/OllamaCompatProvider.hpp providers/OllamaCompatProvider.cpp providers/OllamaCompatProvider.hpp providers/OllamaCompatProvider.cpp
providers/ClaudeProvider.hpp providers/ClaudeProvider.cpp providers/ClaudeProvider.hpp providers/ClaudeProvider.cpp

View File

@@ -5,6 +5,7 @@
#include <LLMQore/ToolsManager.hpp> #include <LLMQore/ToolsManager.hpp>
#include "providers/ProviderUrlUtils.hpp"
#include "tools/ToolsRegistration.hpp" #include "tools/ToolsRegistration.hpp"
#include "logger/Logger.hpp" #include "logger/Logger.hpp"
#include "settings/ChatAssistantSettings.hpp" #include "settings/ChatAssistantSettings.hpp"
@@ -38,12 +39,12 @@ QString LMStudioProvider::apiKey() const
QString LMStudioProvider::url() const QString LMStudioProvider::url() const
{ {
return "http://localhost:1234/v1"; return "http://localhost:1234";
} }
QFuture<QList<QString>> LMStudioProvider::getInstalledModels(const QString &url) QFuture<QList<QString>> LMStudioProvider::getInstalledModels(const QString &url)
{ {
m_client->setUrl(url); m_client->setUrl(ensureOpenAIV1Base(url));
m_client->setApiKey(apiKey()); m_client->setApiKey(apiKey());
return m_client->listModels(); return m_client->listModels();
} }
@@ -104,6 +105,13 @@ void LMStudioProvider::prepareRequest(
} }
} }
PluginLLMCore::RequestID LMStudioProvider::sendRequest(
const QUrl &url, const QJsonObject &payload, const QString &endpoint)
{
return PluginLLMCore::Provider::sendRequest(
QUrl(ensureOpenAIV1Base(url.toString())), payload, endpoint);
}
::LLMQore::BaseClient *LMStudioProvider::client() const ::LLMQore::BaseClient *LMStudioProvider::client() const
{ {
return m_client; return m_client;

View File

@@ -30,6 +30,9 @@ public:
::LLMQore::BaseClient *client() const override; ::LLMQore::BaseClient *client() const override;
QString apiKey() const override; QString apiKey() const override;
PluginLLMCore::RequestID sendRequest(
const QUrl &url, const QJsonObject &payload, const QString &endpoint) override;
private: private:
::LLMQore::OpenAIClient *m_client; ::LLMQore::OpenAIClient *m_client;
}; };

View File

@@ -6,6 +6,7 @@
#include <LLMQore/ToolsManager.hpp> #include <LLMQore/ToolsManager.hpp>
#include "logger/Logger.hpp" #include "logger/Logger.hpp"
#include "providers/ProviderUrlUtils.hpp"
#include "settings/ChatAssistantSettings.hpp" #include "settings/ChatAssistantSettings.hpp"
#include "settings/CodeCompletionSettings.hpp" #include "settings/CodeCompletionSettings.hpp"
#include "settings/GeneralSettings.hpp" #include "settings/GeneralSettings.hpp"
@@ -112,10 +113,7 @@ void LMStudioResponsesProvider::prepareRequest(
QFuture<QList<QString>> LMStudioResponsesProvider::getInstalledModels(const QString &baseUrl) QFuture<QList<QString>> LMStudioResponsesProvider::getInstalledModels(const QString &baseUrl)
{ {
QString url = baseUrl; m_client->setUrl(ensureOpenAIV1Base(baseUrl));
if (!url.endsWith(QStringLiteral("/v1")))
url += QStringLiteral("/v1");
m_client->setUrl(url);
m_client->setApiKey(apiKey()); m_client->setApiKey(apiKey());
return m_client->listModels(); return m_client->listModels();
} }
@@ -123,9 +121,8 @@ QFuture<QList<QString>> LMStudioResponsesProvider::getInstalledModels(const QStr
PluginLLMCore::RequestID LMStudioResponsesProvider::sendRequest( PluginLLMCore::RequestID LMStudioResponsesProvider::sendRequest(
const QUrl &url, const QJsonObject &payload, const QString &endpoint) const QUrl &url, const QJsonObject &payload, const QString &endpoint)
{ {
const QString effectiveEndpoint return PluginLLMCore::Provider::sendRequest(
= endpoint.isEmpty() ? QStringLiteral("/v1/responses") : endpoint; QUrl(ensureOpenAIV1Base(url.toString())), payload, endpoint);
return PluginLLMCore::Provider::sendRequest(url, payload, effectiveEndpoint);
} }
PluginLLMCore::ProviderID LMStudioResponsesProvider::providerID() const PluginLLMCore::ProviderID LMStudioResponsesProvider::providerID() const

View File

@@ -0,0 +1,23 @@
// Copyright (C) 2024-2026 Petr Mironychev
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QString>
namespace QodeAssist::Providers {
// LM Studio presents its OpenAI-compatible API as <host>/v1/..., while the
// OpenAI-style clients expect the base URL to already include /v1. Accept the
// configured URL either with or without the /v1 suffix and return it normalized.
inline QString ensureOpenAIV1Base(const QString &url)
{
QString base = url.trimmed();
while (base.endsWith(QLatin1Char('/')))
base.chop(1);
if (!base.endsWith(QStringLiteral("/v1")))
base += QStringLiteral("/v1");
return base;
}
} // namespace QodeAssist::Providers