This commit is contained in:
retoor 2025-03-28 05:37:22 +01:00
parent 2834e28db2
commit 6834081960
6 changed files with 120 additions and 8 deletions

View File

@ -47,7 +47,7 @@ char * web_search(char * q){
if(!json_result){
json_object_put(json_ret);
free(ret);
return web_search_news(q);
return web_search(q);
}
json_object_put(json_ret);
return ret;

View File

@ -7,6 +7,9 @@
const char * db_file = "~/.r.db";
json_object* db_execute(const char *query);
char * db_file_expanded(){
char * expanded = expand_home_directory(db_file);
static char result[4096];
@ -51,7 +54,7 @@ json_object * db_set(const char *key, const char *value) {
return NULL;
}
char *sql = sqlite3_mprintf("INSERT INTO kv_store (key, value) VALUES (%Q, %Q)", key, value);
char *sql = sqlite3_mprintf("INSERT INTO kv_store (key, value) VALUES (%Q, %Q) ON CONFLICT(key) DO UPDATE SET value = %Q WHERE key = %Q", key, value, value,key);
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
sqlite3_free(sql);
@ -97,6 +100,11 @@ json_object* db_get(const char *key) {
json_object* db_query(const char *query) {
sqlite3 *db;
sqlite3_stmt *stmt;
if(strncmp(query, "SELECT", 6)){
return db_execute(query);
}
json_object *result = json_object_new_array();
int rc = sqlite3_open(db_file_expanded(), &db);
@ -138,4 +146,33 @@ json_object* db_query(const char *query) {
}
#endif // DB_UTILS_H
json_object* db_execute(const char *query) {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open(db_file_expanded(), &db);
json_object *result = json_object_new_object();
if (rc != SQLITE_OK) {
json_object_object_add(result, "error", json_object_new_string("Cannot open database"));
return result;
}
rc = sqlite3_exec(db, query, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
json_object_object_add(result, "error", json_object_new_string(err_msg));
sqlite3_free(err_msg);
} else {
json_object_object_add(result, "success", json_object_new_string("Query executed successfully"));
}
sqlite3_close(db);
return result;
}
char * db_get_schema(){
json_object * tables =db_query("SELECT * FROM sqlite_master WHERE type='table'");
char * result = strdup(json_object_get_string(tables));
json_object_put(tables);
return result;
}
#endif

13
main.c
View File

@ -192,7 +192,6 @@ void render(char *content)
if(SYNTAX_HIGHLIGHT_ENABLED)
{
parse_markdown_to_ansi(content);
printf("\n\n");
}else{
printf("%s", content);
}
@ -317,13 +316,17 @@ bool openai_include(char *path) {
return true;
}
void init() {
setbuf(stdout, NULL);
line_init();
auth_init();
const char *locale = setlocale(LC_ALL, NULL);
char payload[4096] = {0};
sprintf(payload, "Your locale is %s. User lang is %s.", locale, locale);
db_initialize();
char * schema = db_get_schema();
char payload[1024*1024] = {0};
sprintf(payload, "Your have a database that you can mutate using the query tool and the get and set tool. This is the schema in json format: %s. Dialect is sqlite.", schema);
free(schema);
fprintf(stderr, "%s", "Loading... ⏳");
openai_system(payload);
if(!openai_include(".rcontext.txt")){
@ -353,7 +356,7 @@ void handle_sigint(int sig) {
int main(int argc, char *argv[]) {
signal(SIGINT, handle_sigint);
db_initialize();
init();
if (try_prompt(argc, argv))
return 0;

View File

@ -114,7 +114,14 @@ void parse_markdown_to_ansi(const char *markdown) {
continue;
}else if(!strncmp(ptr, "```", 3)) {
inside_code = !inside_code;
if(inside_code){
ptr = strstr(ptr, "\n") + 1;
}else{
ptr+=3;
}
if(*ptr == '\0'){
break;
}
}
if (inside_code) {

BIN
rpylib.so

Binary file not shown.

65
tools.h
View File

@ -44,6 +44,7 @@ struct json_object* tool_description_db_set();
struct json_object* tool_description_db_query();
struct json_object* tool_description_db_get();
struct json_object* tool_description_web_search_news();
struct json_object* tool_description_web_search();
struct json_object* tools_descriptions() {
struct json_object* root = json_object_new_array();
@ -61,6 +62,7 @@ struct json_object* tools_descriptions() {
json_object_array_add(root, tool_description_db_query());
json_object_array_add(root, tool_description_db_get());
json_object_array_add(root, tool_description_web_search_news());
json_object_array_add(root, tool_description_web_search());
return root;
}
@ -111,6 +113,57 @@ struct json_object* tool_description_web_search_news() {
return root;
}
char* tool_function_web_search(char* query) {
if (query == NULL) {
return strdup("Query cannot be NULL.");
}
char* result = web_search_news(query);
if (result == NULL) {
return strdup("Failed to fetch news.");
}
return result;
}
struct json_object* tool_description_web_search() {
struct json_object* root = json_object_new_object();
json_object_object_add(root, "type", json_object_new_string("function"));
struct json_object* function = json_object_new_object();
json_object_object_add(function, "name", json_object_new_string("web_search"));
json_object_object_add(function, "description", json_object_new_string("Searches for information based on a query using search engines like google."));
struct json_object* parameters = json_object_new_object();
json_object_object_add(parameters, "type", json_object_new_string("object"));
struct json_object* properties = json_object_new_object();
struct json_object* query = json_object_new_object();
json_object_object_add(query, "type", json_object_new_string("string"));
json_object_object_add(query, "description", json_object_new_string("The url encoded query string to search for information."));
json_object_object_add(properties, "query", query);
json_object_object_add(parameters, "properties", properties);
struct json_object* required = json_object_new_array();
json_object_array_add(required, json_object_new_string("query"));
json_object_object_add(parameters, "required", required);
json_object_object_add(parameters, "additionalProperties", json_object_new_boolean(0));
json_object_object_add(function, "parameters", parameters);
json_object_object_add(function, "strict", json_object_new_boolean(1));
json_object_object_add(root, "function", function);
return root;
}
char* tool_function_db_get(char* key) {
json_object* result = db_get(key);
@ -1070,6 +1123,18 @@ struct json_object* tools_execute(struct json_object* tools_array) {
free(news_result);
}
}
}else if (!strcmp(function_name, "web_search")){
struct json_object* arguments_obj;
if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) {
struct json_object* arguments = json_tokener_parse(json_object_get_string(arguments_obj));
struct json_object* query_obj;
if (json_object_object_get_ex(arguments, "query", &query_obj)) {
char* query = (char*)json_object_get_string(query_obj);
char* news_result = tool_function_web_search(query);
json_object_object_add(tool_result, "content", json_object_new_string(news_result));
free(news_result);
}
}
}else if (!strcmp(function_name, "db_get")) {
struct json_object* arguments_obj;
if (json_object_object_get_ex(function_obj, "arguments", &arguments_obj)) {