From 13d50fcd13b96a22290ea9b20d7884e56e08ba98 Mon Sep 17 00:00:00 2001 From: retoor Date: Wed, 14 May 2025 05:23:36 +0200 Subject: [PATCH] Python execute. --- Makefile | 9 +- main.c | 442 +++++++++++++++++++++++++----------------------------- rpylib.so | Bin 90008 -> 98520 bytes tools.h | 155 ++++++++++++++++--- 4 files changed, 345 insertions(+), 261 deletions(-) diff --git a/Makefile b/Makefile index 49e0b92..e3b9037 100644 --- a/Makefile +++ b/Makefile @@ -65,4 +65,11 @@ docker_run: docker run -v .:/app --rm -it r build_deb: - dpkg-deb --build r_package \ No newline at end of file + dpkg-deb --build r_package + +# --- RAG Side Project --- +rag_test: rag_test.c rag.c db_utils.c rag.h db_utils.h + $(CC) -o rag_test rag_test.c rag.c db_utils.c -lsqlite3 -ljson-c + +run_rag_test: rag_test + ./rag_test diff --git a/main.c b/main.c index ed0bc46..e43045b 100644 --- a/main.c +++ b/main.c @@ -1,12 +1,4 @@ #include "r.h" -#include -#include -#include -#include -#include -#include -#include - #include "db_utils.h" #include "line.h" #include "markdown.h" @@ -14,255 +6,231 @@ #include "tools.h" #include "utils.h" +#include +#include +#include +#include +#include +#include +#include +#include + volatile sig_atomic_t sigint_count = 0; time_t first_sigint_time = 0; bool SYNTAX_HIGHLIGHT_ENABLED = true; bool API_MODE = false; -void help(); -void render(const char *); -bool openai_include(const char *); -char *strreplace(const char *, const char *, const char *); +static void render(const char *content); +static bool openai_include(const char *path); +static char *get_prompt_from_stdin(char *prompt); +static char *get_prompt_from_args(int argc, char **argv); +static bool try_prompt(int argc, char *argv[]); +static void repl(void); +static void init(void); +static void handle_sigint(int sig); -char *get_prompt_from_stdin(char *prompt) { - int index = 0; - char c; - while ((c = getchar()) != EOF) { - prompt[index++] = c; - } - prompt[index] = '\0'; - return prompt; +static char *get_prompt_from_stdin(char *prompt) { + int index = 0; + int c; + while ((c = getchar()) != EOF) { + prompt[index++] = (char)c; + } + prompt[index] = '\0'; + return prompt; } -char *get_prompt_from_args(int argc, char **argv) { - char *prompt = malloc(10 * 1024 * 1024 + 1); - char *system = malloc(1024 * 1024); - if (!prompt || !system) { - fprintf(stderr, "Error: Memory allocation failed.\n"); - free(prompt); - free(system); - return NULL; - } - - bool get_from_std_in = false; - - for (int i = 1; i < argc; i++) { - if (strcmp(argv[i], "--stdin") == 0) { - fprintf(stderr, "Reading from stdin.\n"); - get_from_std_in = true; - } else if (strcmp(argv[i], "--verbose") == 0) { - is_verbose = true; - } else if (strcmp(argv[i], "--py") == 0 && i + 1 < argc) { - char *py_file_path = expand_home_directory(argv[++i]); - fprintf(stderr, "Including \"%s\".\n", py_file_path); - openai_include(py_file_path); - free(py_file_path); - } else if (strcmp(argv[i], "--free") == 0) { - auth_free(); - } else if (strcmp(argv[i], "--context") == 0 && i + 1 < argc) { - char *context_file_path = argv[++i]; - fprintf(stderr, "Including \"%s\".\n", context_file_path); - openai_include(context_file_path); - } else if (strcmp(argv[i], "--api") == 0) { - API_MODE = true; - } else if (strcmp(argv[i], "--nh") == 0) { - SYNTAX_HIGHLIGHT_ENABLED = false; - fprintf(stderr, "Syntax highlighting disabled.\n"); - } else { - strcat(system, argv[i]); - strcat(system, (i < argc - 1) ? " " : "."); +static char *get_prompt_from_args(int argc, char **argv) { + char *prompt = malloc(10 * 1024 * 1024 + 1); + char *system = malloc(1024 * 1024); + if (!prompt || !system) { + fprintf(stderr, "Error: Memory allocation failed.\n"); + free(prompt); + free(system); + return NULL; } - } - if (get_from_std_in) { - if (*system) - openai_system(system); - prompt = get_prompt_from_stdin(prompt); - } else { - free(prompt); - prompt = system; - } + bool get_from_std_in = false; - if (!*prompt) { - free(prompt); - return NULL; - } - return prompt; -} - -bool try_prompt(int argc, char *argv[]) { - char *prompt = get_prompt_from_args(argc, argv); - if (prompt) { - char *response = openai_chat("user", prompt); - if (!response) { - printf("Could not get response from server\n"); - free(prompt); - return false; - } - render(response); - free(response); - free(prompt); - return true; - } - return false; -} - -char **get_parameters(const char *content, const char *delimiter) { - char *start = NULL; - char **parameters = NULL; - int count = 0; - - while ((start = strstr(content, delimiter)) != NULL) { - start += 3; - char *end = strstr(start, delimiter); - char *parameter = malloc(end - start + 1); - - memcpy(parameter, start, end - start); - parameter[end - start] = '\0'; - - content = end + 3; - count++; - parameters = realloc(parameters, sizeof(char *) * (count + 1)); - parameters[count - 1] = parameter; - parameters[count] = NULL; - } - - return parameters; -} - -void render(const char *content) { - if (SYNTAX_HIGHLIGHT_ENABLED) { - parse_markdown_to_ansi(content); - } else { - printf("%s", content); - } -} - -void repl() { - line_init(); - char *line = NULL; - - while (true) { - line = line_read("> "); - if (!line || !*line) - continue; - - if (!strncmp(line, "!dump", 5)) { - printf("%s\n", message_json()); - continue; - } - if (!strncmp(line, "!verbose", 8)) { - is_verbose = !is_verbose; - fprintf(stderr, "%s\n", - is_verbose ? "Verbose mode enabled" : "Verbose mode disabled"); - continue; - } - if (line && *line != '\n') - line_add_history(line); - if (!strncmp(line, "!tools", 6)) { - printf("Available tools: %s\n", - json_object_to_json_string(tools_descriptions())); - continue; - } - if (!strncmp(line, "!models", 7)) { - printf("Current model: %s\n", openai_fetch_models()); - continue; - } - if (!strncmp(line, "!model", 6)) { - if (line[6] == ' ') { - set_prompt_model(line + 7); - } - printf("Current model: %s\n", get_prompt_model()); - continue; - } - if (!strncmp(line, "exit", 4)) - exit(0); - - while (line && *line != '\n') { - char *response = openai_chat("user", line); - if (response) { - render(response); - printf("\n"); - if (strstr(response, "_STEP_")) { - line = "continue"; + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--stdin") == 0) { + fprintf(stderr, "Reading from stdin.\n"); + get_from_std_in = true; + } else if (strcmp(argv[i], "--verbose") == 0) { + is_verbose = true; + } else if (strcmp(argv[i], "--py") == 0 && i + 1 < argc) { + char *py_file_path = expand_home_directory(argv[++i]); + fprintf(stderr, "Including \"%s\".\n", py_file_path); + openai_include(py_file_path); + free(py_file_path); + } else if (strcmp(argv[i], "--free") == 0) { + auth_free(); + } else if (strcmp(argv[i], "--context") == 0 && i + 1 < argc) { + char *context_file_path = argv[++i]; + fprintf(stderr, "Including \"%s\".\n", context_file_path); + openai_include(context_file_path); + } else if (strcmp(argv[i], "--api") == 0) { + API_MODE = true; + } else if (strcmp(argv[i], "--nh") == 0) { + SYNTAX_HIGHLIGHT_ENABLED = false; + fprintf(stderr, "Syntax highlighting disabled.\n"); } else { - line = NULL; + strcat(system, argv[i]); + strcat(system, (i < argc - 1) ? " " : "."); } - free(response); - } else { - exit(0); - } } - } -} -char *strreplace(const char *content, const char *what, const char *with) { - char *pos = strstr(content, what); - if (!pos) - return strdup(content); - - size_t result_size = strlen(content) + strlen(with) - strlen(what) + 1; - char *result = malloc(result_size); - snprintf(result, result_size, "%.*s%s%s", (int)(pos - content), content, with, - pos + strlen(what)); - return result; -} - -bool openai_include(const char *path) { - char *file_content = read_file(path); - if (!file_content) - return false; - - openai_system(file_content); - free(file_content); - return true; -} - -void init() { - setbuf(stdout, NULL); - line_init(); - auth_init(); - db_initialize(); - char *schema = db_get_schema(); - char payload[1024 * 1024] = {0}; - snprintf(payload, sizeof(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, "Loading... 4e6"); - openai_system(payload); - if (!openai_include(".rcontext.txt")) { - openai_include("~/.rcontext.txt"); - } - fprintf(stderr, "\r \r"); -} - -void handle_sigint(int sig) { - time_t current_time = time(NULL); - printf("\n"); - if (sigint_count == 0) { - first_sigint_time = current_time; - sigint_count++; - } else { - if (difftime(current_time, first_sigint_time) <= 1) { - exit(0); + if (get_from_std_in) { + if (*system) + openai_system(system); + prompt = get_prompt_from_stdin(prompt); } else { - sigint_count = 1; - first_sigint_time = current_time; + free(prompt); + prompt = system; + } + + if (!*prompt) { + free(prompt); + return NULL; + } + return prompt; +} + +static bool try_prompt(int argc, char *argv[]) { + char *prompt = get_prompt_from_args(argc, argv); + if (prompt) { + char *response = openai_chat("user", prompt); + if (!response) { + printf("Could not get response from server\n"); + free(prompt); + return false; + } + render(response); + free(response); + free(prompt); + return true; + } + return false; +} + +static bool openai_include(const char *path) { + char *file_content = read_file(path); + if (!file_content) + return false; + + openai_system(file_content); + free(file_content); + return true; +} + +static void render(const char *content) { + if (SYNTAX_HIGHLIGHT_ENABLED) { + parse_markdown_to_ansi(content); + } else { + printf("%s", content); + } +} + +static void repl(void) { + line_init(); + char *line = NULL; + + while (true) { + line = line_read("> "); + if (!line || !*line) + continue; + + if (!strncmp(line, "!dump", 5)) { + printf("%s\n", message_json()); + continue; + } + if (!strncmp(line, "!verbose", 8)) { + is_verbose = !is_verbose; + fprintf(stderr, "%s\n", is_verbose ? "Verbose mode enabled" : "Verbose mode disabled"); + continue; + } + if (line && *line != '\n') + line_add_history(line); + if (!strncmp(line, "!tools", 6)) { + printf("Available tools: %s\n", json_object_to_json_string(tools_descriptions())); + continue; + } + if (!strncmp(line, "!models", 7)) { + printf("Current model: %s\n", openai_fetch_models()); + continue; + } + if (!strncmp(line, "!model", 6)) { + if (line[6] == ' ') { + set_prompt_model(line + 7); + } + printf("Current model: %s\n", get_prompt_model()); + continue; + } + if (!strncmp(line, "exit", 4)) + exit(0); + + while (line && *line != '\n') { + char *response = openai_chat("user", line); + if (response) { + render(response); + printf("\n"); + if (strstr(response, "_STEP_")) { + line = "continue"; + } else { + line = NULL; + } + free(response); + } else { + exit(0); + } + } + } +} + +static void init(void) { + setbuf(stdout, NULL); + line_init(); + auth_init(); + db_initialize(); + char *schema = db_get_schema(); + char payload[1024 * 1024] = {0}; + snprintf(payload, sizeof(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, "Loading... 📨"); + openai_system(payload); + if (!openai_include(".rcontext.txt")) { + openai_include("~/.rcontext.txt"); + } + fprintf(stderr, "\r \r"); +} + +static void handle_sigint(int sig) { + time_t current_time = time(NULL); + printf("\n"); + if (sigint_count == 0) { + first_sigint_time = current_time; + sigint_count++; + } else { + if (difftime(current_time, first_sigint_time) <= 1) { + exit(0); + } else { + sigint_count = 1; + first_sigint_time = current_time; + } } - } } int main(int argc, char *argv[]) { - signal(SIGINT, handle_sigint); + signal(SIGINT, handle_sigint); - init(); - if (try_prompt(argc, argv)) + init(); + if (try_prompt(argc, argv)) + return 0; + + repl(); return 0; - - repl(); - return 0; } diff --git a/rpylib.so b/rpylib.so index 99c35290b007da1712ae4e2bd5eca30af89fca42..eedf29de95f804e3a985ac9e30a4ca9e45510d21 100755 GIT binary patch literal 98520 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 literal 90008 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%0DD96?C;G-I$QxC4Z-FX!L#$`>Rw3 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", tmp_file); + + FILE *proc = popen(command, "r"); + if (!proc) { + unlink(tmp_file); + return strdup("Failed to execute python3."); + } + char buffer[1024]; + size_t total = 0; + char *output = NULL; + while (fgets(buffer, sizeof(buffer), proc)) { + size_t len = strlen(buffer); + char *new_output = realloc(output, total + len + 1); + if (!new_output) { + free(output); + pclose(proc); + unlink(tmp_file); + return strdup("Memory allocation failed."); + } + output = new_output; + strcpy(output + total, buffer); + total += len; + } + if (output) + output[total] = 0; + else + output = strdup(""); + pclose(proc); + unlink(tmp_file); + return output; +} + +struct json_object *tool_description_python_execute() { + 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("python_execute")); + json_object_object_add(function, "description", json_object_new_string("Executes Python source code using the python3 interpreter and returns stdout/stderr.")); + + 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 *source = json_object_new_object(); + json_object_object_add(source, "type", json_object_new_string("string")); + json_object_object_add(source, "description", json_object_new_string("Python source code to execute.")); + json_object_object_add(properties, "source", source); + + json_object_object_add(parameters, "properties", properties); + + struct json_object *required = json_object_new_array(); + json_object_array_add(required, json_object_new_string("source")); + 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(root, "function", function); + + return root; +} +// ---- END PYTHON EXECUTE TOOL ---- + char *tool_function_getpwd() { char *cwd = (char *)malloc(PATH_MAX); if (cwd == NULL) { @@ -555,10 +646,9 @@ struct json_object *tool_description_linux_terminal_interactive() { struct json_object *properties = json_object_new_object(); struct json_object *path = json_object_new_object(); json_object_object_add(path, "type", json_object_new_string("string")); - json_object_object_add( - path, "description", - json_object_new_string( - "Executable with parameters to execute interactively.")); + json_object_object_add(path, "description", + json_object_new_string( + "Executable with parameters to execute interactively.")); json_object_object_add(properties, "command", path); json_object_object_add(parameters, "properties", properties); @@ -725,7 +815,10 @@ struct json_object *tool_description_write_file() { } char *tool_function_index_source_directory(char *path) { - return index_directory(path); + char * result = index_directory(path); + if(!result) + return strdup("Failed to index directory!"); + return result; } char *tool_function_mkdir(char *path); @@ -1113,29 +1206,33 @@ struct json_object *tool_description_linux_terminal() { } char *tool_function_mkdir(char *path) { - char temp[2048]; - char *p = NULL; - size_t len; + char temp[2048]; + char *p = NULL; + size_t len; - snprintf(temp, sizeof(temp), "%s", path); - len = strlen(temp); + snprintf(temp, sizeof(temp), "%s", path); + len = strlen(temp); - if (temp[len - 1] == '/') { - temp[len - 1] = '\0'; - } - - for (p = temp + 1; *p; p++) { - if (*p == '/') { - *p = '\0'; - if (mkdir(temp, 0777) != 0 && errno != EEXIST) { - return strdup("Failed to create directory!"); - } - *p = '/'; + if (temp[len - 1] == '/') { + temp[len - 1] = '\0'; } - } - return strdup("Directory successfully created."); + + for (p = temp + 1; *p; p++) { + if (*p == '/') { + *p = '\0'; + if (mkdir(temp, 0777) != 0 && errno != EEXIST) { + return strdup("Failed to create directory!"); + } + *p = '/'; + } + } + if (mkdir(temp, 0777) != 0 && errno != EEXIST) { + return strdup("Failed to create directory!"); + } + return strdup("Directory successfully created."); } + struct json_object *tool_description_mkdir() { struct json_object *root = json_object_new_object(); json_object_object_add(root, "type", json_object_new_string("function")); @@ -1462,6 +1559,18 @@ struct json_object *tools_execute(struct json_object *tools_array) { free(mkdir_result); } } + } else if (!strcmp(function_name, "python_execute")) { + 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 *source_obj; + if (json_object_object_get_ex(arguments, "source", &source_obj)) { + char *source = (char *)json_object_get_string(source_obj); + char *result = tool_function_python_execute(source); + json_object_object_add(tool_result, "content", json_object_new_string(result)); + free(result); + } + } } else { fprintf(stderr, "Unknown function: %s\n", function_name); json_object_object_add(