mikupad.html in ik_llama.cpp (functional but WIP)

This commit is contained in:
Saood Karim
2025-06-26 02:14:20 -05:00
parent 5236c98b41
commit 4c7579e617
14 changed files with 8838 additions and 2 deletions

View File

@@ -31,6 +31,21 @@
#include <signal.h>
#include <memory>
#include <src/llama-impl.h>
#include <sqlite_modern_cpp.h>
struct DatabaseHandle {
sqlite::database db;
DatabaseHandle(const std::string& path) : db(path) {
sqlite3_enable_load_extension(db.connection().get(), 1);
db << "SELECT load_extension('/home/saood06/mikupadStuff/libsqlite_zstd.so')";
db << "CREATE TABLE IF NOT EXISTS sessions (key TEXT PRIMARY KEY, data TEXT)";
db << "CREATE TABLE IF NOT EXISTS templates (key TEXT PRIMARY KEY, data TEXT)";
db << "CREATE TABLE IF NOT EXISTS names (key TEXT PRIMARY KEY, data TEXT)";
}
};
using json = nlohmann::ordered_json;
@@ -2921,6 +2936,8 @@ int main(int argc, char ** argv) {
// Necessary similarity of prompt for slot selection
ctx_server.slot_prompt_similarity = params.slot_prompt_similarity;
auto db_handle = std::make_shared<DatabaseHandle>(params.sql_save_file);
// load the model
if (!ctx_server.load_model(params)) {
state.store(SERVER_STATE_ERROR);
@@ -3748,6 +3765,101 @@ int main(int argc, char ** argv) {
};
};
const auto handle_version = [](const httplib::Request&, httplib::Response& res) {
res.set_content(json{{"version", 2}}.dump(), "application/json");
};
auto db_handler = [db_handle](auto func) {
return [func, db_handle](const httplib::Request& req, httplib::Response& res) {
res.set_header("Access-Control-Allow-Origin", "*");
try {
const json body = !req.body.empty() ? json::parse(req.body) : json::object();
func(*db_handle, body, req, res);
} catch(const std::exception& e) {
res.status = 500;
res.set_content(
json{{"ok", false}, {"message", e.what()}}.dump(),
"application/json"
);
}
};
};
const auto normalize_store_name = [](const std::string& storeName) {
if(storeName.empty()) return std::string("sessions");
std::string normalized;
normalized.reserve(storeName.size());
for(char c : storeName) {
if(std::isalpha(static_cast<unsigned char>(c))) {
normalized.push_back(std::tolower(static_cast<unsigned char>(c)));
}
}
return normalized.empty() ? "sessions" : normalized;
};
const auto get_key_string = [](const json& j) {
return j.is_string() ? j.get<std::string>() : j.dump();
};
const auto handle_load = db_handler([normalize_store_name, get_key_string](auto& db, const json& body, auto&, auto& res) {
std::string data;
const std::string store = normalize_store_name(body["storeName"]);
db.db << "SELECT data FROM " + store + " WHERE key = ?" << get_key_string(body["key"]) >> data;
if(data.empty()) {
res.status = 404;
res.set_content(json{{"ok", false}, {"message", "Key not found"}}.dump(), "application/json");
} else {
json response{{"ok", true}};
response["result"] = (store == "names") ? json(data) : json::parse(data);
res.set_content(response.dump(), "application/json");
}
});
const auto handle_save = db_handler([normalize_store_name, get_key_string](auto& db, const json& body, auto&, auto& res) {
const std::string store = normalize_store_name(body["storeName"]);
const std::string data = (store == "names") ? body["data"].get<std::string>() : body["data"].dump();
db.db << "INSERT OR REPLACE INTO " + store + " (key, data) VALUES (?, ?)" << get_key_string(body["key"]) << data;
res.set_content(json{{"ok", true}, {"result", "Data saved successfully"}}.dump(), "application/json");
});
const auto handle_rename = db_handler([get_key_string](auto& db, const json& body, auto&, auto& res) {
db.db << "UPDATE names SET data = ? WHERE key = ?"
<< body["newName"].get<std::string>()
<< get_key_string(body["key"]);
res.set_content(json{{"ok", true}, {"result", "Session renamed successfully"}}.dump(), "application/json");
});
const auto handle_all = db_handler([normalize_store_name](auto& db, const json& body, auto&, auto& res) {
json result = json::object();
db.db << "SELECT key, data FROM " + normalize_store_name(body["storeName"]) >>
[&](const std::string& key, const std::string& data) {
result[key] = json::parse(data);
};
res.set_content(json{{"ok", true}, {"result", result}}.dump(), "application/json");
});
const auto session_handler = [](auto& db, auto& res) {
json result = json::object();
db.db << "SELECT key, data FROM names" >> [&](const std::string& key, const std::string& data) {
result[key] = data;
};
res.set_content(json{{"ok", true}, {"result", result}}.dump(), "application/json");
};
const auto handle_sessions_post = db_handler([session_handler](auto& db, const json&, auto&, auto& res) { session_handler(db, res); });
const auto handle_sessions_get = db_handler([session_handler](auto& db, const json&, auto&, auto& res) { session_handler(db, res); });
const auto handle_delete = db_handler([normalize_store_name, get_key_string](auto& db, const json& body, auto&, auto& res) {
db.db << "DELETE FROM " + normalize_store_name(body["storeName"]) + " WHERE key = ?"
<< get_key_string(body["key"]);
res.set_content(json{{"ok", true}, {"result", "Session deleted successfully"}}.dump(), "application/json");
});
//
// Router
//
@@ -3811,6 +3923,17 @@ int main(int argc, char ** argv) {
svr->Post("/slots/:id_slot", handle_slots_action);
svr->Get ("/list", list_saved_prompts);
}
if (!params.sql_save_file.empty()) {
// these endpoints rely on sql_save_file existing
svr->Get ("/version", handle_version);
svr->Post("/load", handle_load);
svr->Post("/save", handle_save);
svr->Post("/rename", handle_rename);
svr->Post("/all", handle_all);
svr->Post("/sessions", handle_sessions_post);
svr->Get ("/sessions", handle_sessions_get);
svr->Post("/delete", handle_delete);
}
//
// Start the server