mirror of
https://github.com/nomic-ai/gpt4all.git
synced 2025-08-02 00:00:35 +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 <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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user