mirror of
https://github.com/nomic-ai/gpt4all.git
synced 2025-08-12 13:21:58 +00:00
parse the JSON response
This commit is contained in:
parent
b5144decde
commit
927e963076
@ -2,23 +2,47 @@
|
|||||||
|
|
||||||
#include <QCoro/QCoroTask> // IWYU pragma: keep
|
#include <QCoro/QCoroTask> // IWYU pragma: keep
|
||||||
|
|
||||||
|
#include <QJsonParseError>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include <expected>
|
#include <expected>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <variant>
|
||||||
|
|
||||||
|
|
||||||
namespace gpt4all::backend {
|
namespace gpt4all::backend {
|
||||||
|
|
||||||
struct NetErr {
|
struct ResponseError {
|
||||||
QNetworkReply::NetworkError error;
|
private:
|
||||||
|
using ErrorCode = std::variant<
|
||||||
|
QNetworkReply::NetworkError,
|
||||||
|
QJsonParseError::ParseError
|
||||||
|
>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ErrorCode error;
|
||||||
QString errorString;
|
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>
|
template <typename T>
|
||||||
using DataOrNetErr = std::expected<T, NetErr>;
|
using DataOrRespErr = std::expected<T, ResponseError>;
|
||||||
|
|
||||||
|
|
||||||
class LLMProvider {
|
class LLMProvider {
|
||||||
@ -31,7 +55,7 @@ public:
|
|||||||
void getBaseUrl(QUrl value) { m_baseUrl = std::move(value); }
|
void getBaseUrl(QUrl value) { m_baseUrl = std::move(value); }
|
||||||
|
|
||||||
/// Retrieve the Ollama version, e.g. "0.5.1"
|
/// Retrieve the Ollama version, e.g. "0.5.1"
|
||||||
auto getVersion() const -> QCoro::Task<DataOrNetErr<QString>>;
|
auto getVersion() const -> QCoro::Task<DataOrRespErr<QString>>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUrl m_baseUrl;
|
QUrl m_baseUrl;
|
||||||
|
@ -3,9 +3,11 @@
|
|||||||
#include <QCoro/QCoroNetworkReply> // IWYU pragma: keep
|
#include <QCoro/QCoroNetworkReply> // IWYU pragma: keep
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QJsonDocument>
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonValue>
|
||||||
|
|
||||||
#include <coroutine>
|
#include <coroutine>
|
||||||
#include <expected>
|
#include <expected>
|
||||||
@ -16,15 +18,26 @@ using namespace Qt::Literals::StringLiterals;
|
|||||||
|
|
||||||
namespace gpt4all::backend {
|
namespace gpt4all::backend {
|
||||||
|
|
||||||
auto LLMProvider::getVersion() const -> QCoro::Task<DataOrNetErr<QString>>
|
auto LLMProvider::getVersion() const -> QCoro::Task<DataOrRespErr<QString>>
|
||||||
{
|
{
|
||||||
QNetworkAccessManager nam;
|
QNetworkAccessManager nam;
|
||||||
std::unique_ptr<QNetworkReply> reply(co_await nam.get(QNetworkRequest(m_baseUrl.resolved(u"/api/version"_s))));
|
std::unique_ptr<QNetworkReply> reply(co_await nam.get(QNetworkRequest(m_baseUrl.resolved(u"/api/version"_s))));
|
||||||
if (auto err = reply->error())
|
if (reply->error())
|
||||||
co_return std::unexpected(NetErr{ err, reply->errorString() });
|
co_return std::unexpected(reply.get());
|
||||||
|
|
||||||
// TODO(jared): parse JSON here instead of just returning the data
|
QJsonParseError error;
|
||||||
co_return QString::fromUtf8(reply->readAll());
|
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
|
} // namespace gpt4all::backend
|
||||||
|
Loading…
Reference in New Issue
Block a user