parse the JSON response

This commit is contained in:
Jared Van Bortel 2025-02-25 16:11:40 -05:00
parent b5144decde
commit 927e963076
2 changed files with 48 additions and 11 deletions

View File

@ -2,23 +2,47 @@
#include <QCoro/QCoroTask> // IWYU pragma: keep
#include <QJsonParseError>
#include <QNetworkReply>
#include <QString>
#include <QUrl>
#include <cassert>
#include <expected>
#include <utility>
#include <variant>
namespace gpt4all::backend {
struct NetErr {
QNetworkReply::NetworkError error;
QString errorString;
struct ResponseError {
private:
using ErrorCode = std::variant<
QNetworkReply::NetworkError,
QJsonParseError::ParseError
>;
public:
ErrorCode error;
QString errorString;
ResponseError(const QNetworkReply *reply)
: error(reply->error())
, errorString(reply->errorString())
{
assert(reply->error());
}
ResponseError(const QJsonParseError &err)
: error(err.error)
, errorString(err.errorString())
{
assert(err.error);
}
};
template <typename T>
using DataOrNetErr = std::expected<T, NetErr>;
using DataOrRespErr = std::expected<T, ResponseError>;
class LLMProvider {
@ -31,7 +55,7 @@ public:
void getBaseUrl(QUrl value) { m_baseUrl = std::move(value); }
/// Retrieve the Ollama version, e.g. "0.5.1"
auto getVersion() const -> QCoro::Task<DataOrNetErr<QString>>;
auto getVersion() const -> QCoro::Task<DataOrRespErr<QString>>;
private:
QUrl m_baseUrl;

View File

@ -3,9 +3,11 @@
#include <QCoro/QCoroNetworkReply> // IWYU pragma: keep
#include <QByteArray>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonObject>
#include <QJsonValue>
#include <coroutine>
#include <expected>
@ -16,15 +18,26 @@ using namespace Qt::Literals::StringLiterals;
namespace gpt4all::backend {
auto LLMProvider::getVersion() const -> QCoro::Task<DataOrNetErr<QString>>
auto LLMProvider::getVersion() const -> QCoro::Task<DataOrRespErr<QString>>
{
QNetworkAccessManager nam;
std::unique_ptr<QNetworkReply> reply(co_await nam.get(QNetworkRequest(m_baseUrl.resolved(u"/api/version"_s))));
if (auto err = reply->error())
co_return std::unexpected(NetErr{ err, reply->errorString() });
if (reply->error())
co_return std::unexpected(reply.get());
// TODO(jared): parse JSON here instead of just returning the data
co_return QString::fromUtf8(reply->readAll());
QJsonParseError error;
auto doc = QJsonDocument::fromJson(reply->readAll(), &error);
if (doc.isNull())
co_return std::unexpected(error);
assert(doc.isObject());
auto obj = doc.object();
auto version = std::as_const(obj).find("version"_L1);
assert(version != obj.constEnd());
assert(version->isString());
co_return version->toString();
}
} // namespace gpt4all::backend